ui min sizes, fixes to slider viz

This commit is contained in:
Ryan Fleury
2025-04-14 10:49:36 -07:00
parent b98f2b153e
commit 550950ed46
6 changed files with 54 additions and 6 deletions
+7 -5
View File
@@ -3294,6 +3294,8 @@ rd_cell(RD_CellParams *params, String8 string)
UI_PrefHeight(ui_px(height_px, 1.f))
UI_CornerRadius(floor_f32(height_px/2.f - 1.f))
{
F32 extratoggler_padding_px = floor_f32(ui_top_font_size()*0.35f);
F32 toggler_size_px = height_px - extratoggler_padding_px*2.f;
ui_set_next_hover_cursor(OS_Cursor_LeftRight);
UI_Box *slider_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, "slider");
UI_Parent(slider_box) UI_TagF("good_pop")
@@ -3305,28 +3307,28 @@ rd_cell(RD_CellParams *params, String8 string)
{
ui_store_drag_struct(params->slider_value_out);
}
F32 draggable_region_size_px = dim_2f32(slider_box->rect).x;
F32 initial_pct = *ui_get_drag_struct(F32);
F32 current_pct = initial_pct + (ui_drag_delta().x / dim_2f32(slider_box->rect).x);
F32 current_pct = initial_pct + (ui_drag_delta().x / draggable_region_size_px);
params->slider_value_out[0] = current_pct;
}
UI_Box *fill_box = &ui_nil_box;
UI_PrefWidth(ui_pct(Clamp(0, params->slider_value_out[0], 1), 0.f))
UI_MinWidth(toggler_size_px + extratoggler_padding_px*2)
fill_box = ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());
UI_Parent(fill_box)
{
ui_spacer(ui_pct(1, 0));
UI_BackgroundColor(ui_color_from_name(str8_lit("text")))
UI_PrefWidth(ui_px(height_px, 1.f))
{
ui_spacer(ui_pct(1.f, 0.f));
F32 extratoggler_padding_px = floor_f32(ui_top_font_size()*0.35f);
F32 toggler_size_px = height_px - extratoggler_padding_px*2.f;
UI_Column UI_Padding(ui_px(extratoggler_padding_px, 1.f))
UI_Row UI_Padding(ui_px(extratoggler_padding_px, 1.f))
UI_PrefWidth(ui_px(toggler_size_px, 1.f))
UI_PrefHeight(ui_px(toggler_size_px, 1.f))
UI_CornerRadius(floor_f32(toggler_size_px/2.f - 1.f))
{
UI_Box *nub = ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero());
ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero());
}
}
}
+12
View File
@@ -12,6 +12,8 @@
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width())
#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height())
#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags())
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags())
@@ -45,6 +47,8 @@ internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fi
internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) }
internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) }
internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) }
internal F32 ui_top_min_width(void) { UI_StackTopImpl(ui_state, MinWidth, min_width) }
internal F32 ui_top_min_height(void) { UI_StackTopImpl(ui_state, MinHeight, min_height) }
internal UI_PermissionFlags ui_top_permission_flags(void) { UI_StackTopImpl(ui_state, PermissionFlags, permission_flags) }
internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) }
internal UI_BoxFlags ui_top_omit_flags(void) { UI_StackTopImpl(ui_state, OmitFlags, omit_flags) }
@@ -76,6 +80,8 @@ internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWid
internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) }
internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) }
internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) }
internal F32 ui_bottom_min_width(void) { UI_StackBottomImpl(ui_state, MinWidth, min_width) }
internal F32 ui_bottom_min_height(void) { UI_StackBottomImpl(ui_state, MinHeight, min_height) }
internal UI_PermissionFlags ui_bottom_permission_flags(void) { UI_StackBottomImpl(ui_state, PermissionFlags, permission_flags) }
internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) }
internal UI_BoxFlags ui_bottom_omit_flags(void) { UI_StackBottomImpl(ui_state, OmitFlags, omit_flags) }
@@ -107,6 +113,8 @@ internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth,
internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) }
internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }
internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }
internal F32 ui_push_min_width(F32 v) { UI_StackPushImpl(ui_state, MinWidth, min_width, F32, v) }
internal F32 ui_push_min_height(F32 v) { UI_StackPushImpl(ui_state, MinHeight, min_height, F32, v) }
internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v) { UI_StackPushImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) }
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) }
internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) }
@@ -138,6 +146,8 @@ internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fi
internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) }
internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) }
internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) }
internal F32 ui_pop_min_width(void) { UI_StackPopImpl(ui_state, MinWidth, min_width) }
internal F32 ui_pop_min_height(void) { UI_StackPopImpl(ui_state, MinHeight, min_height) }
internal UI_PermissionFlags ui_pop_permission_flags(void) { UI_StackPopImpl(ui_state, PermissionFlags, permission_flags) }
internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) }
internal UI_BoxFlags ui_pop_omit_flags(void) { UI_StackPopImpl(ui_state, OmitFlags, omit_flags) }
@@ -169,6 +179,8 @@ internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, Fixe
internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) }
internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }
internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }
internal F32 ui_set_next_min_width(F32 v) { UI_StackSetNextImpl(ui_state, MinWidth, min_width, F32, v) }
internal F32 ui_set_next_min_height(F32 v) { UI_StackSetNextImpl(ui_state, MinHeight, min_height, F32, v) }
internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v) { UI_StackSetNextImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) }
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) }
internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) }
+22
View File
@@ -14,6 +14,8 @@ typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_
typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;};
typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;};
typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;};
typedef struct UI_MinWidthNode UI_MinWidthNode; struct UI_MinWidthNode{UI_MinWidthNode *next; F32 v;};
typedef struct UI_MinHeightNode UI_MinHeightNode; struct UI_MinHeightNode{UI_MinHeightNode *next; F32 v;};
typedef struct UI_PermissionFlagsNode UI_PermissionFlagsNode; struct UI_PermissionFlagsNode{UI_PermissionFlagsNode *next; UI_PermissionFlags v;};
typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;};
typedef struct UI_OmitFlagsNode UI_OmitFlagsNode; struct UI_OmitFlagsNode{UI_OmitFlagsNode *next; UI_BoxFlags v;};
@@ -49,6 +51,8 @@ UI_FixedWidthNode fixed_width_nil_stack_top;\
UI_FixedHeightNode fixed_height_nil_stack_top;\
UI_PrefWidthNode pref_width_nil_stack_top;\
UI_PrefHeightNode pref_height_nil_stack_top;\
UI_MinWidthNode min_width_nil_stack_top;\
UI_MinHeightNode min_height_nil_stack_top;\
UI_PermissionFlagsNode permission_flags_nil_stack_top;\
UI_FlagsNode flags_nil_stack_top;\
UI_OmitFlagsNode omit_flags_nil_stack_top;\
@@ -83,6 +87,8 @@ state->fixed_width_nil_stack_top.v = 0;\
state->fixed_height_nil_stack_top.v = 0;\
state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\
state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\
state->min_width_nil_stack_top.v = 0;\
state->min_height_nil_stack_top.v = 0;\
state->permission_flags_nil_stack_top.v = UI_PermissionFlag_All;\
state->flags_nil_stack_top.v = 0;\
state->omit_flags_nil_stack_top.v = 0;\
@@ -119,6 +125,8 @@ struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; U64 ge
struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; U64 gen; B32 auto_pop; } fixed_height_stack;\
struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; U64 gen; B32 auto_pop; } pref_width_stack;\
struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; U64 gen; B32 auto_pop; } pref_height_stack;\
struct { UI_MinWidthNode *top; F32 bottom_val; UI_MinWidthNode *free; U64 gen; B32 auto_pop; } min_width_stack;\
struct { UI_MinHeightNode *top; F32 bottom_val; UI_MinHeightNode *free; U64 gen; B32 auto_pop; } min_height_stack;\
struct { UI_PermissionFlagsNode *top; UI_PermissionFlags bottom_val; UI_PermissionFlagsNode *free; U64 gen; B32 auto_pop; } permission_flags_stack;\
struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; U64 gen; B32 auto_pop; } flags_stack;\
struct { UI_OmitFlagsNode *top; UI_BoxFlags bottom_val; UI_OmitFlagsNode *free; U64 gen; B32 auto_pop; } omit_flags_stack;\
@@ -153,6 +161,8 @@ state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_w
state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\
state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\
state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\
state->min_width_stack.top = &state->min_width_nil_stack_top; state->min_width_stack.bottom_val = 0; state->min_width_stack.free = 0; state->min_width_stack.auto_pop = 0;\
state->min_height_stack.top = &state->min_height_nil_stack_top; state->min_height_stack.bottom_val = 0; state->min_height_stack.free = 0; state->min_height_stack.auto_pop = 0;\
state->permission_flags_stack.top = &state->permission_flags_nil_stack_top; state->permission_flags_stack.bottom_val = UI_PermissionFlag_All; state->permission_flags_stack.free = 0; state->permission_flags_stack.auto_pop = 0;\
state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\
state->omit_flags_stack.top = &state->omit_flags_nil_stack_top; state->omit_flags_stack.bottom_val = 0; state->omit_flags_stack.free = 0; state->omit_flags_stack.auto_pop = 0;\
@@ -187,6 +197,8 @@ if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width
if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\
if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\
if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\
if(state->min_width_stack.auto_pop) { ui_pop_min_width(); state->min_width_stack.auto_pop = 0; }\
if(state->min_height_stack.auto_pop) { ui_pop_min_height(); state->min_height_stack.auto_pop = 0; }\
if(state->permission_flags_stack.auto_pop) { ui_pop_permission_flags(); state->permission_flags_stack.auto_pop = 0; }\
if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\
if(state->omit_flags_stack.auto_pop) { ui_pop_omit_flags(); state->omit_flags_stack.auto_pop = 0; }\
@@ -220,6 +232,8 @@ internal F32 ui_top_fixed_width(void);
internal F32 ui_top_fixed_height(void);
internal UI_Size ui_top_pref_width(void);
internal UI_Size ui_top_pref_height(void);
internal F32 ui_top_min_width(void);
internal F32 ui_top_min_height(void);
internal UI_PermissionFlags ui_top_permission_flags(void);
internal UI_BoxFlags ui_top_flags(void);
internal UI_BoxFlags ui_top_omit_flags(void);
@@ -252,6 +266,8 @@ internal F32 ui_bottom_fixed_width(void);
internal F32 ui_bottom_fixed_height(void);
internal UI_Size ui_bottom_pref_width(void);
internal UI_Size ui_bottom_pref_height(void);
internal F32 ui_bottom_min_width(void);
internal F32 ui_bottom_min_height(void);
internal UI_PermissionFlags ui_bottom_permission_flags(void);
internal UI_BoxFlags ui_bottom_flags(void);
internal UI_BoxFlags ui_bottom_omit_flags(void);
@@ -284,6 +300,8 @@ internal F32 ui_push_fixed_width(F32 v);
internal F32 ui_push_fixed_height(F32 v);
internal UI_Size ui_push_pref_width(UI_Size v);
internal UI_Size ui_push_pref_height(UI_Size v);
internal F32 ui_push_min_width(F32 v);
internal F32 ui_push_min_height(F32 v);
internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v);
internal UI_BoxFlags ui_push_flags(UI_BoxFlags v);
internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v);
@@ -316,6 +334,8 @@ internal F32 ui_pop_fixed_width(void);
internal F32 ui_pop_fixed_height(void);
internal UI_Size ui_pop_pref_width(void);
internal UI_Size ui_pop_pref_height(void);
internal F32 ui_pop_min_width(void);
internal F32 ui_pop_min_height(void);
internal UI_PermissionFlags ui_pop_permission_flags(void);
internal UI_BoxFlags ui_pop_flags(void);
internal UI_BoxFlags ui_pop_omit_flags(void);
@@ -348,6 +368,8 @@ internal F32 ui_set_next_fixed_width(F32 v);
internal F32 ui_set_next_fixed_height(F32 v);
internal UI_Size ui_set_next_pref_width(UI_Size v);
internal UI_Size ui_set_next_pref_height(UI_Size v);
internal F32 ui_set_next_min_width(F32 v);
internal F32 ui_set_next_min_height(F32 v);
internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v);
internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v);
internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v);
+2
View File
@@ -19,6 +19,8 @@ UI_StackTable:
{ FixedHeight fixed_height F32 0 }
{ PrefWidth pref_width UI_Size `ui_px(250.f, 1.f)` }
{ PrefHeight pref_height UI_Size `ui_px(30.f, 1.f)` }
{ MinWidth min_width F32 0 }
{ MinHeight min_height F32 0 }
//- rjf: flags
{ PermissionFlags permission_flags UI_PermissionFlags UI_PermissionFlag_All }
+8 -1
View File
@@ -1757,7 +1757,6 @@ ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis)
}
}
}
}
//- rjf: fixup children sizes (in the direction of the layout axis)
@@ -1825,6 +1824,12 @@ ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis)
}
}
//- rjf: enforce clamps
for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next)
{
child->fixed_size.v[axis] = Max(child->fixed_size.v[axis], child->min_size.v[axis]);
}
//- rjf: recurse
for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next)
{
@@ -2424,6 +2429,8 @@ ui_build_box_from_key(UI_BoxFlags flags, UI_Key key)
{
box->pref_size[Axis2_Y] = ui_state->pref_height_stack.top->v;
}
box->min_size.v[Axis2_X] = ui_state->min_width_stack.top->v;
box->min_size.v[Axis2_Y] = ui_state->min_height_stack.top->v;
B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);
B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key);
+3
View File
@@ -390,6 +390,7 @@ struct UI_Box
UI_TextAlign text_align;
Vec2F32 fixed_position;
Vec2F32 fixed_size;
Vec2F32 min_size;
UI_Size pref_size[Axis2_COUNT];
Axis2 child_layout_axis;
OS_Cursor hover_cursor;
@@ -1129,6 +1130,8 @@ internal F32 ui_top_px_height(void);
#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())
#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())
#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())
#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width())
#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height())
#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags())
#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())
#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags())