mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
more filtering coverage; fuzzy filtering on search tags as well as entity display string; display a few known frames from callstack in thread entity description buttons
This commit is contained in:
@@ -1284,7 +1284,7 @@ ctrl_unwind_from_process_thread(Arena *arena, CTRL_MachineID machine_id, CTRL_Ha
|
||||
frame->rip = rip;
|
||||
frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size);
|
||||
MemoryCopy(frame->regs, regs_block, arch_reg_block_size);
|
||||
SLLQueuePush(unwind.first, unwind.last, frame);
|
||||
DLLPushBack(unwind.first, unwind.last, frame);
|
||||
unwind.count += 1;
|
||||
|
||||
// rjf: unwind one step
|
||||
|
||||
@@ -53,6 +53,7 @@ typedef struct CTRL_UnwindFrame CTRL_UnwindFrame;
|
||||
struct CTRL_UnwindFrame
|
||||
{
|
||||
CTRL_UnwindFrame *next;
|
||||
CTRL_UnwindFrame *prev;
|
||||
U64 rip;
|
||||
void *regs;
|
||||
};
|
||||
|
||||
@@ -1358,6 +1358,7 @@ df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray
|
||||
{
|
||||
DF_Entity *entity = array->v[src_idx];
|
||||
String8 display_string = df_display_string_from_entity(scratch.arena, entity);
|
||||
String8 search_tags = df_search_tags_from_entity(scratch.arena, entity);
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(arena, needle, display_string);
|
||||
if(matches.count >= matches.needle_part_count)
|
||||
{
|
||||
@@ -1365,6 +1366,16 @@ df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray
|
||||
result.v[result_idx].matches = matches;
|
||||
result_idx += 1;
|
||||
}
|
||||
else if(search_tags.size != 0)
|
||||
{
|
||||
FuzzyMatchRangeList tag_matches = fuzzy_match_find(scratch.arena, needle, search_tags);
|
||||
if(tag_matches.count >= tag_matches.needle_part_count)
|
||||
{
|
||||
result.v[result_idx].entity = entity;
|
||||
result.v[result_idx].matches = matches;
|
||||
result_idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
result.count = result_idx;
|
||||
scratch_end(scratch);
|
||||
@@ -1519,6 +1530,38 @@ df_display_string_from_entity(Arena *arena, DF_Entity *entity)
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: extra search tag strings for fuzzy filtering entities
|
||||
|
||||
internal String8
|
||||
df_search_tags_from_entity(Arena *arena, DF_Entity *entity)
|
||||
{
|
||||
String8 result = {0};
|
||||
if(entity->kind == DF_EntityKind_Thread)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process);
|
||||
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity);
|
||||
String8List strings = {0};
|
||||
for(CTRL_UnwindFrame *f = unwind.last; f != 0; f = f->prev)
|
||||
{
|
||||
U64 rip_vaddr = f->rip;
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
|
||||
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
|
||||
DF_Entity *binary = df_binary_file_from_module(module);
|
||||
String8 procedure_name = df_symbol_name_from_binary_voff(scratch.arena, binary, rip_voff);
|
||||
if(procedure_name.size != 0)
|
||||
{
|
||||
str8_list_push(scratch.arena, &strings, procedure_name);
|
||||
}
|
||||
}
|
||||
StringJoin join = {0};
|
||||
join.sep = str8_lit(",");
|
||||
result = str8_list_join(arena, &strings, &join);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: entity -> color operations
|
||||
|
||||
internal Vec4F32
|
||||
|
||||
@@ -1374,6 +1374,9 @@ internal String8 df_full_path_from_entity(Arena *arena, DF_Entity *entity);
|
||||
//- rjf: display string entities, for referencing entities in ui
|
||||
internal String8 df_display_string_from_entity(Arena *arena, DF_Entity *entity);
|
||||
|
||||
//- rjf: extra search tag strings for fuzzy filtering entities
|
||||
internal String8 df_search_tags_from_entity(Arena *arena, DF_Entity *entity);
|
||||
|
||||
//- rjf: entity -> color operations
|
||||
internal Vec4F32 df_hsva_from_entity(DF_Entity *entity);
|
||||
internal Vec4F32 df_rgba_from_entity(DF_Entity *entity);
|
||||
|
||||
+80
-61
@@ -2988,7 +2988,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
case DF_EntityKind_Module:
|
||||
{
|
||||
DF_Entity *bin_file = df_binary_file_from_module(entity);
|
||||
if(df_icon_buttonf(DF_IconKind_Module, "Inspect Binary File Memory").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Module, 0, "Inspect Binary File Memory").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_panel(ws, panel);
|
||||
params.entity = df_handle_from_entity(bin_file);
|
||||
@@ -2996,7 +2996,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PendingEntity));
|
||||
ui_ctx_menu_close();
|
||||
}
|
||||
if(df_icon_buttonf(DF_IconKind_Module, "View Binary File Disassembly").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Module, 0, "View Binary File Disassembly").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_panel(ws, panel);
|
||||
params.entity = df_handle_from_entity(bin_file);
|
||||
@@ -3007,7 +3007,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}break;
|
||||
case DF_EntityKind_Process:
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, "Open Process Log").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Process Log").clicked)
|
||||
{
|
||||
DF_Entity *log = df_log_from_entity(entity);
|
||||
DF_CmdParams params = df_cmd_params_from_panel(ws, panel);
|
||||
@@ -3019,7 +3019,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}break;
|
||||
case DF_EntityKind_Thread:
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, "Open Thread Log").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Open Thread Log").clicked)
|
||||
{
|
||||
DF_Entity *log = df_log_from_entity(entity);
|
||||
DF_CmdParams params = df_cmd_params_from_panel(ws, panel);
|
||||
@@ -3043,7 +3043,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
//- rjf: toggles
|
||||
for(U64 idx = 0; idx < ArrayCount(DEV_toggle_table); idx += 1)
|
||||
{
|
||||
if(df_icon_button(*DEV_toggle_table[idx].value_ptr ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, DEV_toggle_table[idx].name).clicked)
|
||||
if(df_icon_button(*DEV_toggle_table[idx].value_ptr ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name).clicked)
|
||||
{
|
||||
*DEV_toggle_table[idx].value_ptr ^= 1;
|
||||
}
|
||||
@@ -3289,20 +3289,20 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
|
||||
// rjf: copy name
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Name").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name").clicked)
|
||||
{
|
||||
os_set_clipboard_text(display_name);
|
||||
ui_ctx_menu_close();
|
||||
}
|
||||
|
||||
// rjf: is command line only? -> make permanent
|
||||
if(entity->cfg_src == DF_CfgSrc_CommandLine && df_icon_buttonf(DF_IconKind_Save, "Save To Profile").clicked)
|
||||
if(entity->cfg_src == DF_CfgSrc_CommandLine && df_icon_buttonf(DF_IconKind_Save, 0, "Save To Profile").clicked)
|
||||
{
|
||||
df_entity_equip_cfg_src(entity, DF_CfgSrc_Profile);
|
||||
}
|
||||
|
||||
// rjf: duplicate
|
||||
if(op_flags & DF_EntityOpFlag_Duplicate && df_icon_buttonf(DF_IconKind_XSplit, "Duplicate").clicked)
|
||||
if(op_flags & DF_EntityOpFlag_Duplicate && df_icon_buttonf(DF_IconKind_XSplit, 0, "Duplicate").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3312,7 +3312,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
|
||||
// rjf: edit
|
||||
if(op_flags & DF_EntityOpFlag_Edit && df_icon_buttonf(DF_IconKind_Pencil, "Edit").clicked)
|
||||
if(op_flags & DF_EntityOpFlag_Edit && df_icon_buttonf(DF_IconKind_Pencil, 0, "Edit").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3322,7 +3322,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
|
||||
// rjf: deletion
|
||||
if(op_flags & DF_EntityOpFlag_Delete && df_icon_buttonf(DF_IconKind_Trash, "Delete").clicked)
|
||||
if(op_flags & DF_EntityOpFlag_Delete && df_icon_buttonf(DF_IconKind_Trash, 0, "Delete").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3335,14 +3335,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
if(op_flags & DF_EntityOpFlag_Enable)
|
||||
{
|
||||
B32 is_enabled = entity->b32;
|
||||
if(!is_enabled && df_icon_buttonf(DF_IconKind_CheckHollow, "Enable###enabler").clicked)
|
||||
if(!is_enabled && df_icon_buttonf(DF_IconKind_CheckHollow, 0, "Enable###enabler").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EnableEntity));
|
||||
}
|
||||
if(is_enabled && df_icon_buttonf(DF_IconKind_CheckFilled, "Disable###enabler").clicked)
|
||||
if(is_enabled && df_icon_buttonf(DF_IconKind_CheckFilled, 0, "Disable###enabler").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3360,14 +3360,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
color.y *= 0.7f;
|
||||
color.z *= 0.7f;
|
||||
ui_set_next_background_color(color);
|
||||
if(is_frozen && df_icon_buttonf(DF_IconKind_Locked, "Thaw###freeze_thaw").clicked)
|
||||
if(is_frozen && df_icon_buttonf(DF_IconKind_Locked, 0, "Thaw###freeze_thaw").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawEntity));
|
||||
}
|
||||
if(!is_frozen && df_icon_buttonf(DF_IconKind_Unlocked, "Freeze###freeze_thaw").clicked)
|
||||
if(!is_frozen && df_icon_buttonf(DF_IconKind_Unlocked, 0, "Freeze###freeze_thaw").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3380,7 +3380,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
if(entity->flags & DF_EntityFlag_HasTextPoint)
|
||||
{
|
||||
DF_Entity *file_ancestor = df_entity_ancestor_from_kind(entity, DF_EntityKind_File);
|
||||
if(!df_entity_is_nil(file_ancestor) && df_icon_buttonf(DF_IconKind_FileOutline, "Go To Location").clicked)
|
||||
if(!df_entity_is_nil(file_ancestor) && df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location").clicked)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
@@ -3399,7 +3399,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
{
|
||||
DF_CtrlCtx ctrl_ctx = df_ctrl_ctx();
|
||||
DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread);
|
||||
if(entity->vaddr != 0 && !df_entity_is_nil(thread) && df_icon_buttonf(DF_IconKind_FileOutline, "Go To Location").clicked)
|
||||
if(entity->vaddr != 0 && !df_entity_is_nil(thread) && df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process));
|
||||
@@ -3421,7 +3421,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
case DF_EntityKind_File:
|
||||
{
|
||||
if(entity->flags & DF_EntityFlag_IsFolder &&
|
||||
df_icon_buttonf(DF_IconKind_FolderOpenOutline, "Open File In Folder").clicked)
|
||||
df_icon_buttonf(DF_IconKind_FolderOpenOutline, 0, "Open File In Folder").clicked)
|
||||
{
|
||||
String8 path = df_full_path_from_entity(scratch.arena, entity);
|
||||
String8 path_w_slash = push_str8f(scratch.arena, "%S/", path);
|
||||
@@ -3441,7 +3441,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
if(!(entity->flags & DF_EntityFlag_IsFolder) &&
|
||||
!(entity->flags & DF_EntityFlag_IsMissing) &&
|
||||
df_icon_buttonf(DF_IconKind_FileOutline, "Go To File").clicked)
|
||||
df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To File").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.file_path = df_full_path_from_entity(scratch.arena, entity);
|
||||
@@ -3462,9 +3462,9 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
B32 is_selected = df_handle_match(ctrl_ctx.thread, df_handle_from_entity(entity));
|
||||
if(is_selected)
|
||||
{
|
||||
df_icon_buttonf(DF_IconKind_Thread, "[Selected]###select_entity");
|
||||
df_icon_buttonf(DF_IconKind_Thread, 0, "[Selected]###select_entity");
|
||||
}
|
||||
else if(df_icon_buttonf(DF_IconKind_Thread, "Select###select_entity").clicked)
|
||||
else if(df_icon_buttonf(DF_IconKind_Thread, 0, "Select###select_entity").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3474,7 +3474,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
}
|
||||
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy ID").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy ID").clicked)
|
||||
{
|
||||
U32 ctrl_id = entity->ctrl_id;
|
||||
String8 string = push_str8f(scratch.arena, "%i", (int)ctrl_id);
|
||||
@@ -3484,7 +3484,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
if(entity->kind == DF_EntityKind_Thread)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Instruction Pointer Address").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Instruction Pointer Address").clicked)
|
||||
{
|
||||
U64 rip = df_query_cached_rip_from_thread(entity);
|
||||
String8 string = push_str8f(scratch.arena, "0x%I64x", rip);
|
||||
@@ -3495,7 +3495,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
if(entity->kind == DF_EntityKind_Thread)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Call Stack").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Call Stack").clicked)
|
||||
{
|
||||
DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process);
|
||||
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity);
|
||||
@@ -3527,7 +3527,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
if(entity->kind == DF_EntityKind_Thread)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, "Find").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Find").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3540,7 +3540,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
case DF_EntityKind_Module:
|
||||
{
|
||||
UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, "Copy Full Path");
|
||||
UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path");
|
||||
if(copy_full_path_sig.clicked)
|
||||
{
|
||||
String8 string = entity->name;
|
||||
@@ -3552,14 +3552,14 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
String8 string = entity->name;
|
||||
ui_label(string);
|
||||
}
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Base Address").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Base Address").clicked)
|
||||
{
|
||||
Rng1U64 vaddr_rng = entity->vaddr_rng;
|
||||
String8 string = push_str8f(scratch.arena, "0x%I64x", vaddr_rng.min);
|
||||
os_set_clipboard_text(string);
|
||||
ui_ctx_menu_close();
|
||||
}
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Address Range Size").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Address Range Size").clicked)
|
||||
{
|
||||
Rng1U64 vaddr_rng = entity->vaddr_rng;
|
||||
String8 string = push_str8f(scratch.arena, "0x%I64x", dim_1u64(vaddr_rng));
|
||||
@@ -3570,7 +3570,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
case DF_EntityKind_Target:
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Play, "Launch And Run").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Play, 0, "Launch And Run").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3578,7 +3578,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun));
|
||||
ui_ctx_menu_close();
|
||||
}
|
||||
if(df_icon_buttonf(DF_IconKind_PlayStepForward, "Launch And Initialize").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_PlayStepForward, 0, "Launch And Initialize").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
@@ -3649,7 +3649,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
UI_Row UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_em(12.f, 1.f)) UI_CornerRadius(8.f)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, "Remove Color").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, 0, "Remove Color").clicked)
|
||||
{
|
||||
entity->flags &= ~DF_EntityFlag_HasColor;
|
||||
}
|
||||
@@ -3657,7 +3657,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
}
|
||||
if(!entity_has_color && df_icon_buttonf(DF_IconKind_Palette, "Equip With Color").clicked)
|
||||
if(!entity_has_color && df_icon_buttonf(DF_IconKind_Palette, 0, "Equip With Color").clicked)
|
||||
{
|
||||
df_entity_equip_color_rgba(entity, v4f32(1, 1, 1, 1));
|
||||
}
|
||||
@@ -3697,7 +3697,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
|
||||
// rjf: copy name
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, "Copy Name").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name").clicked)
|
||||
{
|
||||
os_set_clipboard_text(display_name);
|
||||
ui_ctx_menu_close();
|
||||
@@ -3706,7 +3706,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
// rjf: copy full path
|
||||
if(entity->kind == DF_EntityKind_File)
|
||||
{
|
||||
UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, "Copy Full Path");
|
||||
UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path");
|
||||
String8 full_path = df_full_path_from_entity(scratch.arena, entity);
|
||||
if(copy_full_path_sig.clicked)
|
||||
{
|
||||
@@ -3745,7 +3745,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
}
|
||||
|
||||
// rjf: close tab
|
||||
if(df_icon_buttonf(DF_IconKind_X, "Close Tab").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_X, 0, "Close Tab").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
{
|
||||
@@ -4232,7 +4232,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
UI_CornerRadius10(0)
|
||||
UI_CornerRadius11(0)
|
||||
{
|
||||
UI_Signal watch_sig = df_icon_buttonf(DF_IconKind_List, "###watch_hover_eval");
|
||||
UI_Signal watch_sig = df_icon_buttonf(DF_IconKind_List, 0, "###watch_hover_eval");
|
||||
if(watch_sig.hovering) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main))
|
||||
{
|
||||
ui_labelf("Add the hovered expression to an opened watch view.");
|
||||
@@ -4250,7 +4250,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
UI_CornerRadius10(corner_radius)
|
||||
UI_CornerRadius11(corner_radius)
|
||||
{
|
||||
UI_Signal pin_sig = df_icon_buttonf(DF_IconKind_Pin, "###pin_hover_eval");
|
||||
UI_Signal pin_sig = df_icon_buttonf(DF_IconKind_Pin, 0, "###pin_hover_eval");
|
||||
if(pin_sig.hovering) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main))
|
||||
UI_CornerRadius00(0)
|
||||
UI_CornerRadius01(0)
|
||||
@@ -4486,7 +4486,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
String8 target_name = df_display_string_from_entity(scratch.arena, target);
|
||||
UI_Signal sig = {0};
|
||||
UI_TextColor(color)
|
||||
sig = df_icon_buttonf(DF_IconKind_Target, "%S##%p", target_name, target);
|
||||
sig = df_icon_buttonf(DF_IconKind_Target, 0, "%S##%p", target_name, target);
|
||||
if(sig.clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
@@ -5819,7 +5819,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
|
||||
// rjf: build tab list button
|
||||
if(panel->tab_view_count > 5) UI_PrefWidth(ui_em(2.25f, 1.f)) UI_PrefHeight(ui_px(tab_bar_vheight, 1))
|
||||
{
|
||||
UI_Signal sig = df_icon_buttonf(DF_IconKind_List, "###tab_list_%p", panel);
|
||||
UI_Signal sig = df_icon_buttonf(DF_IconKind_List, 0, "###tab_list_%p", panel);
|
||||
if(sig.clicked)
|
||||
{
|
||||
if(ui_ctx_menu_is_open(tab_list_ctx_menu_key))
|
||||
@@ -8589,7 +8589,7 @@ df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fa
|
||||
}
|
||||
|
||||
internal UI_Signal
|
||||
df_icon_button(DF_IconKind kind, String8 string)
|
||||
df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string)
|
||||
{
|
||||
String8 display_string = ui_display_part_from_key_string(string);
|
||||
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
|
||||
@@ -8615,7 +8615,14 @@ df_icon_button(DF_IconKind kind, String8 string)
|
||||
ui_label(df_g_icon_kind_text_table[kind]);
|
||||
if(display_string.size != 0)
|
||||
{
|
||||
UI_PrefWidth(ui_pct(1.f, 0.f)) ui_label(display_string);
|
||||
UI_PrefWidth(ui_pct(1.f, 0.f))
|
||||
{
|
||||
UI_Box *box = ui_label(display_string).box;
|
||||
if(matches != 0)
|
||||
{
|
||||
ui_box_equip_fuzzy_match_ranges(box, matches);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(display_string.size == 0)
|
||||
{
|
||||
@@ -8627,14 +8634,14 @@ df_icon_button(DF_IconKind kind, String8 string)
|
||||
}
|
||||
|
||||
internal UI_Signal
|
||||
df_icon_buttonf(DF_IconKind kind, char *fmt, ...)
|
||||
df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
String8 string = push_str8fv(scratch.arena, fmt, args);
|
||||
va_end(args);
|
||||
UI_Signal sig = df_icon_button(kind, string);
|
||||
UI_Signal sig = df_icon_button(kind, matches, string);
|
||||
scratch_end(scratch);
|
||||
return sig;
|
||||
}
|
||||
@@ -8869,8 +8876,29 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam
|
||||
{
|
||||
ui_label(str8_lit("(Disabled)"));
|
||||
}
|
||||
if(entity->kind == DF_EntityKind_Thread)
|
||||
if(entity->kind == DF_EntityKind_Thread) UI_FontSize(ui_top_font_size()*0.75f) UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_CodeFunction))
|
||||
{
|
||||
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity);
|
||||
DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process);
|
||||
U64 idx = 0;
|
||||
ui_spacer(ui_em(1.f, 1.f));
|
||||
for(CTRL_UnwindFrame *f = unwind.last; f != 0 && idx < 3; f = f->prev)
|
||||
{
|
||||
U64 rip_vaddr = f->rip;
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
|
||||
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
|
||||
DF_Entity *binary = df_binary_file_from_module(module);
|
||||
String8 procedure_name = df_symbol_name_from_binary_voff(scratch.arena, binary, rip_voff);
|
||||
if(procedure_name.size != 0)
|
||||
{
|
||||
if(idx != 0)
|
||||
{
|
||||
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_PrefWidth(ui_em(2.f, 1.f)) ui_label(str8_lit(">"));
|
||||
}
|
||||
UI_PrefWidth(ui_text_dim(10.f, 0.f)) ui_label(procedure_name);
|
||||
idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8885,19 +8913,10 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam
|
||||
// rjf: click => fastpath or dropdown for this entity
|
||||
if(sig.clicked)
|
||||
{
|
||||
DF_EntityOpFlags flags = df_g_entity_kind_op_flags_table[entity->kind];
|
||||
if(flags & DF_EntityOpFlag_Edit || entity->kind == DF_EntityKind_Thread)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EntityRefFastPath));
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_ctx_menu_open(ws->entity_ctx_menu_key, key, v2f32(0, dim_2f32(box->rect).y));
|
||||
ws->entity_ctx_menu_entity = df_handle_from_entity(entity);
|
||||
}
|
||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||
params.entity = df_handle_from_entity(entity);
|
||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EntityRefFastPath));
|
||||
}
|
||||
|
||||
// rjf: right-click => context menu for this entity
|
||||
@@ -9198,7 +9217,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
}
|
||||
|
||||
//- rjf: run-to-line
|
||||
if(df_icon_buttonf(DF_IconKind_Play, "Run To Line").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Play, 0, "Run To Line").clicked)
|
||||
{
|
||||
result.run_to_line_num = line_num;
|
||||
ui_ctx_menu_close();
|
||||
@@ -9206,9 +9225,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
|
||||
//- rjf: breakpoint placing
|
||||
if((params->line_bps[line_idx].count == 0 &&
|
||||
df_icon_buttonf(DF_IconKind_CircleFilled, "Place Breakpoint").clicked) ||
|
||||
df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Place Breakpoint").clicked) ||
|
||||
(params->line_bps[line_idx].count != 0 &&
|
||||
df_icon_buttonf(DF_IconKind_CircleFilled, "Remove Breakpoint").clicked))
|
||||
df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Remove Breakpoint").clicked))
|
||||
{
|
||||
result.clicked_margin_line_num = line_num;
|
||||
ui_ctx_menu_close();
|
||||
@@ -9216,7 +9235,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
|
||||
//- rjf: go from src -> disasm
|
||||
if(line_src2dasm_list->first != 0 &&
|
||||
df_icon_buttonf(DF_IconKind_Find, "Go To Disassembly").clicked)
|
||||
df_icon_buttonf(DF_IconKind_Find, 0, "Go To Disassembly").clicked)
|
||||
{
|
||||
result.goto_disasm_line_num = line_num;
|
||||
ui_ctx_menu_close();
|
||||
@@ -9224,7 +9243,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
|
||||
//- rjf: go from disasm -> src
|
||||
if(line_dasm2src_list->first != 0 &&
|
||||
df_icon_buttonf(DF_IconKind_Find, "Go To Source").clicked)
|
||||
df_icon_buttonf(DF_IconKind_Find, 0, "Go To Source").clicked)
|
||||
{
|
||||
result.goto_src_line_num = line_num;
|
||||
ui_ctx_menu_close();
|
||||
|
||||
+2
-2
@@ -1026,8 +1026,8 @@ internal void df_cmd_binding_button(DF_CmdSpec *spec);
|
||||
internal UI_Signal df_menu_bar_button(String8 string);
|
||||
internal UI_Signal df_cmd_spec_button(DF_CmdSpec *spec);
|
||||
internal void df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fastpath_codepoints);
|
||||
internal UI_Signal df_icon_button(DF_IconKind kind, String8 string);
|
||||
internal UI_Signal df_icon_buttonf(DF_IconKind kind, char *fmt, ...);
|
||||
internal UI_Signal df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string);
|
||||
internal UI_Signal df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);
|
||||
internal void df_entity_tooltips(DF_Entity *entity);
|
||||
internal void df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches);
|
||||
internal void df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point);
|
||||
|
||||
@@ -190,7 +190,7 @@ DF_GfxViewTable:
|
||||
{ Target "target" "Target" EntityName Target 1 0 0 0 0 0 0 "" }
|
||||
{ Targets "targets" "Targets" Null Target 0 1 0 1 0 1 1 "Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section." }
|
||||
{ FilePathMap "file_path_map" "File Path Map" Null FileOutline 0 1 0 0 0 0 1 "Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths." }
|
||||
{ Scheduler "scheduler" "Scheduler" Null Scheduler 0 1 0 1 0 1 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." }
|
||||
{ Scheduler "scheduler" "Scheduler" Null Scheduler 0 1 0 1 1 1 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." }
|
||||
{ CallStack "call_stack" "Call Stack" Null Thread 0 1 0 0 0 0 1 "Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top." }
|
||||
{ Modules "modules" "Modules" Null Module 0 1 0 1 0 1 1 "Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module." }
|
||||
{ PendingEntity "pending_entity" "Pending Entity" EntityName FileOutline 1 0 0 0 0 0 0 "" }
|
||||
@@ -208,7 +208,7 @@ DF_GfxViewTable:
|
||||
{ Breakpoints "breakpoints" "Breakpoints" Null CircleFilled 0 1 0 1 0 1 1 "Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section." }
|
||||
{ WatchPins "watch_pins" "Watch Pins" Null Pin 0 1 0 1 1 1 1 "Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin." }
|
||||
{ ExceptionFilters "exception_filters" "Exception Filters" Null Gear 0 1 0 1 0 1 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." }
|
||||
{ Theme "theme" "Theme" Null Palette 0 1 0 1 0 1 1 "An interface for modifying the colors used in the debugger's UI. Allows selecting a theme preset, loading a theme from a file, and modifying individual colors within a theme." }
|
||||
{ Theme "theme" "Theme" Null Palette 0 1 0 0 0 0 1 "An interface for modifying the colors used in the debugger's UI. Allows selecting a theme preset, loading a theme from a file, and modifying individual colors within a theme." }
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+34
-26
@@ -1755,7 +1755,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty)
|
||||
UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBackground))
|
||||
UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder))
|
||||
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText))
|
||||
if(df_icon_buttonf(DF_IconKind_Add, "Add Target").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddTarget);
|
||||
@@ -1780,7 +1780,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty)
|
||||
UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_ActionBorder))
|
||||
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_ActionText))
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Play, "Launch %S", target_name).clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Play, 0, "Launch %S", target_name).clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
params.entity = df_handle_from_entity(target);
|
||||
@@ -1788,7 +1788,7 @@ DF_VIEW_UI_FUNCTION_DEF(Empty)
|
||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun));
|
||||
}
|
||||
ui_spacer(ui_em(1.5f, 1));
|
||||
if(df_icon_buttonf(DF_IconKind_Play, "Step Into %S", target_name).clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Play, 0, "Step Into %S", target_name).clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
params.entity = df_handle_from_entity(target);
|
||||
@@ -3349,7 +3349,7 @@ DF_VIEW_UI_FUNCTION_DEF(Targets)
|
||||
{
|
||||
UI_Signal add_sig = {0};
|
||||
UI_FocusHot(cursor.y == 1 ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
add_sig = df_icon_buttonf(DF_IconKind_Add, "Add New Target");
|
||||
add_sig = df_icon_buttonf(DF_IconKind_Add, 0, "Add New Target");
|
||||
if(add_sig.clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
@@ -3372,7 +3372,7 @@ DF_VIEW_UI_FUNCTION_DEF(Targets)
|
||||
UI_PrefWidth(ui_em(2.25f, 1))
|
||||
UI_FocusHot((row_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
UI_Signal sig = df_icon_buttonf(target->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, "###ebl_%p", target);
|
||||
UI_Signal sig = df_icon_buttonf(target->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", target);
|
||||
if(sig.clicked && sig.event_flags == 0)
|
||||
{
|
||||
DF_CmdParams p = df_cmd_params_from_view(ws, panel, view);
|
||||
@@ -3414,7 +3414,7 @@ DF_VIEW_UI_FUNCTION_DEF(Targets)
|
||||
UI_Signal sig = {0};
|
||||
UI_FocusHot((row_selected && cursor.x == 2+ctrl_idx) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
sig = df_icon_buttonf(ctrls[ctrl_idx].icon, "###%p_ctrl_%i", target, (int)ctrl_idx);
|
||||
sig = df_icon_buttonf(ctrls[ctrl_idx].icon, 0, "###%p_ctrl_%i", target, (int)ctrl_idx);
|
||||
}
|
||||
if(sig.hovering) UI_Tooltip
|
||||
{
|
||||
@@ -3927,7 +3927,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler)
|
||||
{
|
||||
ui_set_next_background_color(frozen_in_solo_mode_color);
|
||||
}
|
||||
sig = df_icon_buttonf(frozen ? DF_IconKind_Locked : DF_IconKind_Unlocked, "###lock_%p", entity);
|
||||
sig = df_icon_buttonf(frozen ? DF_IconKind_Locked : DF_IconKind_Unlocked, 0, "###lock_%p", entity);
|
||||
}
|
||||
if(frozen_by_solo_mode && sig.hovering) UI_Tooltip
|
||||
{
|
||||
@@ -3970,7 +3970,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler)
|
||||
}
|
||||
UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Redo, "###retry").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Redo, 0, "###retry").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity));
|
||||
@@ -3983,7 +3983,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler)
|
||||
UI_BackgroundColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBackground))
|
||||
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_FailureText))
|
||||
UI_BorderColor(df_rgba_from_theme_color(DF_ThemeColor_FailureBorder))
|
||||
if(df_icon_buttonf(DF_IconKind_X, "###kill").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_X, 0, "###kill").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity));
|
||||
@@ -8348,7 +8348,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints)
|
||||
{
|
||||
UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
if(df_icon_buttonf(entity->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, "###ebl_%p", entity).clicked)
|
||||
if(df_icon_buttonf(entity->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", entity).clicked)
|
||||
{
|
||||
df_entity_equip_b32(entity, !entity->b32);
|
||||
}
|
||||
@@ -8420,7 +8420,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints)
|
||||
}
|
||||
UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 4) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, "###del_%p", entity).clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity).clicked)
|
||||
{
|
||||
df_entity_mark_for_deletion(entity);
|
||||
}
|
||||
@@ -8550,7 +8550,7 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins)
|
||||
}
|
||||
UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, "###del_%p", entity).clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity).clicked)
|
||||
{
|
||||
df_entity_mark_for_deletion(entity);
|
||||
}
|
||||
@@ -8578,6 +8578,7 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters)
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
F32 row_height_px = floor_f32(ui_top_font_size()*2.5f);
|
||||
String8 query = str8(view->query_buffer, view->query_string_size);
|
||||
|
||||
//- rjf: get state
|
||||
typedef struct DF_ExceptionFiltersViewState DF_ExceptionFiltersViewState;
|
||||
@@ -8592,6 +8593,7 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters)
|
||||
struct DF_ExceptionFiltersOption
|
||||
{
|
||||
String8 name;
|
||||
FuzzyMatchRangeList matches;
|
||||
B32 is_enabled;
|
||||
CTRL_ExceptionCodeKind exception_code_kind;
|
||||
};
|
||||
@@ -8623,19 +8625,25 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters)
|
||||
k = (CTRL_ExceptionCodeKind)(k+1))
|
||||
{
|
||||
DF_ExceptionFiltersOptionChunkNode *node = opts_list.last;
|
||||
if(node == 0 || node->count >= node->cap)
|
||||
String8 name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]);
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name);
|
||||
if(matches.count >= matches.needle_part_count)
|
||||
{
|
||||
node = push_array(scratch.arena, DF_ExceptionFiltersOptionChunkNode, 1);
|
||||
node->cap = 256;
|
||||
node->v = push_array_no_zero(scratch.arena, DF_ExceptionFiltersOption, node->cap);
|
||||
SLLQueuePush(opts_list.first, opts_list.last, node);
|
||||
opts_list.node_count += 1;
|
||||
if(node == 0 || node->count >= node->cap)
|
||||
{
|
||||
node = push_array(scratch.arena, DF_ExceptionFiltersOptionChunkNode, 1);
|
||||
node->cap = 256;
|
||||
node->v = push_array_no_zero(scratch.arena, DF_ExceptionFiltersOption, node->cap);
|
||||
SLLQueuePush(opts_list.first, opts_list.last, node);
|
||||
opts_list.node_count += 1;
|
||||
}
|
||||
node->v[node->count].name = name;
|
||||
node->v[node->count].matches = matches;
|
||||
node->v[node->count].is_enabled = !!(df_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64)));
|
||||
node->v[node->count].exception_code_kind = k;
|
||||
node->count += 1;
|
||||
opts_list.option_count += 1;
|
||||
}
|
||||
node->v[node->count].name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]);
|
||||
node->v[node->count].is_enabled = !!(df_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64)));
|
||||
node->v[node->count].exception_code_kind = k;
|
||||
node->count += 1;
|
||||
opts_list.option_count += 1;
|
||||
}
|
||||
DF_ExceptionFiltersOptionArray opts = {0};
|
||||
{
|
||||
@@ -8670,7 +8678,7 @@ DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters)
|
||||
UI_FocusHot(sv->cursor.y == row+1 ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
DF_ExceptionFiltersOption *opt = &opts.v[row];
|
||||
UI_Signal sig = df_icon_buttonf(opt->is_enabled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, "%S", opt->name);
|
||||
UI_Signal sig = df_icon_buttonf(opt->is_enabled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, &opt->matches, "%S", opt->name);
|
||||
if(sig.clicked)
|
||||
{
|
||||
if(opt->exception_code_kind != CTRL_ExceptionCodeKind_Null)
|
||||
@@ -8985,7 +8993,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme)
|
||||
// rjf: preset selector
|
||||
UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
UI_Signal preset_sig = df_icon_buttonf(DF_IconKind_Palette, "Apply Preset");
|
||||
UI_Signal preset_sig = df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Preset");
|
||||
if(preset_sig.clicked)
|
||||
{
|
||||
ui_ctx_menu_open(preset_ctx_menu_key, preset_sig.box->key, v2f32(0, dim_2f32(preset_sig.box->rect).y));
|
||||
@@ -8995,7 +9003,7 @@ DF_VIEW_UI_FUNCTION_DEF(Theme)
|
||||
// rjf: load-from-file
|
||||
UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off)
|
||||
{
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, "Load From File").clicked)
|
||||
if(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Load From File").clicked)
|
||||
{
|
||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||
params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile);
|
||||
|
||||
@@ -959,7 +959,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[] =
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_IconKind_Thread, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_IconKind_Module, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)},
|
||||
{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)},
|
||||
@@ -977,7 +977,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[] =
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_IconKind_CircleFilled, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_IconKind_Pin, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)},
|
||||
{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)},
|
||||
};
|
||||
|
||||
String8 df_g_theme_color_display_string_table[] =
|
||||
|
||||
Reference in New Issue
Block a user