Refactored interactable djui elements

This commit is contained in:
MysterD 2022-01-27 23:55:42 -08:00
parent 809dfd6373
commit 880afd79c3
9 changed files with 243 additions and 277 deletions

View file

@ -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) {

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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*));

View file

@ -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");

View file

@ -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;

View file

@ -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;