checkpoint on new drag/drop system; eliminate old drag/drop payload, just use regs like everything else

This commit is contained in:
Ryan Fleury
2024-09-16 17:25:21 -07:00
parent 4b382777e9
commit 35659a4525
3 changed files with 60 additions and 99 deletions
+47 -65
View File
@@ -1050,25 +1050,24 @@ rd_drag_is_active(void)
}
internal void
rd_drag_begin(RD_DragDropPayload *payload)
rd_drag_begin(void)
{
if(!rd_drag_is_active())
{
arena_clear(rd_state->drag_drop_arena);
rd_state->drag_drop_regs = rd_regs_copy(rd_state->drag_drop_arena, rd_regs());
rd_state->drag_drop_state = RD_DragDropState_Dragging;
MemoryCopyStruct(&rd_drag_drop_payload, payload);
}
}
internal B32
rd_drag_drop(RD_DragDropPayload *out_payload)
rd_drag_drop(void)
{
B32 result = 0;
if(rd_state->drag_drop_state == RD_DragDropState_Dropping)
{
result = 1;
rd_state->drag_drop_state = RD_DragDropState_Null;
MemoryCopyStruct(out_payload, &rd_drag_drop_payload);
MemoryZeroStruct(&rd_drag_drop_payload);
}
return result;
}
@@ -1077,13 +1076,6 @@ internal void
rd_drag_kill(void)
{
rd_state->drag_drop_state = RD_DragDropState_Null;
MemoryZeroStruct(&rd_drag_drop_payload);
}
internal void
rd_queue_drag_drop(void)
{
rd_state->drag_drop_state = RD_DragDropState_Dropping;
}
internal void
@@ -2938,14 +2930,15 @@ rd_window_frame(RD_Window *ws)
////////////////////////////
//- rjf: drag/drop visualization tooltips
//
B32 drag_active = rd_drag_is_active();
if(drag_active && window_is_focused)
if(rd_drag_is_active() && window_is_focused)
RD_RegsScope(.window = rd_state->drag_drop_regs->window,
.panel = rd_state->drag_drop_regs->panel,
.view = rd_state->drag_drop_regs->view)
{
Temp scratch = scratch_begin(0, 0);
RD_DragDropPayload *payload = &rd_drag_drop_payload;
RD_Panel *panel = rd_panel_from_handle(payload->panel);
RD_Entity *entity = rd_entity_from_handle(payload->entity);
RD_View *view = rd_view_from_handle(payload->view);
RD_Panel *panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel);
RD_Entity *entity = rd_entity_from_handle(rd_state->drag_drop_regs->entity);
RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view);
{
//- rjf: tab dragging
if(!rd_view_is_nil(view))
@@ -5753,7 +5746,7 @@ rd_window_frame(RD_Window *ws)
//- rjf: boundary tab-drag/drop sites
//
{
RD_View *drag_view = rd_view_from_handle(rd_drag_drop_payload.view);
RD_View *drag_view = rd_view_from_handle(rd_state->drag_drop_regs->view);
if(rd_drag_is_active() && !rd_view_is_nil(drag_view))
{
//- rjf: params
@@ -5830,8 +5823,7 @@ rd_window_frame(RD_Window *ws)
}
// rjf: drop
RD_DragDropPayload payload = {0};
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop(&payload))
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())
{
Dir2 dir = (axis == Axis2_Y ? (side == Side_Min ? Dir2_Up : Dir2_Down) :
axis == Axis2_X ? (side == Side_Min ? Dir2_Left : Dir2_Right) :
@@ -5841,8 +5833,8 @@ rd_window_frame(RD_Window *ws)
RD_Panel *split_panel = panel;
rd_cmd(RD_CmdKind_SplitPanel,
.dst_panel = rd_handle_from_panel(split_panel),
.panel = payload.panel,
.view = payload.view,
.panel = rd_state->drag_drop_regs->panel,
.view = rd_state->drag_drop_regs->view,
.dir2 = dir);
}
}
@@ -5914,8 +5906,7 @@ rd_window_frame(RD_Window *ws)
}
// rjf: drop
RD_DragDropPayload payload = {0};
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop(&payload))
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())
{
Dir2 dir = (panel->split_axis == Axis2_X ? Dir2_Left : Dir2_Up);
RD_Panel *split_panel = child;
@@ -5926,8 +5917,8 @@ rd_window_frame(RD_Window *ws)
}
rd_cmd(RD_CmdKind_SplitPanel,
.dst_panel = rd_handle_from_panel(split_panel),
.panel = payload.panel,
.view = payload.view,
.panel = rd_state->drag_drop_regs->panel,
.view = rd_state->drag_drop_regs->view,
.dir2 = dir);
}
@@ -6095,7 +6086,7 @@ rd_window_frame(RD_Window *ws)
//- rjf: build combined split+movetab drag/drop sites
//
{
RD_View *view = rd_view_from_handle(rd_drag_drop_payload.view);
RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view);
if(rd_drag_is_active() && !rd_view_is_nil(view) && contains_2f32(panel_rect, ui_mouse()))
{
F32 drop_site_dim_px = ceil_f32(ui_top_font_size()*7.f);
@@ -6213,23 +6204,22 @@ rd_window_frame(RD_Window *ws)
}
}
}
RD_DragDropPayload payload = {0};
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop(&payload))
if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())
{
if(dir != Dir2_Invalid)
{
rd_cmd(RD_CmdKind_SplitPanel,
.dst_panel = rd_handle_from_panel(panel),
.panel = payload.panel,
.view = payload.view,
.panel = rd_state->drag_drop_regs->panel,
.view = rd_state->drag_drop_regs->view,
.dir2 = dir);
}
else
{
rd_cmd(RD_CmdKind_MoveTab,
.dst_panel = rd_handle_from_panel(panel),
.panel = payload.panel,
.view = payload.view,
.panel = rd_state->drag_drop_regs->panel,
.view = rd_state->drag_drop_regs->view,
.prev_view = rd_handle_from_view(panel->last_tab_view));
}
}
@@ -6519,7 +6509,7 @@ rd_window_frame(RD_Window *ws)
if(rd_drag_is_active() && catchall_drop_site_hovered)
{
RD_Panel *dst_panel = rd_panel_from_handle(rd_last_drag_drop_panel);
RD_View *drag_view = rd_view_from_handle(rd_drag_drop_payload.view);
RD_View *drag_view = rd_view_from_handle(rd_state->drag_drop_regs->view);
RD_View *dst_prev_view = rd_view_from_handle(rd_last_drag_drop_prev_tab);
if(dst_panel == panel &&
((!rd_view_is_nil(view) && dst_prev_view == view->order_prev && drag_view != view && drag_view != view->order_prev) ||
@@ -6620,13 +6610,11 @@ rd_window_frame(RD_Window *ws)
}
else if(ui_dragging(sig) && !rd_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f)
{
RD_DragDropPayload payload = {0};
RD_RegsScope(.panel = rd_handle_from_panel(panel),
.view = rd_handle_from_view(view))
{
payload.key = sig.box->key;
payload.panel = rd_handle_from_panel(panel);
payload.view = rd_handle_from_view(view);
rd_drag_begin();
}
rd_drag_begin(&payload);
}
else if(ui_right_clicked(sig))
{
@@ -6711,7 +6699,7 @@ rd_window_frame(RD_Window *ws)
// rjf: more precise drop-sites on tab bar
{
Vec2F32 mouse = ui_mouse();
RD_View *view = rd_view_from_handle(rd_drag_drop_payload.view);
RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view);
if(rd_drag_is_active() && window_is_focused && contains_2f32(panel_rect, mouse) && !rd_view_is_nil(view))
{
// rjf: mouse => hovered drop site
@@ -6741,7 +6729,7 @@ rd_window_frame(RD_Window *ws)
}
// rjf: vis
RD_Panel *drag_panel = rd_panel_from_handle(rd_drag_drop_payload.panel);
RD_Panel *drag_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel);
if(!rd_view_is_nil(view) && active_drop_site != 0)
{
RD_Palette(RD_PaletteCode_DropSiteOverlay) UI_Rect(tab_bar_rect)
@@ -6749,11 +6737,10 @@ rd_window_frame(RD_Window *ws)
}
// rjf: drop
RD_DragDropPayload payload = rd_drag_drop_payload;
if(catchall_drop_site_hovered && (active_drop_site != 0 && rd_drag_drop(&payload)))
if(catchall_drop_site_hovered && (active_drop_site != 0 && rd_drag_drop()))
{
RD_View *view = rd_view_from_handle(payload.view);
RD_Panel *src_panel = rd_panel_from_handle(payload.panel);
RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view);
RD_Panel *src_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel);
if(!rd_panel_is_nil(panel) && !rd_view_is_nil(view))
{
rd_cmd(RD_CmdKind_MoveTab,
@@ -6781,8 +6768,7 @@ rd_window_frame(RD_Window *ws)
{
rd_last_drag_drop_panel = rd_handle_from_panel(panel);
RD_DragDropPayload *payload = &rd_drag_drop_payload;
RD_View *dragged_view = rd_view_from_handle(payload->view);
RD_View *dragged_view = rd_view_from_handle(rd_state->drag_drop_regs->view);
B32 view_is_in_panel = 0;
for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next)
{
@@ -6804,12 +6790,11 @@ rd_window_frame(RD_Window *ws)
// rjf: drop
{
RD_DragDropPayload payload = {0};
if(rd_drag_drop(&payload))
if(rd_drag_drop())
{
RD_Panel *src_panel = rd_panel_from_handle(payload.panel);
RD_View *view = rd_view_from_handle(payload.view);
RD_Entity *entity = rd_entity_from_handle(payload.entity);
RD_Panel *src_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel);
RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view);
RD_Entity *entity = rd_entity_from_handle(rd_state->drag_drop_regs->entity);
// rjf: view drop
if(!rd_view_is_nil(view))
@@ -6826,7 +6811,7 @@ rd_window_frame(RD_Window *ws)
{
rd_cmd(RD_CmdKind_SpawnEntityView,
.panel = rd_handle_from_panel(panel),
.cursor = payload.text_point,
.cursor = rd_state->drag_drop_regs->cursor,
.entity = rd_handle_from_entity(entity));
}
}
@@ -9430,6 +9415,8 @@ rd_init(CmdLine *cmdln)
rd_state->cfg_main_font_path_arena = arena_alloc();
rd_state->cfg_code_font_path_arena = arena_alloc();
rd_state->bind_change_arena = arena_alloc();
rd_state->drag_drop_arena = arena_alloc();
rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1);
rd_state->top_regs = &rd_state->base_regs;
rd_clear_bindings();
@@ -9715,6 +9702,12 @@ rd_frame(void)
}
B32 take = 0;
//- rjf: try drag/drop drop-kickoff
if(rd_drag_is_active() && event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton)
{
rd_state->drag_drop_state = RD_DragDropState_Dropping;
}
//- rjf: try window close
if(!take && event->kind == OS_EventKind_WindowClose && window != 0)
{
@@ -12393,7 +12386,6 @@ rd_frame(void)
}
}break;
//- rjf: thread finding
case RD_CmdKind_FindThread:
for(RD_Window *ws = rd_state->first_window; ws != 0; ws = ws->next)
@@ -14234,15 +14226,6 @@ rd_frame(void)
}
}
//////////////////////////////
//- rjf: queue drag drop (TODO(rjf): @msgs)
//
B32 queue_drag_drop = 0;
if(queue_drag_drop)
{
rd_queue_drag_drop();
}
////////////////////////////
//- rjf: rotate command slots, bump command gen counter
//
@@ -14329,7 +14312,6 @@ rd_frame(void)
if(rd_state->drag_drop_state == RD_DragDropState_Dropping)
{
rd_state->drag_drop_state = RD_DragDropState_Null;
MemoryZeroStruct(&rd_drag_drop_payload);
}
//////////////////////////////
+7 -17
View File
@@ -315,16 +315,6 @@ typedef enum RD_DragDropState
}
RD_DragDropState;
typedef struct RD_DragDropPayload RD_DragDropPayload;
struct RD_DragDropPayload
{
UI_Key key;
RD_Handle panel;
RD_Handle view;
RD_Handle entity;
TxtPt text_point;
};
////////////////////////////////
//~ rjf: Command Kind Types
@@ -848,6 +838,11 @@ struct RD_State
Arena *current_path_arena;
String8 current_path;
// rjf: drag/drop state
Arena *drag_drop_arena;
RD_Regs *drag_drop_regs;
RD_DragDropState drag_drop_state;
//-
// TODO(rjf): TO BE ELIMINATED OR REPLACED VVVVVVVVVVVVVVVV
//-
@@ -900,9 +895,6 @@ struct RD_State
U64 free_view_count;
U64 allocated_view_count;
// rjf: drag/drop state machine
RD_DragDropState drag_drop_state;
// rjf: config reading state
Arena *cfg_path_arenas[RD_CfgSrc_COUNT];
String8 cfg_paths[RD_CfgSrc_COUNT];
@@ -968,7 +960,6 @@ read_only global RD_Panel rd_nil_panel =
};
global RD_State *rd_state = 0;
global RD_DragDropPayload rd_drag_drop_payload = {0};
global RD_Handle rd_last_drag_drop_panel = {0};
global RD_Handle rd_last_drag_drop_prev_tab = {0};
@@ -1112,10 +1103,9 @@ internal B32 rd_prefer_dasm_from_window(RD_Window *window);
//~ rjf: Global Cross-Window UI Interaction State Functions
internal B32 rd_drag_is_active(void);
internal void rd_drag_begin(RD_DragDropPayload *payload);
internal B32 rd_drag_drop(RD_DragDropPayload *out_payload);
internal void rd_drag_begin(void);
internal B32 rd_drag_drop(void);
internal void rd_drag_kill(void);
internal void rd_queue_drag_drop(void);
internal void rd_set_hover_regs(void);
internal RD_Regs *rd_get_hover_regs(void);
+6 -17
View File
@@ -756,10 +756,7 @@ rd_entity_desc_button(RD_Entity *entity, FuzzyMatchRangeList *name_matches, Stri
// rjf: drag+drop
else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse()))
{
RD_DragDropPayload payload = {0};
payload.key = box->key;
payload.entity = rd_handle_from_entity(entity);
rd_drag_begin(&payload);
RD_RegsScope(.entity = rd_handle_from_entity(entity)) rd_drag_begin();
}
}
scratch_end(scratch);
@@ -1405,9 +1402,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
// rjf: drag start
if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse()))
{
RD_DragDropPayload payload = {0};
payload.entity = rd_handle_from_entity(bp);
rd_drag_begin(&payload);
RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_drag_begin();
}
// rjf: bp right-click menu
@@ -1463,9 +1458,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
// rjf: drag start
if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse()))
{
RD_DragDropPayload payload = {0};
payload.entity = rd_handle_from_entity(pin);
rd_drag_begin(&payload);
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin();
}
// rjf: watch right-click menu
@@ -1692,9 +1685,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
UI_Signal sig = ui_buttonf("%S###pin_nub", rd_icon_kind_text_table[RD_IconKind_Pin]);
if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse()))
{
RD_DragDropPayload payload = {0};
payload.entity = rd_handle_from_entity(pin);
rd_drag_begin(&payload);
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin();
}
if(ui_right_clicked(sig))
{
@@ -1860,8 +1851,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
// drop target
if(rd_drag_is_active() && contains_2f32(clipped_top_container_rect, ui_mouse()))
{
RD_DragDropPayload *payload = &rd_drag_drop_payload;
RD_Entity *entity = rd_entity_from_handle(payload->entity);
RD_Entity *entity = rd_entity_from_handle(rd_state->drag_drop_regs->entity);
if(entity->kind == RD_EntityKind_Thread ||
entity->kind == RD_EntityKind_WatchPin ||
entity->kind == RD_EntityKind_Breakpoint)
@@ -1872,8 +1862,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
//- rjf: drop target is dropped -> process
{
RD_DragDropPayload payload = {0};
if(!rd_entity_is_nil(line_drag_entity) && rd_drag_drop(&payload) && contains_1s64(params->line_num_range, mouse_pt.line))
if(!rd_entity_is_nil(line_drag_entity) && rd_drag_drop() && contains_1s64(params->line_num_range, mouse_pt.line))
{
RD_Entity *dropped_entity = line_drag_entity;
S64 line_num = mouse_pt.line;