From 9f468c44d9003e2e6d9fbf4628134291f5d6e069 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 30 Apr 2025 11:57:35 -0700 Subject: [PATCH] ditto --- src/raddbg/raddbg_core.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index bb183f49..5a1f24d2 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4265,41 +4265,48 @@ rd_view_ui(Rng2F32 rect) UI_Signal sig = ui_signal_from_box(drop_target); if(ui_key_match(ui_drop_hot_key(), drop_target->key)) { - Vec2F32 drop_pos = sub_2f32(ui_mouse(), rect.p0); + Vec2F32 drag_pos = sub_2f32(ui_mouse(), rect.p0); RD_RegSlot drag_slot = rd_state->drag_drop_regs_slot; RD_Regs *drag_regs = rd_state->drag_drop_regs; //- rjf: obtain best fit for target block & prev-row for this drag - EV_Block *watches_block = &ev_nil_block; + EV_Block *drag_block = &ev_nil_block; U64 best_prev_row_block_num = 0; F32 best_prev_row_y = 0; - F32 best_prev_row_distance = inf32(); { + F32 best_prev_row_distance = inf32(); U64 local_row_idx = 0; F32 row_y = 0; for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, local_row_idx += 1) { + // rjf: unpack row EV_Row *row = &row_node->row; F32 row_height = row_height_px*row->visual_size; RD_WatchRowInfo *row_info = &row_infos[local_row_idx]; E_Type *block_type = e_type_from_key__cached(row->block->eval.irtree.type_key); - if(drag_slot == RD_RegSlot_Expr && - block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches) && - (drag_regs->cfg == 0 || - (drag_regs->cfg != row_info->group_cfg_child->id))) + + // rjf: determine if this row's block is good for the current drag/drop + B32 block_is_good_for_drop = 0; + if(drag_slot == RD_RegSlot_Expr && block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches)) { - if(watches_block == &ev_nil_block && row_y <= drop_pos.y && drop_pos.y <= row_y + row_height) + block_is_good_for_drop = (drag_regs->cfg == 0 || (drag_regs->cfg != row_info->group_cfg_child->id)); + } + + // rjf: if this block is good, then test this row/block & grab if appropriate + if(block_is_good_for_drop) + { + if(drag_block == &ev_nil_block && row_y <= drag_pos.y && drag_pos.y <= row_y + row_height) { - watches_block = row->block; + drag_block = row->block; } - F32 row_distance = abs_f32(drop_pos.y - row_y); + F32 row_distance = abs_f32(drag_pos.y - row_y); if(row_distance <= best_prev_row_distance) { U64 row_num = ev_block_num_from_id(row->block, row->key.child_id); best_prev_row_block_num = row_num-1; best_prev_row_distance = row_distance; best_prev_row_y = row_y; - watches_block = row->block; + drag_block = row->block; } } row_y += row_height; @@ -4310,13 +4317,13 @@ rd_view_ui(Rng2F32 rect) B32 drag_target_is_good = 0; RD_Cfg *drag_parent_cfg = &rd_nil_cfg; RD_Cfg *drag_prev_cfg = &rd_nil_cfg; - if(watches_block != &ev_nil_block) + if(drag_block != &ev_nil_block) { - EV_Key prev_row_key = ev_key_make(ev_hash_from_key(watches_block->key), ev_block_id_from_num(watches_block, best_prev_row_block_num)); + EV_Key prev_row_key = ev_key_make(ev_hash_from_key(drag_block->key), ev_block_id_from_num(drag_block, best_prev_row_block_num)); U64 prev_row_num = ev_num_from_key(&block_ranges, prev_row_key); EV_Row *prev_row = ev_row_from_num(scratch.arena, eval_view, filter, &block_ranges, prev_row_num); RD_WatchRowInfo prev_row_info = rd_watch_row_info_from_row(scratch.arena, prev_row); - drag_parent_cfg = rd_cfg_from_eval_space(watches_block->eval.space); + drag_parent_cfg = rd_cfg_from_eval_space(drag_block->eval.space); drag_prev_cfg = prev_row_info.group_cfg_child; if(drag_regs->cfg == 0 || drag_prev_cfg->id != drag_regs->cfg) {