refactor from per-box ui input state to global input state w/ per-box capture propagation

This commit is contained in:
jacob 2026-03-30 23:45:29 -05:00
parent b2a9b3091d
commit d7c42d2462
3 changed files with 427 additions and 806 deletions

View File

@ -1149,7 +1149,7 @@ void V_TickForever(WaveLaneCtx *lane)
V_TextboxDeltaList text_input_deltas = Zi;
frame->has_mouse_focus = UI_IsKeyNil(ui_frame->hot_box) || UI_MatchKey(ui_frame->hot_box, vis_game_box);
frame->has_mouse_focus = UI_IsKeyNil(ui_frame->top_hot_box) || UI_MatchKey(ui_frame->top_hot_box, vis_game_box);
frame->has_keyboard_focus = 1;
Vec2 mouse_delta = Zi;
{
@ -3839,7 +3839,7 @@ void V_TickForever(WaveLaneCtx *lane)
}
// Insert ghost tab
if (V.dragging_window && UI_Hovered(panel->key))
if (V.dragging_window && UI_HotAbsolute(panel->key))
{
DrawableTab *left = 0;
DrawableTab *right = first_drawable_tab;
@ -4272,7 +4272,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_SetNext(AxisSize, UI_PIX(divider_size, 1), .axis = !panel->axis);
UI_BuildBoxEx(panel->divider_key);
if (UI_TargetHot(panel->divider_key) || UI_Held(panel->divider_key, Button_M1))
if (UI_HotAbsolute(panel->divider_key) || UI_Held(panel->divider_key, Button_M1))
{
if (panel->axis == Axis_X)
{
@ -4347,6 +4347,12 @@ void V_TickForever(WaveLaneCtx *lane)
{
UI_Push(Tag, HashF("developer command palette"));
// FIXME: Remove this
if (frame->tick == 1)
{
palette->pos = VEC2(1000, 1000);
}
UI_Size total_width = UI_FNT(40, 1);
UI_Size total_height = UI_FNT(30, 1);
UI_Size header_height = UI_FNT(1.3, 1);
@ -4570,7 +4576,7 @@ void V_TickForever(WaveLaneCtx *lane)
has_focus = 0;
}
if (UI_TargetHot(search_box))
if (UI_HotAbsolute(search_box))
{
WND_SetCursor(window_frame, WND_CursorKind_Text);
}
@ -4948,7 +4954,7 @@ void V_TickForever(WaveLaneCtx *lane)
{
new_tweak_str = tweak_var.initial;
}
if (UI_TargetHot(reset_key))
if (UI_HotAbsolute(reset_key))
{
WND_SetCursor(window_frame, WND_CursorKind_Hand);
}
@ -5040,7 +5046,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_Key slider_key = UI_KeyF("tweak slider");
UI_Key marker_key = UI_KeyF("tweak slider marker");
b32 is_hot = UI_TargetHot(slider_key) || UI_TargetHot(marker_key);
b32 is_hot = UI_HotAbsolute(slider_key) || UI_HotAbsolute(marker_key);
b32 is_active = UI_Held(slider_key, Button_M1) || UI_Held(marker_key, Button_M1);
f32 hot = MaxF32(UI_Hot(slider_key), UI_Hot(marker_key));
@ -5157,7 +5163,7 @@ void V_TickForever(WaveLaneCtx *lane)
pressed_color.w = 0.2;
f32 hotkey_hot = UI_Hot(hotkey_box);
f32 hotkey_active = UI_Active(hotkey_box);
f32 hotkey_hovered = UI_Hovered(hotkey_box);
f32 hotkey_hovered = UI_HotAbsolute(hotkey_box);
hotkey_color = LerpSrgb(hotkey_color, hovered_color, hotkey_hot);
hotkey_color = LerpSrgb(hotkey_color, pressed_color, hotkey_active * hotkey_hovered);
hotkey_border_color = LerpSrgb(hotkey_border_color, Rgb32(0x0078a6), hotkey_hot);
@ -5546,6 +5552,8 @@ void V_TickForever(WaveLaneCtx *lane)
// if (profiler->is_dragging && !prev_frame->profiler.is_dragging)
// {
// profiler->drag_view_ns = profiler->view_ns;
@ -5637,11 +5645,12 @@ void V_TickForever(WaveLaneCtx *lane)
//- Main
if (do_break)
{
UI_SetNext(DebugBreakFlags, UI_DebugBreakFlag_BuildReport);
UI_SetNext(DebugBreakFlags, UI_DebugBreakFlag_BuildFeedback);
UI_SetNext(Text, Lit("MAIN"));
}
UI_SetNext(Height, main_height);
UI_SetNext(Flags, UI_BoxFlag_CaptureMouse | UI_BoxFlag_CaptureThroughChildren);
// UI_SetNext(Flags, UI_BoxFlag_CaptureMouse);
UI_PushDF(Parent, UI_BuildColumnEx(main_box))
{
@ -5803,6 +5812,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_Key zone_box = UI_KeyF("Zone %F", FmtUint(zone_idx));
Vec4 zone_color = zone->color;
zone_color = LerpSrgb(zone_color, Color_Cyan, UI_Hot(zone_box));
// Vec4 zone_color_bd = Zi;
// zone_color_bd
@ -5815,11 +5825,11 @@ void V_TickForever(WaveLaneCtx *lane)
Vec2 zone_pos = VEC2(zone_offset_px, 0);
UI_Size zone_width = UI_PIX(zone_len_px, 1);
if (do_break && UI_TargetHovered(zone_box))
UI_SetNext(Text, StringF(frame->arena, "ZONE %F", FmtUint(zone_idx)));
// if (do_break && UI_IsMouseHovered(zone_box))
if (do_break && zone_idx == 0)
{
UI_SetNext(DebugBreakFlags, UI_DebugBreakFlag_BuildReport);
UI_SetNext(Text, StringF(frame->arena, "ZONE %F", FmtUint(zone_idx)));
UI_SetNext(DebugBreakFlags, UI_DebugBreakFlag_BuildFeedback | UI_DebugBreakFlag_CheckCursorHover);
}
@ -5829,6 +5839,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_SetNext(BackgroundColor, zone_color);
UI_SetNext(FloatingPos, zone_pos);
UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_NoFloatingClampX | UI_BoxFlag_NoFloatingClampY | UI_BoxFlag_CaptureMouse);
// UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_NoFloatingClampX | UI_BoxFlag_NoFloatingClampY);
UI_PushDF(Parent, UI_BuildBoxEx(zone_box))
{
}

File diff suppressed because it is too large Load Diff

View File

@ -102,15 +102,16 @@ Enum(UI_BoxFlag)
Enum(UI_DebugBreakFlag)
{
UI_DebugBreakFlag_None = 0,
UI_DebugBreakFlag_BuildReport = (1 << 0),
UI_DebugBreakFlag_PrepLayout = (1 << 1),
UI_DebugBreakFlag_IndependentSolve = (1 << 2),
UI_DebugBreakFlag_UpwardsDependentSolveLayoutAxis = (1 << 3),
UI_DebugBreakFlag_DownwardsDependentSolve = (1 << 4),
UI_DebugBreakFlag_UpwardsDependentSolveNonLayoutAxis = (1 << 5),
UI_DebugBreakFlag_SolveViolations = (1 << 6),
UI_DebugBreakFlag_FinalSolve = (1 << 7),
UI_DebugBreakFlag_BuildGpuData = (1 << 8),
UI_DebugBreakFlag_CheckCursorHover = (1 << 0),
UI_DebugBreakFlag_BuildFeedback = (1 << 1),
UI_DebugBreakFlag_PrepLayout = (1 << 2),
UI_DebugBreakFlag_IndependentSolve = (1 << 3),
UI_DebugBreakFlag_UpwardsDependentSolveLayoutAxis = (1 << 4),
UI_DebugBreakFlag_DownwardsDependentSolve = (1 << 5),
UI_DebugBreakFlag_UpwardsDependentSolveNonLayoutAxis = (1 << 6),
UI_DebugBreakFlag_SolveViolations = (1 << 7),
UI_DebugBreakFlag_FinalSolve = (1 << 8),
UI_DebugBreakFlag_BuildGpuData = (1 << 9),
UI_DebugBreakFlag_All = 0xFFFFFFFF
};
@ -225,28 +226,23 @@ Struct(UI_InputState)
};
////////////////////////////////////////////////////////////
//~ Report types
//~ Feedback types
// Struct(UI_BoxReport)
// {
// Rng2 screen_rect;
// Vec2 screen_anchor;
Struct(UI_Feedback)
{
Rng2 screen_rect;
Vec2 screen_anchor;
// b32 is_hovered;
// b32 is_hot;
b32 active_absolute;
b32 hot_absolute;
b32 exists_absolute;
// f32 exists;
// f32 hovered;
// f32 hot;
// f32 active;
// f64 misc;
// };
f32 active_smooth;
f32 hot_smooth;
f32 exists_smooth;
// Struct(UI_BoxReports)
// {
// UI_BoxReport draw; // Box data used for last render
// UI_BoxReport drag; // Box data during last mouse button down event
// };
f64 misc_smooth;
};
////////////////////////////////////////////////////////////
//~ Command types
@ -255,7 +251,6 @@ Enum(UI_CmdKind)
{
UI_CmdKind_None,
UI_CmdKind_BuildBox,
UI_CmdKind_Signal,
UI_CmdKind_SetRawTexture,
};
@ -300,12 +295,6 @@ Struct(UI_Cmd)
{
UI_BoxDesc box;
struct
{
UI_Key key;
Button button;
UI_ButtonState button_state;
} signal;
struct
{
UI_Key key;
G_TextureRef tex;
@ -368,6 +357,12 @@ Struct(UI_Box)
f32 rounding_tr;
f32 rounding_br;
f32 rounding_bl;
//- Feedback
b32 mouse_hovered;
b32 mouse_captured;
UI_Feedback feedback;
UI_Feedback drag_feedback;
};
Struct(UI_BoxBin)
@ -424,12 +419,12 @@ Struct(UI_Frame)
// Input
Vec2 cursor_pos;
Vec2 drag_cursor_pos;
UI_InputState input_state;
UI_InputState drag_input_state;
UI_InputState input;
UI_InputState drag_input;
UI_Key top_hovered_box;
UI_Key hot_box;
UI_Key active_box;
UI_Key top_hot_box;
UI_Key top_active_box;
// Cmds
UI_FrameFlag frame_flags;
@ -554,7 +549,6 @@ UI_Key UI_BuildBoxEx(UI_Key semantic_key);
#define UI_BuildBox() UI_BuildBoxEx(UI_NilKey)
void UI_SetRawTexture(UI_Key key, G_TextureRef tex, Rng2 uv);
UI_ButtonState *UI_SignalButton(UI_Key key, Button button);
#if IsRtcEnabled
#define UI_DebugBreak(box, target_flags) do { if (box->desc.debug_break_flags & target_flags) { DEBUGBREAK; } } while (0)
@ -562,7 +556,6 @@ UI_ButtonState *UI_SignalButton(UI_Key key, Button button);
#define UI_DebugBreak(...)
#endif
////////////////////////////////////////////////////////////
//~ Begin frame
@ -578,30 +571,30 @@ Arena *UI_FrameArena(void);
////////////////////////////////////////////////////////////
//~ Feedback
//- Passive
b32 UI_IsButtonPassive(Button button);
//- Input
i32 UI_Downs(UI_Key key, Button button);
b32 UI_Held(UI_Key key, Button button);
b32 UI_Ups(UI_Key key, Button button);
b32 UI_Presses(UI_Key key, Button button);
i32 UI_Downs(UI_Key key, Button button);
i32 UI_Ups(UI_Key key, Button button);
i32 UI_Presses(UI_Key key, Button button);
//- Interaction
f32 UI_Exists(UI_Key key);
f32 UI_TargetExists(UI_Key key);
f32 UI_Hovered(UI_Key key);
f32 UI_TargetHovered(UI_Key key);
f32 UI_Active(UI_Key key);
f32 UI_TargetActive(UI_Key key);
b32 UI_ActiveAbsolute(UI_Key key);
f32 UI_Hot(UI_Key key);
f32 UI_TargetHot(UI_Key key);
b32 UI_HotAbsolute(UI_Key key);
f32 UI_Misc(UI_Key key);
f32 UI_DragMisc(UI_Key key);
f32 UI_TargetMisc(UI_Key key);
f32 UI_Exists(UI_Key key);
b32 UI_ExistsAbsolute(UI_Key);
f64 UI_Misc(UI_Key key);
f64 UI_DragMisc(UI_Key key);
//- Layout