From 5e2c6b510797a03b11c752516954aa5747b433d6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 26 Jun 2024 15:47:28 -0700 Subject: [PATCH] setting view categories --- src/df/gfx/df_views.c | 272 ++++++++++++++++++++++++++---------------- src/df/gfx/df_views.h | 3 + src/raddbg/raddbg.h | 18 +-- 3 files changed, 181 insertions(+), 112 deletions(-) diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 5dff3213..1071476a 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -8490,6 +8490,7 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) DF_ThemeColor color_ctx_menu_color; Vec4F32 color_ctx_menu_color_hsva; DF_ThemePreset preset_apply_confirm; + B32 category_collapsed[DF_SettingsItemKind_COUNT]; }; DF_SettingsViewState *sv = df_view_user_state(view, DF_SettingsViewState); if(!sv->initialized) @@ -8505,72 +8506,117 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) { DF_SettingsItemList items_list = {0}; - //- rjf: gather all settings - for(EachEnumVal(DF_SettingCode, code)) + //- rjf: settings header + if(query.size == 0) { - String8 kind_string = str8_lit("Interface"); - String8 string = df_g_setting_code_display_string_table[code]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Interface Settings"); + n->v.icon_kind = sv->category_collapsed[DF_SettingsItemKind_Setting] ? DF_IconKind_RightCaret : DF_IconKind_DownCaret; + n->v.category = DF_SettingsItemKind_Setting; + } + + //- rjf: gather all settings + if(!sv->category_collapsed[DF_SettingsItemKind_Setting] || query.size != 0) + { + for(EachEnumVal(DF_SettingCode, code)) { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_Setting; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Window; - n->v.code = code; + String8 kind_string = str8_lit("Interface"); + String8 string = df_g_setting_code_display_string_table[code]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_Setting; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = DF_IconKind_Window; + n->v.code = code; + } } } + //- rjf: theme presets header + if(query.size == 0) + { + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Theme Presets"); + n->v.icon_kind = sv->category_collapsed[DF_SettingsItemKind_ThemePreset] ? DF_IconKind_RightCaret : DF_IconKind_DownCaret; + n->v.category = DF_SettingsItemKind_ThemePreset; + } + //- rjf: gather theme presets - for(EachEnumVal(DF_ThemePreset, preset)) + if(!sv->category_collapsed[DF_SettingsItemKind_ThemePreset] || query.size != 0) { - String8 kind_string = str8_lit("Theme Preset"); - String8 string = df_g_theme_preset_display_string_table[preset]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) + for(EachEnumVal(DF_ThemePreset, preset)) { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_ThemePreset; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Palette; - n->v.preset = preset; + String8 kind_string = str8_lit("Theme Preset"); + String8 string = df_g_theme_preset_display_string_table[preset]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_ThemePreset; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = DF_IconKind_Palette; + n->v.preset = preset; + } } } - //- rjf: gather all theme colors - for(EachNonZeroEnumVal(DF_ThemeColor, color)) + //- rjf: theme colors header + if(query.size == 0) { - String8 kind_string = str8_lit("Theme Color"); - String8 string = df_g_theme_color_display_string_table[color]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Theme Colors"); + n->v.icon_kind = sv->category_collapsed[DF_SettingsItemKind_ThemeColor] ? DF_IconKind_RightCaret : DF_IconKind_DownCaret; + n->v.category = DF_SettingsItemKind_ThemeColor; + } + + //- rjf: gather all theme colors + if(!sv->category_collapsed[DF_SettingsItemKind_ThemeColor] || query.size != 0) + { + for(EachNonZeroEnumVal(DF_ThemeColor, color)) { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_ThemeColor; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Palette; - n->v.color = color; + String8 kind_string = str8_lit("Theme Color"); + String8 string = df_g_theme_color_display_string_table[color]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = DF_SettingsItemKind_ThemeColor; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = DF_IconKind_Palette; + n->v.color = color; + } } } @@ -8817,8 +8863,15 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) B32 is_slider = 0; S32 slider_s32_val = 0; F32 slider_pct = 0.f; + UI_BoxFlags flags = UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects; switch(item->kind) { + case DF_SettingsItemKind_COUNT:{}break; + case DF_SettingsItemKind_CategoryHeader: + { + cursor = OS_Cursor_HandPoint; + flags = UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects; + }break; case DF_SettingsItemKind_ThemePreset: { Vec4F32 *colors = df_g_theme_preset_colors_table[item->preset]; @@ -8856,60 +8909,65 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) //- rjf: build item widget UI_Box *item_box = &ui_g_nil_box; - UI_Focus(row_num+1 == sv->cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) + UI_Row { - ui_set_next_hover_cursor(cursor); - item_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###option_%S", item->string); - UI_Parent(item_box) + if(query.size == 0 && item->kind != DF_SettingsItemKind_CategoryHeader) { - ui_spacer(ui_em(1.f, 1.f)); - UI_PrefWidth(ui_em(2.5f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_RunFlags(F_RunFlag_Smooth) - UI_Palette(ui_build_palette(ui_top_palette(), .text = rgba)) - ui_label(df_g_icon_kind_text_table[item->icon_kind]); - UI_PrefWidth(ui_text_dim(10, 1)) + ui_set_next_flags(UI_BoxFlag_DrawSideLeft); + ui_spacer(ui_em(2.f, 1.f)); + } + UI_Focus(row_num+1 == sv->cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) + { + ui_set_next_hover_cursor(cursor); + item_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|flags, "###option_%S_%S", item->kind_string, item->string); + UI_Parent(item_box) { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak, "%S", item->kind_string); - ui_box_equip_fuzzy_match_ranges(box, &item->kind_string_matches); - } - UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S", item->string); - ui_box_equip_fuzzy_match_ranges(box, &item->string_matches); - } - if(is_slider) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_RunFlags(F_RunFlag_Smooth) - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_labelf("(%i)", slider_s32_val); - UI_PrefWidth(ui_pct(slider_pct, 1.f)) UI_HeightFill UI_FixedX(0) UI_FixedY(0) - UI_Palette(ui_build_palette(ui_top_palette(), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay))) - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - if(is_toggler) - { - ui_spacer(ui_pct(1, 0)); - UI_PrefWidth(ui_em(2.5f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_RunFlags(F_RunFlag_Smooth) - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[is_toggled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow]); - } - if(item->kind == DF_SettingsItemKind_ThemePreset && sv->preset_apply_confirm == item->preset) - { - ui_spacer(ui_pct(1, 0)); + if(item->icon_kind != DF_IconKind_Null) + { + UI_PrefWidth(ui_em(2.f, 1.f)) + UI_Font(df_font_from_slot(DF_FontSlot_Icons)) + UI_RunFlags(F_RunFlag_Smooth) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rgba)) + ui_label(df_g_icon_kind_text_table[item->icon_kind]); + } + if(item->kind_string.size != 0) UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak, "%S", item->kind_string); + ui_box_equip_fuzzy_match_ranges(box, &item->kind_string_matches); + } UI_PrefWidth(ui_text_dim(10, 1)) - DF_Palette(DF_PaletteCode_NegativePopButton) - UI_CornerRadius(ui_top_font_size()*0.5f) - UI_FontSize(ui_top_font_size()*0.9f) - ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBackground, "Click Again To Apply"); + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S", item->string); + ui_box_equip_fuzzy_match_ranges(box, &item->string_matches); + } + if(is_slider) UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Font(df_font_from_slot(DF_FontSlot_Code)) + UI_RunFlags(F_RunFlag_Smooth) + UI_Flags(UI_BoxFlag_DrawTextWeak) + ui_labelf("(%i)", slider_s32_val); + UI_PrefWidth(ui_pct(slider_pct, 1.f)) UI_HeightFill UI_FixedX(0) UI_FixedY(0) + UI_Palette(ui_build_palette(ui_top_palette(), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay))) + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + if(is_toggler) + { + ui_spacer(ui_pct(1, 0)); + UI_PrefWidth(ui_em(2.5f, 1.f)) + UI_Font(df_font_from_slot(DF_FontSlot_Icons)) + UI_RunFlags(F_RunFlag_Smooth) + UI_Flags(UI_BoxFlag_DrawTextWeak) + ui_label(df_g_icon_kind_text_table[is_toggled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow]); + } + if(item->kind == DF_SettingsItemKind_ThemePreset && sv->preset_apply_confirm == item->preset) + { + ui_spacer(ui_pct(1, 0)); + UI_PrefWidth(ui_text_dim(10, 1)) + DF_Palette(DF_PaletteCode_NegativePopButton) + UI_CornerRadius(ui_top_font_size()*0.5f) + UI_FontSize(ui_top_font_size()*0.9f) + ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBackground, "Click Again To Apply"); + } } } } @@ -8962,6 +9020,14 @@ DF_VIEW_UI_FUNCTION_DEF(Settings) { sv->preset_apply_confirm = DF_ThemePreset_COUNT; } + if(item->kind != DF_SettingsItemKind_ThemePreset && ui_pressed(sig)) + { + sv->preset_apply_confirm = DF_ThemePreset_COUNT; + } + if(item->kind == DF_SettingsItemKind_CategoryHeader && ui_pressed(sig)) + { + sv->category_collapsed[item->category] ^= 1; + } } } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index cad2347c..88e7ed5e 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -439,9 +439,11 @@ struct DF_MemoryViewState typedef enum DF_SettingsItemKind { + DF_SettingsItemKind_CategoryHeader, DF_SettingsItemKind_Setting, DF_SettingsItemKind_ThemeColor, DF_SettingsItemKind_ThemePreset, + DF_SettingsItemKind_COUNT } DF_SettingsItemKind; @@ -457,6 +459,7 @@ struct DF_SettingsItem DF_SettingCode code; DF_ThemeColor color; DF_ThemePreset preset; + DF_SettingsItemKind category; }; typedef struct DF_SettingsItemNode DF_SettingsItemNode; diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 30597f35..cc94f995 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -4,15 +4,15 @@ //////////////////////////////// //~ rjf: 0.9.11 TODO // -// [ ] user settings (ui & functionality - generally need a story for it) -// [ ] hover animations -// [ ] press animations -// [ ] focus animations -// [ ] tooltip animations -// [ ] context menu animations -// [ ] scrolling animations -// [ ] background blur -// [ ] tab width +// [x] user settings (ui & functionality - generally need a story for it) +// [x] hover animations +// [x] press animations +// [x] focus animations +// [x] tooltip animations +// [x] context menu animations +// [x] scrolling animations +// [x] background blur +// [x] tab width // [ ] auto-scroll output window // // [ ] move breakpoints to being a global thing, not nested to particular files