diff --git a/src/pc/djui/djui_base.c b/src/pc/djui/djui_base.c index c29d790e7..56203073e 100644 --- a/src/pc/djui/djui_base.c +++ b/src/pc/djui/djui_base.c @@ -14,6 +14,9 @@ void djui_base_set_enabled(struct DjuiBase* base, bool enabled) { if (base->interactable != NULL && base->interactable->on_enabled_change != NULL) { base->interactable->on_enabled_change(base); } + if (base->interactable != NULL && base->interactable->update_style != NULL) { + base->interactable->update_style(base); + } } void djui_base_set_location(struct DjuiBase* base, f32 x, f32 y) { diff --git a/src/pc/djui/djui_button.c b/src/pc/djui/djui_button.c index 65c0cb75a..d91523dec 100644 --- a/src/pc/djui/djui_button.c +++ b/src/pc/djui/djui_button.c @@ -1,39 +1,33 @@ #include "djui.h" -static void djui_button_set_default_style(struct DjuiBase* base) { +static void djui_button_update_style(struct DjuiBase* base) { struct DjuiButton* button = (struct DjuiButton*)base; - u8 borderBrightness = button->style ? 100 : 150; - u8 rectBrightness = button->style ? 150 : 222; - djui_base_set_border_color(base, borderBrightness, borderBrightness, borderBrightness, 255); - djui_base_set_color(&button->rect->base, rectBrightness, rectBrightness, rectBrightness, 255); - djui_base_set_location(&button->text->base, 0.0f, 0.0f); + if (!button->base.enabled) { + u8 borderBrightness = button->style ? 50 : 75; + u8 rectBrightness = button->style ? 75 : 111; + djui_base_set_border_color(base, borderBrightness, borderBrightness, borderBrightness, 255); + djui_base_set_color(&button->rect->base, rectBrightness, rectBrightness, rectBrightness, 255); + djui_base_set_location(&button->text->base, 0.0f, 0.0f); + } else if (gDjuiCursorDownOn == base) { + djui_base_set_border_color(base, 0, 84, 153, 255); + djui_base_set_color(&button->rect->base, 204, 228, 247, 255); + djui_base_set_location(&button->text->base, 0.5f, 0.5f); + } else if (gDjuiHovered == base) { + djui_base_set_border_color(base, 0, 120, 215, 255); + djui_base_set_color(&button->rect->base, 229, 241, 251, 255); + djui_base_set_location(&button->text->base, -0.5f, -1.0f); + } else { + u8 borderBrightness = button->style ? 100 : 150; + u8 rectBrightness = button->style ? 150 : 222; + djui_base_set_border_color(base, borderBrightness, borderBrightness, borderBrightness, 255); + djui_base_set_color(&button->rect->base, rectBrightness, rectBrightness, rectBrightness, 255); + djui_base_set_location(&button->text->base, 0.0f, 0.0f); + } } void djui_button_set_style(struct DjuiButton* button, u8 style) { button->style = style; - djui_button_set_default_style(&button->base); -} - -static void djui_button_on_hover(struct DjuiBase* base) { - struct DjuiButton* button = (struct DjuiButton*)base; - djui_base_set_border_color(base, 0, 120, 215, 255); - djui_base_set_color(&button->rect->base, 229, 241, 251, 255); - djui_base_set_location(&button->text->base, -0.5f, -1.0f); -} - -static void djui_button_on_hover_end(struct DjuiBase* base) { - djui_button_set_default_style(base); -} - -static void djui_button_on_cursor_down_begin(struct DjuiBase* base, UNUSED bool inputCursor) { - struct DjuiButton* button = (struct DjuiButton*)base; - djui_base_set_border_color(base, 0, 84, 153, 255); - djui_base_set_color(&button->rect->base, 204, 228, 247, 255); - djui_base_set_location(&button->text->base, 0.5f, 0.5f); -} - -static void djui_button_on_cursor_down_end(struct DjuiBase* base) { - djui_button_set_default_style(base); + djui_button_update_style(&button->base); } static void djui_button_destroy(struct DjuiBase* base) { @@ -48,9 +42,7 @@ struct DjuiButton* djui_button_create(struct DjuiBase* parent, const char* messa djui_base_init(parent, base, NULL, djui_button_destroy); djui_base_set_size(base, 200, 64); djui_base_set_border_width(base, 2); - djui_interactable_create(base); - djui_interactable_hook_hover(base, djui_button_on_hover, djui_button_on_hover_end); - djui_interactable_hook_cursor_down(base, djui_button_on_cursor_down_begin, NULL, djui_button_on_cursor_down_end); + djui_interactable_create(base, djui_button_update_style); button->style = 0; struct DjuiRect* rect = djui_rect_create(&button->base); @@ -66,7 +58,7 @@ struct DjuiButton* djui_button_create(struct DjuiBase* parent, const char* messa djui_text_set_drop_shadow(text, 0, 0, 0, 64); button->text = text; - djui_button_set_default_style(base); + djui_button_update_style(base); return button; } diff --git a/src/pc/djui/djui_checkbox.c b/src/pc/djui/djui_checkbox.c index ab5293254..644d9fb85 100644 --- a/src/pc/djui/djui_checkbox.c +++ b/src/pc/djui/djui_checkbox.c @@ -1,18 +1,27 @@ #include "djui.h" -static void djui_checkbox_set_default_style(struct DjuiBase* base) { +static void djui_checkbox_update_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); + if (!checkbox->base.enabled) { + djui_base_set_border_color(&checkbox->rect->base, 93, 93, 93, 255); + djui_base_set_color(&checkbox->rect->base, 0, 0, 0, 0); + djui_base_set_color(&checkbox->text->base, 100, 100, 100, 255); + djui_base_set_color(&checkbox->rectValue->base, 100, 100, 100, 255); + } else if (gDjuiCursorDownOn == 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); + } else if (gDjuiHovered == 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); + } else { + 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_get_cursor_hover_location(struct DjuiBase* base, f32* x, f32* y) { @@ -22,16 +31,8 @@ static void djui_checkbox_get_cursor_hover_location(struct DjuiBase* base, f32* *y = (rectBase->elem.y + rectBase->elem.height * 3.0f / 4.0f); } -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, UNUSED 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); if (base != NULL && base->interactable != NULL && base->interactable->on_value_change != NULL) { @@ -39,10 +40,6 @@ static void djui_checkbox_on_cursor_down_begin(struct DjuiBase* base, UNUSED boo } } -static void djui_checkbox_on_cursor_down_end(struct DjuiBase* base) { - djui_checkbox_set_default_style(base); -} - static void djui_checkbox_destroy(struct DjuiBase* base) { struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; free(checkbox); @@ -55,9 +52,8 @@ struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* m 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); + djui_interactable_create(base, djui_checkbox_update_style); + djui_interactable_hook_cursor_down(base, djui_checkbox_on_cursor_down_begin, NULL, NULL); struct DjuiText* text = djui_text_create(&checkbox->base, message); djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); @@ -82,9 +78,9 @@ struct DjuiCheckbox* djui_checkbox_create(struct DjuiBase* parent, const char* m djui_base_set_visible(&rectValue->base, *value); checkbox->rectValue = rectValue; - djui_checkbox_set_default_style(base); - base->get_cursor_hover_location = djui_checkbox_get_cursor_hover_location; + djui_checkbox_update_style(base); + return checkbox; } diff --git a/src/pc/djui/djui_inputbox.c b/src/pc/djui/djui_inputbox.c index 2baf283b1..a234365a0 100644 --- a/src/pc/djui/djui_inputbox.c +++ b/src/pc/djui/djui_inputbox.c @@ -15,6 +15,21 @@ static u8 sHeldShift = 0; static u8 sHeldControl = 0; static u8 sCursorBlink = 0; +static void djui_inputbox_update_style(struct DjuiBase* base) { + struct DjuiInputbox* inputbox = (struct DjuiInputbox*)base; + if (!inputbox->base.enabled) { + djui_base_set_border_color(base, 90, 90, 90, 255); + djui_base_set_color(&inputbox->base, 140, 140, 140, 255); + } else if (gDjuiCursorDownOn == base) { + } else if (gDjuiHovered == base) { + djui_base_set_border_color(base, 0, 120, 215, 255); + djui_base_set_color(&inputbox->base, 255, 255, 255, 255); + } else { + djui_base_set_border_color(base, 150, 150, 150, 255); + djui_base_set_color(&inputbox->base, 240, 240, 240, 255); + } +} + static void djui_inputbox_on_change(struct DjuiInputbox* inputbox) { struct DjuiBase* base = &inputbox->base; if (base != NULL && base->interactable != NULL && base->interactable->on_value_change != NULL) { @@ -46,27 +61,6 @@ void djui_inputbox_hook_escape_press(struct DjuiInputbox* inputbox, void (*on_es inputbox->on_escape_press = on_escape_press; } -static void djui_inputbox_set_default_style(struct DjuiBase* base) { - struct DjuiInputbox* inputbox = (struct DjuiInputbox*)base; - if (inputbox->base.enabled) { - djui_base_set_border_color(base, 150, 150, 150, 255); - djui_base_set_color(&inputbox->base, 240, 240, 240, 255); - } else { - djui_base_set_border_color(base, 90, 90, 90, 255); - djui_base_set_color(&inputbox->base, 140, 140, 140, 255); - } -} - -static void djui_inputbox_on_hover(struct DjuiBase* base) { - struct DjuiInputbox* inputbox = (struct DjuiInputbox*)base; - djui_base_set_border_color(base, 0, 120, 215, 255); - djui_base_set_color(&inputbox->base, 255, 255, 255, 255); -} - -static void djui_inputbox_on_hover_end(struct DjuiBase* base) { - djui_inputbox_set_default_style(base); -} - static u16 djui_inputbox_get_cursor_index(struct DjuiInputbox* inputbox) { struct DjuiBaseRect* comp = &inputbox->base.comp; const struct DjuiFont* font = gDjuiFonts[0]; @@ -92,10 +86,6 @@ static void djui_inputbox_on_cursor_down(struct DjuiBase* base) { inputbox->selection[0] = index; } -static void djui_inputbox_on_cursor_down_end(struct DjuiBase* base) { - djui_inputbox_set_default_style(base); -} - static void djui_inputbox_on_cursor_down_begin(struct DjuiBase* base, UNUSED bool inputCursor) { struct DjuiInputbox* inputbox = (struct DjuiInputbox*)base; u16 index = djui_inputbox_get_cursor_index(inputbox); @@ -103,9 +93,9 @@ static void djui_inputbox_on_cursor_down_begin(struct DjuiBase* base, UNUSED boo if (selLength != strlen(inputbox->buffer) || djui_interactable_is_input_focus(base)) { inputbox->selection[0] = index; inputbox->selection[1] = index; - djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, djui_inputbox_on_cursor_down, djui_inputbox_on_cursor_down_end); + djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, djui_inputbox_on_cursor_down, NULL); } else { - djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, NULL, djui_inputbox_on_cursor_down_end); + djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, NULL, NULL); } sCursorBlink = 0; djui_interactable_set_input_focus(base); @@ -543,14 +533,13 @@ struct DjuiInputbox* djui_inputbox_create(struct DjuiBase* parent, u16 bufferSiz djui_base_set_size(base, 200, 32); djui_base_set_border_width(base, 2); djui_inputbox_set_text_color(inputbox, 0, 0, 0, 255); - djui_interactable_create(base); - djui_interactable_hook_hover(base, djui_inputbox_on_hover, djui_inputbox_on_hover_end); - djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, djui_inputbox_on_cursor_down, djui_inputbox_on_cursor_down_end); + djui_interactable_create(base, djui_inputbox_update_style); + djui_interactable_hook_cursor_down(base, djui_inputbox_on_cursor_down_begin, djui_inputbox_on_cursor_down, NULL); djui_interactable_hook_key(base, djui_inputbox_on_key_down, djui_inputbox_on_key_up); djui_interactable_hook_focus(base, djui_inputbox_on_focus_begin, NULL, djui_inputbox_on_focus_end); djui_interactable_hook_text_input(base, djui_inputbox_on_text_input); - djui_interactable_hook_enabled_change(base, djui_inputbox_set_default_style); - djui_inputbox_set_default_style(base); + + djui_inputbox_update_style(base); return inputbox; } diff --git a/src/pc/djui/djui_interactable.c b/src/pc/djui/djui_interactable.c index 847ce4d73..0a5dfb571 100644 --- a/src/pc/djui/djui_interactable.c +++ b/src/pc/djui/djui_interactable.c @@ -9,6 +9,9 @@ #include "audio_defines.h" #include "audio/external.h" +#define CALL_CALLBACK(x) if (base->interactable->x != NULL) { base->interactable->x(base); } +#define CALL_CALLBACK_PARAM(x, y) if (base->interactable->x != NULL) { base->interactable->x(base, y); } + enum PadHoldDirection { PAD_HOLD_DIR_NONE, PAD_HOLD_DIR_UP, PAD_HOLD_DIR_DOWN, PAD_HOLD_DIR_LEFT, PAD_HOLD_DIR_RIGHT }; static enum PadHoldDirection sKeyboardHoldDirection = PAD_HOLD_DIR_NONE; static u16 sKeyboardButtons = 0; @@ -16,7 +19,8 @@ static u16 sKeyboardButtons = 0; static bool sIgnoreInteractableUntilCursorReleased = false; struct DjuiBase* gDjuiHovered = NULL; -static struct DjuiBase* sInteractableFocus = NULL; +struct DjuiBase* gDjuiCursorDownOn = NULL; +struct DjuiBase* gInteractableFocus = NULL; static struct DjuiBase* sInteractableBinding = NULL; static struct DjuiBase* sMouseDown = NULL; bool gInteractableOverridePad = false; @@ -24,53 +28,67 @@ OSContPad gInteractablePad = { 0 }; static OSContPad sLastInteractablePad = { 0 }; static int sLastMouseButtons = 0; -static void djui_interactable_on_click(struct DjuiBase* base) { - if (base == NULL) { return; } +static void djui_interactable_update_style(struct DjuiBase* base) { + if (base == NULL) { return; } if (base->interactable == NULL) { return; } - if (base->interactable->on_click == NULL) { return; } - base->interactable->on_click(base); + CALL_CALLBACK(update_style); +} + +static void djui_interactable_on_click(struct DjuiBase* base) { + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + djui_interactable_update_style(base); + CALL_CALLBACK(on_click); } static void djui_interactable_on_hover(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_hover == NULL) { return; } - base->interactable->on_hover(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_hover); } static void djui_interactable_on_hover_end(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_hover == NULL) { return; } - base->interactable->on_hover_end(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_hover_end); } static void djui_interactable_on_cursor_down_begin(struct DjuiBase* base, bool inputCursor) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_cursor_down_begin == NULL) { return; } + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } if (gDjuiHovered != NULL) { djui_interactable_on_hover_end(gDjuiHovered); gDjuiHovered = NULL; } - base->interactable->on_cursor_down_begin(base, inputCursor); + gDjuiCursorDownOn = base; + + djui_interactable_update_style(base); + CALL_CALLBACK_PARAM(on_cursor_down_begin, inputCursor); } static void djui_interactable_on_cursor_down(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_cursor_down == NULL) { return; } - - base->interactable->on_cursor_down(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + djui_interactable_update_style(base); + CALL_CALLBACK(on_cursor_down); } static void djui_interactable_on_cursor_down_end(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_cursor_down_end == NULL) { return; } - base->interactable->on_cursor_down_end(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + if (gDjuiCursorDownOn == base) { + gDjuiCursorDownOn = NULL; + } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_cursor_down_end); if (djui_cursor_inside_base(base)) { djui_interactable_on_click(base); @@ -78,38 +96,43 @@ static void djui_interactable_on_cursor_down_end(struct DjuiBase* base) { } static void djui_interactable_on_focus_begin(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_focus_begin == NULL) { return; } - base->interactable->on_focus_begin(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_focus_begin); } static void djui_interactable_on_focus(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_focus == NULL) { return; } - base->interactable->on_focus(base, &gInteractablePad); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK_PARAM(on_focus, &gInteractablePad); } static void djui_interactable_on_focus_end(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_focus_end == NULL) { return; } - base->interactable->on_focus_end(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_focus_end); } static void djui_interactable_on_value_change(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_value_change == NULL) { return; } - base->interactable->on_value_change(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_value_change); } static void djui_interactable_on_bind(struct DjuiBase* base) { - if (base == NULL) { return; } - if (base->interactable == NULL) { return; } - if (base->interactable->on_bind == NULL) { return; } - base->interactable->on_bind(base); + if (base == NULL) { return; } + if (base->interactable == NULL) { return; } + + djui_interactable_update_style(base); + CALL_CALLBACK(on_bind); } static void djui_interactable_cursor_update_active(struct DjuiBase* base) { @@ -152,14 +175,14 @@ void djui_interactable_set_binding(struct DjuiBase* base) { } void djui_interactable_set_input_focus(struct DjuiBase* base) { - djui_interactable_on_focus_end(sInteractableFocus); - sInteractableFocus = base; + djui_interactable_on_focus_end(gInteractableFocus); + gInteractableFocus = base; djui_interactable_on_focus_begin(base); djui_cursor_set_visible(base == NULL); } bool djui_interactable_is_input_focus(struct DjuiBase* base) { - return sInteractableFocus == base; + return gInteractableFocus == base; } bool djui_interactable_on_key_down(int scancode) { @@ -167,12 +190,12 @@ bool djui_interactable_on_key_down(int scancode) { return true; } - bool keyFocused = (sInteractableFocus != NULL) - && (sInteractableFocus->interactable != NULL) - && (sInteractableFocus->interactable->on_key_down != NULL); + bool keyFocused = (gInteractableFocus != NULL) + && (gInteractableFocus->interactable != NULL) + && (gInteractableFocus->interactable->on_key_down != NULL); if (keyFocused) { - bool consume = sInteractableFocus->interactable->on_key_down(sInteractableFocus, scancode); + bool consume = gInteractableFocus->interactable->on_key_down(gInteractableFocus, scancode); if (consume) { sKeyboardHoldDirection = PAD_HOLD_DIR_NONE; sKeyboardButtons = 0; @@ -222,9 +245,9 @@ bool djui_interactable_on_key_down(int scancode) { void djui_interactable_on_key_up(int scancode) { - bool keyFocused = (sInteractableFocus != NULL) - && (sInteractableFocus->interactable != NULL) - && (sInteractableFocus->interactable->on_key_up != NULL); + bool keyFocused = (gInteractableFocus != NULL) + && (gInteractableFocus->interactable != NULL) + && (gInteractableFocus->interactable->on_key_up != NULL); if (gDjuiPlayerList != NULL) { for (int i = 0; i < MAX_BINDS; i++) { @@ -236,7 +259,7 @@ void djui_interactable_on_key_up(int scancode) { } if (keyFocused) { - sInteractableFocus->interactable->on_key_up(sInteractableFocus, scancode); + gInteractableFocus->interactable->on_key_up(gInteractableFocus, scancode); sKeyboardHoldDirection = PAD_HOLD_DIR_NONE; sKeyboardButtons = 0; return; @@ -253,10 +276,10 @@ void djui_interactable_on_key_up(int scancode) { } void djui_interactable_on_text_input(char* text) { - if (sInteractableFocus == NULL) { return; } - if (sInteractableFocus->interactable == NULL) { return; } - if (sInteractableFocus->interactable->on_text_input == NULL) { return; } - sInteractableFocus->interactable->on_text_input(sInteractableFocus, text); + if (gInteractableFocus == NULL) { return; } + if (gInteractableFocus->interactable == NULL) { return; } + if (gInteractableFocus->interactable->on_text_input == NULL) { return; } + gInteractableFocus->interactable->on_text_input(gInteractableFocus, text); } void djui_interactable_update_pad(void) { @@ -295,7 +318,7 @@ void djui_interactable_update_pad(void) { validPadHold = true; } - if (validPadHold && sInteractableFocus == NULL) { + if (validPadHold && gInteractableFocus == NULL) { switch (padHoldDirection) { case PAD_HOLD_DIR_UP: djui_cursor_move( 0, -1); break; case PAD_HOLD_DIR_DOWN: djui_cursor_move( 0, 1); break; @@ -325,16 +348,16 @@ void djui_interactable_update(void) { } // update focused - if (sInteractableFocus) { + if (gInteractableFocus) { u16 mainButtons = PAD_BUTTON_A | PAD_BUTTON_B; - if ((mouseButtons & MOUSE_BUTTON_1) && !(sLastMouseButtons && MOUSE_BUTTON_1) && !djui_cursor_inside_base(sInteractableFocus)) { + if ((mouseButtons & MOUSE_BUTTON_1) && !(sLastMouseButtons && MOUSE_BUTTON_1) && !djui_cursor_inside_base(gInteractableFocus)) { // clicked outside of focused djui_interactable_set_input_focus(NULL); } else if ((padButtons & mainButtons) && !(sLastInteractablePad.button & mainButtons)) { // pressed main face button djui_interactable_set_input_focus(NULL); } else { - djui_interactable_on_focus(sInteractableFocus); + djui_interactable_on_focus(gInteractableFocus); } } else if ((padButtons & PAD_BUTTON_B) && !(sLastInteractablePad.button & PAD_BUTTON_B)) { // pressed back button on controller @@ -442,7 +465,7 @@ void djui_interactable_hook_enabled_change(struct DjuiBase *base, interactable->on_enabled_change = on_enabled_change; } -void djui_interactable_create(struct DjuiBase* base) { +void djui_interactable_create(struct DjuiBase* base, void (*update_style)(struct DjuiBase*)) { if (base->interactable != NULL) { free(base->interactable); @@ -451,4 +474,6 @@ void djui_interactable_create(struct DjuiBase* base) { struct DjuiInteractable* interactable = calloc(1, sizeof(struct DjuiInteractable)); memset(interactable, 0, sizeof(struct DjuiInteractable)); base->interactable = interactable; + + base->interactable->update_style = update_style; } diff --git a/src/pc/djui/djui_interactable.h b/src/pc/djui/djui_interactable.h index 36e7c6208..4fa0f3d19 100644 --- a/src/pc/djui/djui_interactable.h +++ b/src/pc/djui/djui_interactable.h @@ -23,6 +23,7 @@ #pragma pack(1) struct DjuiInteractable { bool enabled; + void (*update_style)(struct DjuiBase*); void (*on_hover)(struct DjuiBase*); void (*on_hover_end)(struct DjuiBase*); void (*on_cursor_down_begin)(struct DjuiBase*, bool); @@ -43,6 +44,8 @@ struct DjuiInteractable { extern bool gInteractableOverridePad; extern OSContPad gInteractablePad; extern struct DjuiBase* gDjuiHovered; +extern struct DjuiBase* gDjuiCursorDownOn; +extern struct DjuiBase* gInteractableFocus; bool djui_interactable_is_binding(void); void djui_interactable_set_binding(struct DjuiBase* base); @@ -87,4 +90,5 @@ void djui_interactable_hook_text_input(struct DjuiBase* base, void djui_interactable_hook_enabled_change(struct DjuiBase *base, void (*on_enabled_change)(struct DjuiBase*)); -void djui_interactable_create(struct DjuiBase* base); +void djui_interactable_create(struct DjuiBase* base, + void (*update_style)(struct DjuiBase*)); diff --git a/src/pc/djui/djui_panel_host_mods.c b/src/pc/djui/djui_panel_host_mods.c index e540e5d97..b2257ffb7 100644 --- a/src/pc/djui/djui_panel_host_mods.c +++ b/src/pc/djui/djui_panel_host_mods.c @@ -41,21 +41,7 @@ static void djui_panel_host_mods_description_create() { sDescriptionPanel = panel; } -static void djui_mod_checkbox_set_style(struct DjuiBase* base) { - struct DjuiCheckbox* checkbox = (struct DjuiCheckbox*)base; - int val = base->enabled ? 200 : 100; - 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, val, val, val, 255); - djui_base_set_color(&checkbox->rectValue->base, val, val, val, 255); -} - static void djui_mod_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); - char* description = ""; if (base->tag >= 0 && base->tag < gModTableLocal.entryCount) { char* d = gModTableLocal.entries[base->tag].description; @@ -66,7 +52,11 @@ static void djui_mod_checkbox_on_hover(struct DjuiBase* base) { djui_text_set_text(sTooltip, description); } -static void djui_mod_checkbox_on_click(UNUSED struct DjuiBase* base) { +static void djui_mod_checkbox_on_hover_end(UNUSED struct DjuiBase* base) { + djui_text_set_text(sTooltip, ""); +} + +static void djui_mod_checkbox_on_value_change(UNUSED struct DjuiBase* base) { mod_list_update_selectable(); u16 index = 0; @@ -76,23 +66,13 @@ static void djui_mod_checkbox_on_click(UNUSED struct DjuiBase* base) { struct ModListEntry* entry = &gModTableLocal.entries[index]; djui_base_set_enabled(node->base, entry->selectable); - djui_mod_checkbox_set_style(node->base); - + // iterate index++; node = node->next; } } -static void djui_mod_checkbox_on_hover_end(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); - djui_text_set_text(sTooltip, ""); -} - static void djui_panel_host_mods_destroy(struct DjuiBase* base) { struct DjuiThreePanel* threePanel = (struct DjuiThreePanel*)base; free(threePanel); @@ -120,9 +100,8 @@ void djui_panel_host_mods_create(struct DjuiBase* caller) { djui_base_set_size_type(&checkbox->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox->base, 1.0f, 32); djui_base_set_enabled(&checkbox->base, entry->selectable); - djui_mod_checkbox_set_style(&checkbox->base); djui_interactable_hook_hover(&checkbox->base, djui_mod_checkbox_on_hover, djui_mod_checkbox_on_hover_end); - djui_interactable_hook_click(&checkbox->base, djui_mod_checkbox_on_click); + djui_interactable_hook_value_change(&checkbox->base, djui_mod_checkbox_on_value_change); } struct DjuiButton* button1 = djui_button_create(&body->base, "Back"); diff --git a/src/pc/djui/djui_selectionbox.c b/src/pc/djui/djui_selectionbox.c index 0d7efc16d..de5dbadc9 100644 --- a/src/pc/djui/djui_selectionbox.c +++ b/src/pc/djui/djui_selectionbox.c @@ -4,14 +4,38 @@ extern ALIGNED8 u8 texture_selectionbox_icon[]; -static void djui_selectionbox_set_default_style(struct DjuiBase* base) { +static void djui_selectionbox_update_style(struct DjuiBase* base) { struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; - djui_base_set_border_color(&selectionbox->rect->base, 150, 150, 150, 255); - djui_base_set_color(&selectionbox->rect->base, 200, 200, 200, 255); - djui_base_set_color(&selectionbox->rectText->base, 11, 11, 11, 255); - djui_base_set_location(&selectionbox->rectText->base, 0.0f, 3.0f); - djui_base_set_color(&selectionbox->rectImage->base, 0, 0, 0, 255); - djui_base_set_color(&selectionbox->text->base, 200, 200, 200, 255); + f32 x = selectionbox->rect->base.elem.x; + bool activeRegion = (gCursorX >= x); + + if (!selectionbox->base.enabled) { + struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; + djui_base_set_border_color(&selectionbox->rect->base, 75, 75, 75, 255); + djui_base_set_color(&selectionbox->rect->base, 100, 100, 100, 255); + djui_base_set_color(&selectionbox->rectText->base, 5, 5, 5, 255); + djui_base_set_location(&selectionbox->rectText->base, 0.0f, 3.0f); + djui_base_set_color(&selectionbox->rectImage->base, 0, 0, 0, 255); + djui_base_set_color(&selectionbox->text->base, 100, 100, 100, 255); + } else if (gDjuiCursorDownOn == base && activeRegion) { + djui_base_set_border_color(&selectionbox->rect->base, 0, 84, 153, 255); + djui_base_set_color(&selectionbox->rect->base, 204, 228, 247, 255); + djui_base_set_location(&selectionbox->rectText->base, 0.5f, 3.5f); + djui_base_set_color(&selectionbox->text->base, 229, 241, 251, 255); + } else if (gDjuiHovered == base && activeRegion) { + djui_base_set_border_color(&selectionbox->rect->base, 0, 120, 215, 255); + djui_base_set_color(&selectionbox->rect->base, 229, 241, 251, 255); + djui_base_set_location(&selectionbox->rectText->base, -1.0f, 2.0f); + djui_base_set_color(&selectionbox->text->base, 229, 241, 251, 255); + } else { + struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; + djui_base_set_border_color(&selectionbox->rect->base, 150, 150, 150, 255); + djui_base_set_color(&selectionbox->rect->base, 200, 200, 200, 255); + djui_base_set_color(&selectionbox->rectText->base, 11, 11, 11, 255); + djui_base_set_location(&selectionbox->rectText->base, 0.0f, 3.0f); + djui_base_set_color(&selectionbox->rectImage->base, 0, 0, 0, 255); + djui_base_set_color(&selectionbox->text->base, 200, 200, 200, 255); + } } static void djui_selectionbox_get_cursor_hover_location(struct DjuiBase* base, f32* x, f32* y) { @@ -21,45 +45,16 @@ static void djui_selectionbox_get_cursor_hover_location(struct DjuiBase* base, f *y = (rectBase->elem.y + rectBase->elem.height * 3.0f / 4.0f); } -static void djui_selectionbox_on_hover(struct DjuiBase* base) { - struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; - f32 x = selectionbox->rect->base.elem.x; - if (gCursorX >= x) { - djui_base_set_border_color(&selectionbox->rect->base, 0, 120, 215, 255); - djui_base_set_color(&selectionbox->rect->base, 229, 241, 251, 255); - djui_base_set_location(&selectionbox->rectText->base, -1.0f, 2.0f); - djui_base_set_color(&selectionbox->text->base, 229, 241, 251, 255); - } else { - djui_selectionbox_set_default_style(base); - } -} - -static void djui_selectionbox_on_hover_end(struct DjuiBase* base) { - djui_selectionbox_set_default_style(base); -} - static void djui_selectionbox_on_cursor_down_begin(struct DjuiBase* base, UNUSED bool inputCursor) { struct DjuiSelectionbox* selectionbox = (struct DjuiSelectionbox*)base; f32 x = selectionbox->rect->base.elem.x; if (gCursorX >= x) { - djui_base_set_border_color(&selectionbox->rect->base, 0, 84, 153, 255); - djui_base_set_color(&selectionbox->rect->base, 204, 228, 247, 255); - djui_base_set_location(&selectionbox->rectText->base, 0.5f, 3.5f); - djui_base_set_color(&selectionbox->text->base, 229, 241, 251, 255); - *selectionbox->value = (*selectionbox->value + 1) % selectionbox->choiceCount; djui_text_set_text(selectionbox->rectText, selectionbox->choices[*selectionbox->value]); if (base != NULL && base->interactable != NULL && base->interactable->on_value_change != NULL) { base->interactable->on_value_change(base); } } - else { - djui_selectionbox_set_default_style(base); - } -} - -static void djui_selectionbox_on_cursor_down_end(struct DjuiBase* base) { - djui_selectionbox_set_default_style(base); } static void djui_selectionbox_destroy(struct DjuiBase* base) { @@ -85,9 +80,8 @@ struct DjuiSelectionbox* djui_selectionbox_create(struct DjuiBase* parent, const selectionbox->choiceCount = choiceCount; djui_base_init(parent, base, NULL, djui_selectionbox_destroy); - djui_interactable_create(base); - djui_interactable_hook_hover(base, djui_selectionbox_on_hover, djui_selectionbox_on_hover_end); - djui_interactable_hook_cursor_down(base, djui_selectionbox_on_cursor_down_begin, NULL, djui_selectionbox_on_cursor_down_end); + djui_interactable_create(base, djui_selectionbox_update_style); + djui_interactable_hook_cursor_down(base, djui_selectionbox_on_cursor_down_begin, NULL, NULL); struct DjuiText* text = djui_text_create(&selectionbox->base, message); djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); @@ -120,7 +114,7 @@ struct DjuiSelectionbox* djui_selectionbox_create(struct DjuiBase* parent, const djui_base_set_alignment(&rectImage->base, DJUI_HALIGN_RIGHT, DJUI_VALIGN_CENTER); selectionbox->rectImage = rectImage; - djui_selectionbox_set_default_style(base); + djui_selectionbox_update_style(base); base->get_cursor_hover_location = djui_selectionbox_get_cursor_hover_location; diff --git a/src/pc/djui/djui_slider.c b/src/pc/djui/djui_slider.c index eef05420b..aec15567c 100644 --- a/src/pc/djui/djui_slider.c +++ b/src/pc/djui/djui_slider.c @@ -1,5 +1,33 @@ #include "djui.h" +static void djui_slider_update_style(struct DjuiBase* base) { + struct DjuiSlider* slider = (struct DjuiSlider*)base; + f32 x = slider->rect->base.elem.x; + bool activeRegion = (gCursorX >= x); + + if (!slider->base.enabled) { + } else if (gInteractableFocus == base) { + djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); + djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); + djui_base_set_color(&slider->text->base, 229, 241, 251, 255); + djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); + } else if (gDjuiCursorDownOn == base && activeRegion) { + djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); + djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); + djui_base_set_color(&slider->text->base, 229, 241, 251, 255); + djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); + } else if (gDjuiHovered == base && activeRegion) { + djui_base_set_border_color(&slider->rect->base, 0, 120, 215, 255); + djui_base_set_color(&slider->text->base, 229, 241, 251, 255); + djui_base_set_color(&slider->rectValue->base, 229, 241, 251, 255); + } else { + djui_base_set_border_color(&slider->rect->base, 173, 173, 173, 255); + djui_base_set_color(&slider->rect->base, 0, 0, 0, 0); + djui_base_set_color(&slider->text->base, 200, 200, 200, 255); + djui_base_set_color(&slider->rectValue->base, 200, 200, 200, 255); + } +} + static void djui_slider_update_value(struct DjuiBase* base) { struct DjuiSlider* slider = (struct DjuiSlider*)base; u32 min = slider->min; @@ -8,14 +36,6 @@ static void djui_slider_update_value(struct DjuiBase* base) { djui_base_set_size(&slider->rectValue->base, ((f32)*value - min) / ((f32)max - min), 1.0f); } -static void djui_slider_set_default_style(struct DjuiBase* base) { - struct DjuiSlider* slider = (struct DjuiSlider*)base; - djui_base_set_border_color(&slider->rect->base, 173, 173, 173, 255); - djui_base_set_color(&slider->rect->base, 0, 0, 0, 0); - djui_base_set_color(&slider->text->base, 200, 200, 200, 255); - djui_base_set_color(&slider->rectValue->base, 200, 200, 200, 255); -} - static void djui_slider_get_cursor_hover_location(struct DjuiBase* base, f32* x, f32* y) { struct DjuiSlider* slider = (struct DjuiSlider*)base; struct DjuiBase* rectBase = &slider->rect->base; @@ -23,22 +43,6 @@ static void djui_slider_get_cursor_hover_location(struct DjuiBase* base, f32* x, *y = (rectBase->elem.y + rectBase->elem.height * 3.0f / 4.0f); } -static void djui_slider_on_hover(struct DjuiBase* base) { - struct DjuiSlider* slider = (struct DjuiSlider*)base; - f32 x = slider->rect->base.elem.x; - if (gCursorX >= x) { - djui_base_set_border_color(&slider->rect->base, 0, 120, 215, 255); - djui_base_set_color(&slider->text->base, 229, 241, 251, 255); - djui_base_set_color(&slider->rectValue->base, 229, 241, 251, 255); - } else { - djui_slider_set_default_style(base); - } -} - -static void djui_slider_on_hover_end(struct DjuiBase* base) { - djui_slider_set_default_style(base); -} - static void djui_slider_on_cursor_down(struct DjuiBase* base) { struct DjuiSlider* slider = (struct DjuiSlider*)base; u32 min = slider->min; @@ -60,18 +64,12 @@ static void djui_slider_on_cursor_down_begin(struct DjuiBase* base, bool inputCu struct DjuiSlider* slider = (struct DjuiSlider*)base; f32 x = slider->rect->base.elem.x; if (gCursorX >= x) { - djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); - djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); - djui_base_set_color(&slider->text->base, 229, 241, 251, 255); - djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); if (inputCursor) { djui_interactable_set_input_focus(base); } else { slider->base.interactable->on_cursor_down = djui_slider_on_cursor_down; } - } - else { - djui_slider_set_default_style(base); + } else { slider->base.interactable->on_cursor_down = NULL; } } @@ -79,15 +77,6 @@ static void djui_slider_on_cursor_down_begin(struct DjuiBase* base, bool inputCu static void djui_slider_on_cursor_down_end(struct DjuiBase* base) { struct DjuiSlider* slider = (struct DjuiSlider*)base; slider->base.interactable->on_cursor_down = NULL; - djui_slider_set_default_style(base); -} - -static void djui_slider_on_focus_begin(struct DjuiBase* base) { - struct DjuiSlider* slider = (struct DjuiSlider*)base; - djui_base_set_border_color(&slider->rect->base, 20, 170, 255, 255); - djui_base_set_color(&slider->rect->base, 255, 255, 255, 32); - djui_base_set_color(&slider->text->base, 229, 241, 251, 255); - djui_base_set_color(&slider->rectValue->base, 255, 255, 255, 255); } static void djui_slider_on_focus(struct DjuiBase* base, OSContPad* pad) { @@ -104,10 +93,6 @@ static void djui_slider_on_focus(struct DjuiBase* base, OSContPad* pad) { djui_slider_update_value(base); } -static void djui_slider_on_focus_end(struct DjuiBase* base) { - djui_slider_set_default_style(base); -} - static void djui_slider_destroy(struct DjuiBase* base) { struct DjuiSlider* slider = (struct DjuiSlider*)base; free(slider); @@ -122,10 +107,9 @@ struct DjuiSlider* djui_slider_create(struct DjuiBase* parent, const char* messa slider->max = max; djui_base_init(parent, base, NULL, djui_slider_destroy); - djui_interactable_create(base); - djui_interactable_hook_hover(base, djui_slider_on_hover, djui_slider_on_hover_end); + djui_interactable_create(base, djui_slider_update_style); djui_interactable_hook_cursor_down(base, djui_slider_on_cursor_down_begin, NULL, djui_slider_on_cursor_down_end); - djui_interactable_hook_focus(base, djui_slider_on_focus_begin, djui_slider_on_focus, djui_slider_on_focus_end); + djui_interactable_hook_focus(base, NULL, djui_slider_on_focus, NULL); struct DjuiText* text = djui_text_create(&slider->base, message); djui_base_set_alignment(&text->base, DJUI_HALIGN_LEFT, DJUI_VALIGN_CENTER); @@ -148,7 +132,7 @@ struct DjuiSlider* djui_slider_create(struct DjuiBase* parent, const char* messa slider->rectValue = rectValue; djui_slider_update_value(base); - djui_slider_set_default_style(base); + djui_slider_update_style(base); base->get_cursor_hover_location = djui_slider_get_cursor_hover_location;