From 35659a4525e2e680142ee977f57548635d0d168a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 16 Sep 2024 17:25:21 -0700 Subject: [PATCH] checkpoint on new drag/drop system; eliminate old drag/drop payload, just use regs like everything else --- src/raddbg/raddbg_core.c | 112 +++++++++++++++--------------------- src/raddbg/raddbg_core.h | 24 +++----- src/raddbg/raddbg_widgets.c | 23 ++------ 3 files changed, 60 insertions(+), 99 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index dd62a77c..16cf562a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -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); } ////////////////////////////// diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 37fa2905..79b0e086 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -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); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 12595855..e0ef78be 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -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;