diff --git a/src/pc/djui/djui.h b/src/pc/djui/djui.h index 2c49cf102..fb0db8f59 100644 --- a/src/pc/djui/djui.h +++ b/src/pc/djui/djui.h @@ -23,11 +23,13 @@ #include "djui_button.h" #include "djui_flow_layout.h" #include "djui_slider.h" +#include "djui_checkbox.h" #include "djui_panel.h" #include "djui_panel_debug.h" #include "djui_panel_main.h" #include "djui_panel_options.h" +#include "djui_panel_camera.h" #include "djui_panel_sound.h" #include "djui_panel_quit.h" diff --git a/src/pc/djui/djui_checkbox.c b/src/pc/djui/djui_checkbox.c new file mode 100644 index 000000000..27bb2472b --- /dev/null +++ b/src/pc/djui/djui_checkbox.c @@ -0,0 +1,87 @@ +#include "djui.h" + +static void djui_checkbox_set_default_style(struct DjuiBase* base) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + djui_base_set_border_color(&checkbox->rect->base, 173, 173, 173, 255); + djui_base_set_color(&checkbox->rect->base, 0, 0, 0, 0); + djui_base_set_color(&checkbox->text->base, 200, 200, 200, 255); + djui_base_set_color(&checkbox->rectValue->base, 200, 200, 200, 255); +} + +static void djui_checkbox_on_hover(struct DjuiBase* base) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + djui_base_set_border_color(&checkbox->rect->base, 0, 120, 215, 255); + djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255); + djui_base_set_color(&checkbox->rectValue->base, 229, 241, 251, 255); +} + +static void djui_checkbox_on_hover_end(struct DjuiBase* base) { + djui_checkbox_set_default_style(base); +} + +static void djui_checkbox_on_cursor_down_begin(struct DjuiBase* base, bool inputCursor) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + djui_base_set_border_color(&checkbox->rect->base, 20, 170, 255, 255); + djui_base_set_color(&checkbox->rect->base, 255, 255, 255, 32); + djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255); + djui_base_set_color(&checkbox->rectValue->base, 255, 255, 255, 255); + *checkbox->value = !(*checkbox->value); + djui_base_set_visible(&checkbox->rectValue->base, *checkbox->value); +} + +static void djui_checkbox_on_cursor_down_end(struct DjuiBase* base) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + djui_checkbox_set_default_style(base); +} + +static void djui_checkbox_on_focus_begin(struct DjuiBase* base) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + djui_base_set_border_color(&checkbox->rect->base, 20, 170, 255, 255); + djui_base_set_color(&checkbox->rect->base, 255, 255, 255, 32); + djui_base_set_color(&checkbox->text->base, 229, 241, 251, 255); + djui_base_set_color(&checkbox->rectValue->base, 255, 255, 255, 255); +} + +static void djui_checkbox_destroy(struct DjuiBase* base) { + struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; + free(checkbox); +} + +struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* message, bool* value) { + struct DjuiCheckbox* checkbox = malloc(sizeof(struct DjuiCheckbox)); + struct DjuiBase* base = &checkbox->base; + + checkbox->value = value; + + djui_base_init(parent, base, NULL, djui_checkbox_destroy); + djui_interactable_create(base); + djui_interactable_hook_hover(base, djui_checkbox_on_hover, djui_checkbox_on_hover_end); + djui_interactable_hook_cursor_down(base, djui_checkbox_on_cursor_down_begin, NULL, djui_checkbox_on_cursor_down_end); + + struct DjuiText* text = djui_text_create(&checkbox->base, message); + djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&text->base, 0.5f, 1.0f); + djui_text_set_alignment(text, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM); + djui_text_set_drop_shadow(text, 120, 120, 120, 64); + checkbox->text = text; + + struct DjuiRect* rect = djui_rect_create(&checkbox->base); + djui_base_set_alignment(&rect->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&rect->base, DJUI_SVT_ASPECT_RATIO, DJUI_SVT_RELATIVE); + djui_base_set_size(&rect->base, 1.0f, 1.0f); + djui_base_set_color(&rect->base, 0, 0, 0, 0); + djui_base_set_border_width(&rect->base, 2); + checkbox->rect = rect; + + struct DjuiRect* rectValue = djui_rect_create(&rect->base); + djui_base_set_size_type(&rectValue->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&rectValue->base, 0.8f, 0.8f); + djui_base_set_alignment(&rectValue->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_base_set_visible(&rectValue->base, *value); + checkbox->rectValue = rectValue; + + djui_checkbox_set_default_style(base); + + return checkbox; +} diff --git a/src/pc/djui/djui_checkbox.h b/src/pc/djui/djui_checkbox.h new file mode 100644 index 000000000..10ef01cf0 --- /dev/null +++ b/src/pc/djui/djui_checkbox.h @@ -0,0 +1,13 @@ +#pragma once +#include "djui.h" + +#pragma pack(1) +struct DjuiCheckbox { + struct DjuiBase base; + struct DjuiRect* rect; + struct DjuiRect* rectValue; + struct DjuiText* text; + bool* value; +}; + +struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* message, bool* value); diff --git a/src/pc/djui/djui_cursor.c b/src/pc/djui/djui_cursor.c index 9b959f4f3..fa5baddbc 100644 --- a/src/pc/djui/djui_cursor.c +++ b/src/pc/djui/djui_cursor.c @@ -128,7 +128,7 @@ void djui_cursor_update(void) { djui_base_set_location(&sMouseCursor->base, gCursorX - 13, gCursorY - 13); // set cursor sprite - if (mouse_window_buttons & 0b0001) { + if ((gInteractablePad.button & PAD_BUTTON_A) || (mouse_window_buttons & MOUSE_BUTTON_1)) { djui_image_set_image(sMouseCursor, texture_hand_closed, 32, 32, 16); } else { djui_image_set_image(sMouseCursor, texture_hand_open, 32, 32, 16); diff --git a/src/pc/djui/djui_interactable.c b/src/pc/djui/djui_interactable.c index 4cfd7408c..a7ef09139 100644 --- a/src/pc/djui/djui_interactable.c +++ b/src/pc/djui/djui_interactable.c @@ -6,11 +6,6 @@ #include "src/pc/controller/controller_mouse.h" #include "src/pc/controller/controller_keyboard.h" -#define PAD_BUTTON_A ((u16)(1 << 15)) -#define PAD_BUTTON_B ((u16)(1 << 14)) - -#define MOUSE_BUTTON_1 ((u16)(1 << 0)) - #define SCANCODE_UP 328 #define SCANCODE_DOWN 336 #define SCANCODE_LEFT 331 diff --git a/src/pc/djui/djui_interactable.h b/src/pc/djui/djui_interactable.h index 19e04bde6..d08f9e313 100644 --- a/src/pc/djui/djui_interactable.h +++ b/src/pc/djui/djui_interactable.h @@ -2,6 +2,11 @@ #include "djui.h" #include "djui_base.h" +#define PAD_BUTTON_A ((u16)(1 << 15)) +#define PAD_BUTTON_B ((u16)(1 << 14)) + +#define MOUSE_BUTTON_1 ((u16)(1 << 0)) + #pragma pack(1) struct DjuiInteractable { bool enabled; diff --git a/src/pc/djui/djui_panel.c b/src/pc/djui/djui_panel.c index 8481da34a..bfcbe78ac 100644 --- a/src/pc/djui/djui_panel.c +++ b/src/pc/djui/djui_panel.c @@ -108,4 +108,19 @@ void djui_panel_update(void) { activeBase->y.value = moveMax * smoothstep(0, moveMax, sMoveAmount) - moveMax; parentBase->y.value = activeBase->y.value + moveMax; } +} + +void djui_panel_shutdown(void) { + struct DjuiPanel* panel = sPanelList; + while (panel != NULL) { + struct DjuiPanel* next = panel->parent; + djui_base_destroy(panel->base); + free(panel); + panel = next; + } + + sPanelList = NULL; + sPanelRemoving = NULL; + sMoveAmount = 0; + } \ No newline at end of file diff --git a/src/pc/djui/djui_panel.h b/src/pc/djui/djui_panel.h index 71d5035fc..621cd709e 100644 --- a/src/pc/djui/djui_panel.h +++ b/src/pc/djui/djui_panel.h @@ -4,3 +4,4 @@ void djui_panel_add(struct DjuiBase* caller, struct DjuiBase* panelBase, struct DjuiBase* defaultElementBase); void djui_panel_back(void); void djui_panel_update(void); +void djui_panel_shutdown(void); diff --git a/src/pc/djui/djui_panel_camera.c b/src/pc/djui/djui_panel_camera.c new file mode 100644 index 000000000..df330783e --- /dev/null +++ b/src/pc/djui/djui_panel_camera.c @@ -0,0 +1,86 @@ +#include "djui.h" +#include "src/pc/utils/misc.h" +#include "src/pc/configfile.h" + +static void djui_panel_camera_back(struct DjuiBase* base) { + djui_panel_back(); +} + +void djui_panel_camera_create(struct DjuiBase* caller) { + f32 bodyHeight = 32 * 10 + 64 * 1 + 16 * 10; + + struct DjuiCheckbox* checkbox1 = NULL; + + struct DjuiThreePanel* panel = djui_three_panel_create(&gDjuiRoot->base, 64, bodyHeight, 0); + djui_base_set_size_type(&panel->base, DJUI_SVT_ABSOLUTE, DJUI_SVT_RELATIVE); + djui_base_set_size(&panel->base, 340.0f + (16 * 2.0f), 1.0f); + djui_base_set_color(&panel->base, 0, 0, 0, 240); + djui_base_set_border_color(&panel->base, 0, 0, 0, 200); + djui_base_set_border_width(&panel->base, 8); + djui_base_set_padding(&panel->base, 16, 16, 16, 16); + { + struct DjuiText* header = djui_text_create(&panel->base, "\\#ff0800\\C\\#1be700\\A\\#00b3ff\\M\\#ffef00\\E\\#ff0800\\R\\#1be700\\A"); + djui_base_set_size_type(&header->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&header->base, 1.0f, 1.0f); + djui_base_set_color(&header->base, 255, 8, 0, 255); + djui_text_set_alignment(header, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_font(header, &gDjuiFonts[1]); + djui_text_set_font_scale(header, gDjuiFonts[1].defaultFontScale); + + struct DjuiFlowLayout* body = djui_flow_layout_create(&panel->base); + djui_base_set_alignment(&body->base, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_base_set_size_type(&body->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&body->base, 1.0f, bodyHeight); + djui_base_set_color(&body->base, 0, 0, 0, 0); + djui_flow_layout_set_margin(body, 16); + djui_flow_layout_set_flow_direction(body, DJUI_FLOW_DIR_DOWN); + { + checkbox1 = djui_checkbox_create(&body->base, "Free Camera", &configEnableCamera); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Analog Camera", &configCameraAnalog); + djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox2->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Mouse Look", &configCameraMouse); + djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox3->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox4 = djui_checkbox_create(&body->base, "Invert X", &configCameraInvertX); + djui_base_set_size_type(&checkbox4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox4->base, 1.0f, 32); + + struct DjuiCheckbox* checkbox5 = djui_checkbox_create(&body->base, "Invert Y", &configCameraInvertY); + djui_base_set_size_type(&checkbox5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox5->base, 1.0f, 32); + + struct DjuiSlider* slider1 = djui_slider_create(&body->base, "X Sensitivity", &configCameraXSens, 1, 100); + djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider1->base, 1.0f, 32); + + struct DjuiSlider* slider2 = djui_slider_create(&body->base, "Y Sensitivity", &configCameraYSens, 1, 100); + djui_base_set_size_type(&slider2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider2->base, 1.0f, 32); + + struct DjuiSlider* slider3 = djui_slider_create(&body->base, "Aggression", &configCameraAggr, 0, 100); + djui_base_set_size_type(&slider3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider3->base, 1.0f, 32); + + struct DjuiSlider* slider4 = djui_slider_create(&body->base, "Pan Level", &configCameraPan, 0, 100); + djui_base_set_size_type(&slider4->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider4->base, 1.0f, 32); + + struct DjuiSlider* slider5 = djui_slider_create(&body->base, "Deceleration", &configCameraDegrade, 0, 100); + djui_base_set_size_type(&slider5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&slider5->base, 1.0f, 32); + + struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button6->base, 1.0f, 64); + button6->base.interactable->on_click = djui_panel_camera_back; + } + } + + djui_panel_add(caller, &panel->base, &checkbox1->base); +} diff --git a/src/pc/djui/djui_panel_camera.h b/src/pc/djui/djui_panel_camera.h new file mode 100644 index 000000000..134361e0d --- /dev/null +++ b/src/pc/djui/djui_panel_camera.h @@ -0,0 +1,4 @@ +#pragma once +#include "djui.h" + +void djui_panel_camera_create(struct DjuiBase* caller); diff --git a/src/pc/djui/djui_panel_main.c b/src/pc/djui/djui_panel_main.c index 2dec533f2..8c46ca1e4 100644 --- a/src/pc/djui/djui_panel_main.c +++ b/src/pc/djui/djui_panel_main.c @@ -1,6 +1,12 @@ #include "djui.h" #include "src/pc/controller/controller_sdl.h" +static void djui_panel_main_close(struct DjuiBase* caller) { + gInteractableOverridePad = false; + djui_panel_shutdown(); + djui_cursor_set_visible(false); +} + void djui_panel_main_create(struct DjuiBase* caller) { f32 bodyHeight = 64 * 4 + 16 * 3; @@ -31,6 +37,7 @@ void djui_panel_main_create(struct DjuiBase* caller) { djui_base_set_size_type(&buttonHost->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&buttonHost->base, 1.0f, 64); djui_cursor_input_controlled_center(&buttonHost->base); + buttonHost->base.interactable->on_click = djui_panel_main_close; struct DjuiButton* button2 = djui_button_create(&body->base, "Join"); djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); diff --git a/src/pc/djui/djui_panel_options.c b/src/pc/djui/djui_panel_options.c index f2c0b5b91..c8a4503cb 100644 --- a/src/pc/djui/djui_panel_options.c +++ b/src/pc/djui/djui_panel_options.c @@ -41,6 +41,7 @@ void djui_panel_options_create(struct DjuiBase* caller) { struct DjuiButton* button2 = djui_button_create(&body->base, "Camera"); djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&button2->base, 1.0f, 64); + button2->base.interactable->on_click = djui_panel_camera_create; struct DjuiButton* button3 = djui_button_create(&body->base, "Controls"); djui_base_set_size_type(&button3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);