panel interaction testing
This commit is contained in:
parent
87d54b2ea6
commit
4410f63c71
@ -138,7 +138,7 @@ void V_EndCommandsWidget(V_CommandsWidget *widget)
|
||||
Vec4 divider_color = theme.divider_color;
|
||||
{
|
||||
UI_Report rep = UI_ReportFromKey(titlebar_key);
|
||||
if (rep.m1_held)
|
||||
if (rep.is_m1_held)
|
||||
{
|
||||
widget->pos = SubVec2(cursor_pos, rep.last_m1_offset);
|
||||
}
|
||||
@ -583,16 +583,18 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
V_CmdNode *first_cmd_node = 0;
|
||||
V_CmdNode *last_cmd_node = 0;
|
||||
|
||||
if (!window_frame.has_focus)
|
||||
b32 has_focus = window_frame.has_focus && UI_MatchKey(ui_frame->hovered_box, UI_NilKey);
|
||||
if (!has_focus)
|
||||
{
|
||||
ZeroStructs(frame->held_buttons, countof(frame->held_buttons));
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < window_frame.controller_events.count; ++i)
|
||||
{
|
||||
ControllerEvent cev = window_frame.controller_events.events[i];
|
||||
b32 down = cev.kind == ControllerEventKind_ButtonDown;
|
||||
b32 up = cev.kind == ControllerEventKind_ButtonUp;
|
||||
if (down || up)
|
||||
if (up || (down && has_focus))
|
||||
{
|
||||
V_Hotkey hotkey = Zi;
|
||||
hotkey.button = cev.button;
|
||||
@ -793,10 +795,10 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
{
|
||||
V_Panel *panel = PushStruct(perm, V_Panel);
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys for panels */
|
||||
panel->axis = Axis_X;
|
||||
// panel->pref_size[Axis_X] = UI_PIX(frame->ui_dims.x, 0);
|
||||
// panel->pref_size[Axis_Y] = UI_PIX(frame->ui_dims.y, 0);
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys for panels */
|
||||
panel->pref_size[Axis_X] = UI_GROW(1, 0);
|
||||
panel->pref_size[Axis_Y] = UI_GROW(1, 0);
|
||||
panel->is_organizing_panel = 1;
|
||||
@ -806,8 +808,8 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
V_Panel *panel = PushStruct(perm, V_Panel);
|
||||
panel->parent = V.root_panel;
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys */
|
||||
panel->axis = !panel->parent->axis;
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys for panels */
|
||||
panel->pref_size[Axis_X] = UI_GROW(1, 0);
|
||||
panel->pref_size[Axis_Y] = UI_GROW(1, 0);
|
||||
DllQueuePush(panel->parent->first, panel->parent->last, panel);
|
||||
@ -816,6 +818,7 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
V_Window *window = PushStruct(perm, V_Window);
|
||||
window->panel = panel;
|
||||
window->key = UI_TransKey(); /* TODO: Don't use transient keys */
|
||||
// window->is_tile_window = 1;
|
||||
DllQueuePushNP(panel->first_window, panel->last_window, window, next_in_panel, prev_in_panel);
|
||||
++panel->windows_count;
|
||||
@ -823,6 +826,7 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
V_Window *window = PushStruct(perm, V_Window);
|
||||
window->panel = panel;
|
||||
window->key = UI_TransKey(); /* TODO: Don't use transient keys */
|
||||
window->is_tile_window = 1;
|
||||
DllQueuePushNP(panel->first_window, panel->last_window, window, next_in_panel, prev_in_panel);
|
||||
++panel->windows_count;
|
||||
@ -833,8 +837,8 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
V_Panel *panel = PushStruct(perm, V_Panel);
|
||||
panel->parent = V.root_panel;
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys */
|
||||
panel->axis = !panel->parent->axis;
|
||||
panel->key = UI_TransKey(); /* TODO: Don't use transient keys for panels */
|
||||
panel->pref_size[Axis_X] = UI_GROW(1, 0);
|
||||
panel->pref_size[Axis_Y] = UI_GROW(1, 0);
|
||||
DllQueuePush(panel->parent->first, panel->parent->last, panel);
|
||||
@ -843,49 +847,12 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
V_Window *window = PushStruct(perm, V_Window);
|
||||
window->panel = panel;
|
||||
window->key = UI_TransKey(); /* TODO: Don't use transient keys */
|
||||
window->is_viewport_window = 1;
|
||||
DllQueuePushNP(panel->first_window, panel->last_window, window, next_in_panel, prev_in_panel);
|
||||
++panel->windows_count;
|
||||
}
|
||||
}
|
||||
|
||||
// {
|
||||
// V_Space *space = PushStruct(perm, V_Space);
|
||||
// space->parent = V.root_space;
|
||||
// space->axis = !space->parent->axis;
|
||||
// space->pref_size[Axis_X] = UI_GROW(1, 0);
|
||||
// space->pref_size[Axis_Y] = UI_GROW(1, 0);
|
||||
// DllQueuePush(space->parent->first, space->parent->last, space);
|
||||
// ++space->parent->count;
|
||||
|
||||
// V_Panel *panel = PushStruct(perm, V_Panel);
|
||||
// panel->space = space;
|
||||
// DllQueuePushNP(space->first_panel, space->last_panel, panel, next_in_space, prev_in_space);
|
||||
// ++space->panels_count;
|
||||
|
||||
// {
|
||||
// V_Window *window = PushStruct(perm, V_Window);
|
||||
// window->panel = panel;
|
||||
// window->is_viewport_window = 1;
|
||||
// DllQueuePushNP(panel->first_window, panel->last_window, window, next_in_panel, prev_in_panel);
|
||||
// ++panel->windows_count;
|
||||
// }
|
||||
// }
|
||||
|
||||
// {
|
||||
// V_Panel *panel = PushStruct(perm, V_Panel);
|
||||
// panel->space = space;
|
||||
// DllQueuePushNP(space->first_panel, space->last_panel, panel, next_in_space, prev_in_space);
|
||||
// ++space->panels_count;
|
||||
|
||||
// {
|
||||
// V_Window *window = PushStruct(perm, V_Window);
|
||||
// window->panel = panel;
|
||||
// // window->is_tile_window = 1;
|
||||
// DllQueuePushNP(panel->first_window, panel->last_window, window, next_in_panel, prev_in_panel);
|
||||
// ++panel->windows_count;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
if (frame->is_editing)
|
||||
@ -919,10 +886,12 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
UI_BuildColumnEx(panel->key);
|
||||
}
|
||||
UI_Push(Tag, panel->key.hash);
|
||||
panel_dfs->cp = UI_PushCP(panel->key);
|
||||
|
||||
if (!panel->is_organizing_panel)
|
||||
{
|
||||
i64 new_active_window_idx = panel->active_window_idx;
|
||||
// UI_SetNext(Width, UI_SHRINK(0, 1));
|
||||
// UI_SetNext(Width, UI_GROW(1, 0));
|
||||
// UI_SetNext(Height, UI_GROW(1, 0));
|
||||
@ -941,22 +910,39 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
if (!window->is_viewport_window)
|
||||
{
|
||||
UI_Report rep = UI_ReportFromKey(window->key);
|
||||
if (rep.m1_downs > 0)
|
||||
{
|
||||
new_active_window_idx = window_idx;
|
||||
}
|
||||
|
||||
Vec4 border_color = VEC4(0.5, 0.5, 0.5, 1);
|
||||
|
||||
UI_BuildSpacer(UI_PIX(tab_spacing, 0), Axis_X);
|
||||
if (window_idx == active_window_idx)
|
||||
{
|
||||
active_window = window;
|
||||
UI_SetNext(BorderColor, VEC4(0.9, 0.5, 0.5, 1));
|
||||
border_color = VEC4(0.9, 0.5, 0.5, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
UI_SetNext(BorderColor, VEC4(0.5, 0.5, 0.5, 1));
|
||||
}
|
||||
UI_SetNext(BackgroundColor, VEC4(0.2, 0.2, 0.2, 1));
|
||||
|
||||
Vec4 hovered_color = VEC4(0.5, 0.5, 0.5, 1);
|
||||
Vec4 pressed_color = hovered_color;
|
||||
pressed_color.w = 0.2;
|
||||
|
||||
Vec4 bg_color = theme.window_background_color;
|
||||
bg_color.x = 0.4;
|
||||
bg_color = BlendSrgb(bg_color, hovered_color, rep.hot);
|
||||
bg_color = BlendSrgb(bg_color, pressed_color, rep.active * rep.hovered);
|
||||
|
||||
|
||||
UI_SetNext(BackgroundColor, bg_color);
|
||||
UI_SetNext(BorderColor, border_color);
|
||||
UI_SetNext(Border, 1);
|
||||
UI_SetNext(Width, UI_SHRINK(theme.text_padding_x, 1));
|
||||
UI_SetNext(Height, UI_SHRINK(theme.text_padding_y, 1));
|
||||
UI_SetNext(ChildAlignment, UI_Alignment_Center);
|
||||
UI_PushCP(UI_BuildRow());
|
||||
UI_SetNext(Flags, UI_BoxFlag_Interactable);
|
||||
UI_PushCP(UI_BuildRowEx(window->key));
|
||||
{
|
||||
if (window->is_tile_window)
|
||||
{
|
||||
@ -1001,6 +987,7 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
}
|
||||
}
|
||||
UI_PopCP(UI_TopCP());
|
||||
panel->active_window_idx = new_active_window_idx;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1011,14 +998,29 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
//- Build divider
|
||||
if (panel->next != 0)
|
||||
{
|
||||
UI_Key divider_key = UI_TransKey();
|
||||
UI_SetNext(BackgroundColor, Color_Cyan);
|
||||
UI_Key divider_key = UI_KeyF("Divider");
|
||||
UI_Report rep = UI_ReportFromKey(divider_key);
|
||||
|
||||
// Vec4 hovered_color = Rgb32(0x103c4c);
|
||||
Vec4 hovered_color = VEC4(0.5, 0.5, 0.5, 1);
|
||||
Vec4 pressed_color = hovered_color;
|
||||
pressed_color.w = 0.2;
|
||||
|
||||
Vec4 bg_color = theme.window_background_color;
|
||||
bg_color.x = 0.4;
|
||||
bg_color = BlendSrgb(bg_color, hovered_color, rep.hot);
|
||||
bg_color = BlendSrgb(bg_color, pressed_color, rep.active * rep.hovered);
|
||||
|
||||
UI_SetNext(Flags, UI_BoxFlag_Interactable);
|
||||
UI_SetNext(BackgroundColor, bg_color);
|
||||
// UI_SetNext(Border, 2);
|
||||
UI_SetNext(AxisSize, UI_GROW(1, 1), .axis = panel->axis);
|
||||
UI_SetNext(AxisSize, UI_PIX(5, 1), .axis = !panel->axis);
|
||||
UI_SetNext(AxisSize, UI_PIX(3, 1), .axis = !panel->axis);
|
||||
/* FIXME: Non-transient key */
|
||||
UI_BuildBoxEx(divider_key);
|
||||
}
|
||||
|
||||
UI_Pop(Tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1176,7 +1178,7 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
}
|
||||
else
|
||||
{
|
||||
UI_SetNext(BackgroundColor, Rgba(1, 1, 1, 0.02));
|
||||
UI_SetNext(BackgroundColor, Rgba(0, 0, 0, 1));
|
||||
UI_SetNext(Width, UI_GROW(1, 0));
|
||||
UI_SetNext(Height, UI_SHRINK(0, 1));
|
||||
}
|
||||
|
||||
@ -177,6 +177,8 @@ Struct(V_Window)
|
||||
V_Window *next_in_panel;
|
||||
V_Window *prev_in_panel;
|
||||
|
||||
UI_Key key;
|
||||
|
||||
b32 is_tile_window;
|
||||
b32 is_viewport_window;
|
||||
};
|
||||
|
||||
@ -14,7 +14,7 @@ ComputeShader2D(V_BackdropCS, 8, 8)
|
||||
const Vec4 y_axis_color = LinearFromSrgb(Vec4(0, 0.75, 0, 1));
|
||||
const Vec4 bounds_color = LinearFromSrgb(Vec4(0.75, 0.75, 0, 1));
|
||||
|
||||
Vec2 screen_pos = Vec2(SV_DispatchThreadID) + Vec2(0.5, 0.5);
|
||||
Vec2 screen_pos = SV_DispatchThreadID + Vec2(0.5, 0.5);
|
||||
if (screen_pos.x < params.target_size.x && screen_pos.y < params.target_size.y)
|
||||
{
|
||||
Vec4 result = Vec4(0.025, 0.025, 0.025, 1);
|
||||
@ -118,8 +118,7 @@ ComputeShader2D(V_BackdropCS, 8, 8)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
target[trunc(screen_pos)] = result;
|
||||
target[SV_DispatchThreadID] = result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -695,7 +695,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
|
||||
if (hovered_box)
|
||||
{
|
||||
++hovered_box->report.m1_downs;
|
||||
hovered_box->report.m1_held = 1;
|
||||
hovered_box->report.is_m1_held = 1;
|
||||
hovered_box->report.last_m1_offset = SubVec2(frame->cursor_pos, hovered_box->rect.p0);
|
||||
active_box = hovered_box;
|
||||
}
|
||||
@ -713,7 +713,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
|
||||
++active_box->report.m1_presses;
|
||||
}
|
||||
++active_box->report.m1_ups;
|
||||
active_box->report.m1_held = 0;
|
||||
active_box->report.is_m1_held = 0;
|
||||
active_box = 0;
|
||||
}
|
||||
}
|
||||
@ -731,6 +731,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags, Vec4 swapchain_color)
|
||||
{
|
||||
UI_Box *box = last_frame->boxes_pre[pre_index];
|
||||
UI_Report *report = &box->report;
|
||||
report->is_hovered = box == hovered_box;
|
||||
f32 target_hot = box == active_box || (box == hovered_box && (box == active_box || active_box == 0));
|
||||
f32 target_active = box == active_box;
|
||||
f32 target_hovered = box == hovered_box;
|
||||
|
||||
@ -174,7 +174,8 @@ Struct(UI_Stack)
|
||||
|
||||
Struct(UI_Report)
|
||||
{
|
||||
b32 m1_held;
|
||||
b32 is_m1_held;
|
||||
b32 is_hovered;
|
||||
|
||||
f32 hovered;
|
||||
f32 hot;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user