theme presets in new settings view

This commit is contained in:
Ryan Fleury
2024-06-26 15:16:41 -07:00
parent 4bbf64de7e
commit 7584890edd
2 changed files with 81 additions and 1 deletions
+79 -1
View File
@@ -8481,6 +8481,7 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
typedef struct DF_SettingsViewState DF_SettingsViewState;
struct DF_SettingsViewState
{
B32 initialized;
Vec2S64 cursor;
TxtPt txt_cursor;
TxtPt txt_mark;
@@ -8488,8 +8489,14 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
U64 txt_size;
DF_ThemeColor color_ctx_menu_color;
Vec4F32 color_ctx_menu_color_hsva;
DF_ThemePreset preset_apply_confirm;
};
DF_SettingsViewState *sv = df_view_user_state(view, DF_SettingsViewState);
if(!sv->initialized)
{
sv->initialized = 1;
sv->preset_apply_confirm = DF_ThemePreset_COUNT;
}
//////////////////////////////
//- rjf: gather all filtered settings items
@@ -8521,6 +8528,29 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
}
}
//- rjf: gather theme presets
for(EachEnumVal(DF_ThemePreset, 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))
{
@@ -8747,6 +8777,14 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
}
}
//////////////////////////////
//- rjf: cancels
//
UI_Focus(UI_FocusKind_On) if(ui_is_focus_active() && sv->preset_apply_confirm < DF_ThemePreset_COUNT && ui_slot_press(UI_EventActionSlot_Cancel))
{
sv->preset_apply_confirm = DF_ThemePreset_COUNT;
}
//////////////////////////////
//- rjf: build items list
//
@@ -8770,6 +8808,7 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
{
//- rjf: unpack item
DF_SettingsItem *item = &items.v[row_num];
UI_Palette *palette = ui_top_palette();
Vec4F32 rgba = ui_top_palette()->text_weak;
OS_Cursor cursor = OS_Cursor_HandPoint;
Rng1S32 s32_range = {0};
@@ -8780,6 +8819,19 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
F32 slider_pct = 0.f;
switch(item->kind)
{
case DF_SettingsItemKind_ThemePreset:
{
Vec4F32 *colors = df_g_theme_preset_colors_table[item->preset];
Vec4F32 bg_color = colors[DF_ThemeColor_BaseBackground];
Vec4F32 tx_color = colors[DF_ThemeColor_Text];
Vec4F32 tw_color = colors[DF_ThemeColor_TextWeak];
Vec4F32 bd_color = colors[DF_ThemeColor_BaseBorder];
palette = ui_build_palette(ui_top_palette(),
.text = tx_color,
.text_weak = tw_color,
.border = bd_color,
.background = bg_color);
}break;
case DF_SettingsItemKind_ThemeColor:
{
rgba = df_rgba_from_theme_color(item->color);
@@ -8804,7 +8856,7 @@ 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_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|
@@ -8850,6 +8902,15 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
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");
}
}
}
@@ -8884,6 +8945,23 @@ DF_VIEW_UI_FUNCTION_DEF(Settings)
df_gfx_state->cfg_setting_vals[DF_CfgSrc_User][item->code].s32 = pst_drag_val;
df_gfx_state->cfg_setting_vals[DF_CfgSrc_User][item->code].set = 1;
}
if(item->kind == DF_SettingsItemKind_ThemePreset && ui_clicked(sig))
{
if(sv->preset_apply_confirm == item->preset)
{
Vec4F32 *colors = df_g_theme_preset_colors_table[item->preset];
MemoryCopy(df_gfx_state->cfg_theme_target.colors, colors, sizeof(df_gfx_state->cfg_theme_target.colors));
sv->preset_apply_confirm = DF_ThemePreset_COUNT;
}
else
{
sv->preset_apply_confirm = item->preset;
}
}
if(item->kind != DF_SettingsItemKind_ThemePreset && ui_pressed(sig))
{
sv->preset_apply_confirm = DF_ThemePreset_COUNT;
}
}
}
+2
View File
@@ -441,6 +441,7 @@ typedef enum DF_SettingsItemKind
{
DF_SettingsItemKind_Setting,
DF_SettingsItemKind_ThemeColor,
DF_SettingsItemKind_ThemePreset,
}
DF_SettingsItemKind;
@@ -455,6 +456,7 @@ struct DF_SettingsItem
DF_IconKind icon_kind;
DF_SettingCode code;
DF_ThemeColor color;
DF_ThemePreset preset;
};
typedef struct DF_SettingsItemNode DF_SettingsItemNode;