mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-04 21:08:40 +00:00
first pass at expr drag/drop in watch windows
This commit is contained in:
+113
-1
@@ -4181,6 +4181,112 @@ rd_view_ui(Rng2F32 rect)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
//- rjf: do drag/drops
|
||||||
|
//
|
||||||
|
if(rd_drag_is_active())
|
||||||
|
{
|
||||||
|
Vec2F32 rect_dim = dim_2f32(rect);
|
||||||
|
ui_set_next_rect(r2f32p(0, 0, rect_dim.x, rect_dim.y));
|
||||||
|
UI_Box *drop_target = ui_build_box_from_stringf(UI_BoxFlag_DropSite|UI_BoxFlag_Floating, "watch_%I64x_drop", rd_regs()->view);
|
||||||
|
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);
|
||||||
|
|
||||||
|
//- rjf: obtain best fit for "previous row" drag/drops
|
||||||
|
EV_Block *watches_block = &ev_nil_block;
|
||||||
|
U64 best_prev_row_num = 0;
|
||||||
|
F32 best_prev_row_y = 0;
|
||||||
|
F32 best_prev_row_distance = inf32();
|
||||||
|
{
|
||||||
|
U64 local_row_idx = 0;
|
||||||
|
F32 row_y = 0;
|
||||||
|
EV_Row *prev_row = 0;
|
||||||
|
RD_WatchRowInfo *prev_row_info = 0;
|
||||||
|
for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, local_row_idx += 1)
|
||||||
|
{
|
||||||
|
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(rd_state->drag_drop_regs_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)
|
||||||
|
{
|
||||||
|
watches_block = row->block;
|
||||||
|
}
|
||||||
|
F32 row_distance = abs_f32(drop_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_num = row_num-1;
|
||||||
|
best_prev_row_distance = row_distance;
|
||||||
|
best_prev_row_y = row_y;
|
||||||
|
watches_block = row->block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_y += row_height;
|
||||||
|
prev_row = row;
|
||||||
|
prev_row_info = row_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: drop
|
||||||
|
if(rd_drag_drop())
|
||||||
|
{
|
||||||
|
RD_RegSlot drop_slot = rd_state->drag_drop_regs_slot;
|
||||||
|
RD_Regs *drop_regs = rd_state->drag_drop_regs;
|
||||||
|
switch(drop_slot)
|
||||||
|
{
|
||||||
|
default:{}break;
|
||||||
|
case RD_RegSlot_Expr:
|
||||||
|
if(watches_block != &ev_nil_block)
|
||||||
|
{
|
||||||
|
RD_Cfg *parent_cfg = rd_cfg_from_eval_space(watches_block->eval.space);
|
||||||
|
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_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);
|
||||||
|
RD_Cfg *prev_cfg = prev_row_info.group_cfg_child;
|
||||||
|
if(parent_cfg != &rd_nil_cfg)
|
||||||
|
{
|
||||||
|
RD_Cfg *cfg = rd_cfg_from_id(drop_regs->cfg);
|
||||||
|
if(cfg->parent == parent_cfg)
|
||||||
|
{
|
||||||
|
rd_cfg_unhook(cfg->parent, cfg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cfg = rd_cfg_alloc();
|
||||||
|
rd_cfg_equip_stringf(cfg, "watch");
|
||||||
|
rd_cfg_new(cfg, rd_state->drag_drop_regs->expr);
|
||||||
|
}
|
||||||
|
rd_cfg_insert_child(parent_cfg, prev_cfg, cfg);
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: draw drop position
|
||||||
|
{
|
||||||
|
DR_Bucket *bucket = dr_bucket_make();
|
||||||
|
DR_BucketScope(bucket) UI_TagF("pop")
|
||||||
|
{
|
||||||
|
Vec4F32 color = ui_color_from_name(str8_lit("background"));
|
||||||
|
Rng2F32 drop_line_rect = r2f32p(rect.x0,
|
||||||
|
rect.y0 + best_prev_row_y - ui_top_font_size()*0.5f,
|
||||||
|
rect.x1,
|
||||||
|
rect.y0 + best_prev_row_y + ui_top_font_size()*0.5f);
|
||||||
|
R_Rect2DInst *inst = dr_rect(drop_line_rect, color, 0, 0, 1.f);
|
||||||
|
inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0);
|
||||||
|
}
|
||||||
|
ui_box_equip_draw_bucket(drop_target, bucket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////
|
////////////////////////
|
||||||
//- rjf: build table
|
//- rjf: build table
|
||||||
//
|
//
|
||||||
@@ -4771,7 +4877,13 @@ rd_view_ui(Rng2F32 rect)
|
|||||||
cell->eval.space.kind == E_SpaceKind_Null)
|
cell->eval.space.kind == E_SpaceKind_Null)
|
||||||
{
|
{
|
||||||
RD_RegsScope(.expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key))
|
RD_RegsScope(.expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key))
|
||||||
|
{
|
||||||
|
if(cell->flags & RD_WatchCellFlag_Expr)
|
||||||
|
{
|
||||||
|
rd_regs()->cfg = row_info->group_cfg_child->id;
|
||||||
|
}
|
||||||
rd_drag_begin(RD_RegSlot_Expr);
|
rd_drag_begin(RD_RegSlot_Expr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8252,7 +8364,7 @@ rd_window_frame(void)
|
|||||||
//- rjf: build catch-all panel drop-site
|
//- rjf: build catch-all panel drop-site
|
||||||
//
|
//
|
||||||
UI_Key catchall_drop_site_key = ui_key_from_stringf(ui_key_zero(), "catchall_drop_site_%p", panel->cfg);
|
UI_Key catchall_drop_site_key = ui_key_from_stringf(ui_key_zero(), "catchall_drop_site_%p", panel->cfg);
|
||||||
if(build_panel) UI_Rect(panel_rect)
|
if(build_panel && rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View) UI_Rect(panel_rect)
|
||||||
{
|
{
|
||||||
UI_Box *catchall_drop_site = ui_build_box_from_key(UI_BoxFlag_DropSite, catchall_drop_site_key);
|
UI_Box *catchall_drop_site = ui_build_box_from_key(UI_BoxFlag_DropSite, catchall_drop_site_key);
|
||||||
ui_signal_from_box(catchall_drop_site);
|
ui_signal_from_box(catchall_drop_site);
|
||||||
|
|||||||
@@ -2364,7 +2364,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
|||||||
top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min) * params->line_height_px,
|
top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min) * params->line_height_px,
|
||||||
top_container_box->rect.x1,
|
top_container_box->rect.x1,
|
||||||
top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min + 1) * params->line_height_px);
|
top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min + 1) * params->line_height_px);
|
||||||
R_Rect2DInst *inst = dr_rect(pad_2f32(drop_line_rect, 8.f), color, 0, 0, 4.f);
|
R_Rect2DInst *inst = dr_rect(drop_line_rect, color, 0, 0, 1.f);
|
||||||
inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0);
|
inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0);
|
||||||
}
|
}
|
||||||
ui_box_equip_draw_bucket(text_container_box, bucket);
|
ui_box_equip_draw_bucket(text_container_box, bucket);
|
||||||
|
|||||||
Reference in New Issue
Block a user