correctly use all schemas (including inherited ones) when doing lookups/evaluations; shift enabled to using evaluation path rather than just checking the value string; fix visualization of inherited schema values (e.g. font sizes in tabs)

This commit is contained in:
Ryan Fleury
2025-04-17 10:53:11 -07:00
parent f29c017268
commit f1549f6b53
9 changed files with 195 additions and 116 deletions
+22
View File
@@ -1204,3 +1204,25 @@ md_debug_string_list_from_tree(Arena *arena, MD_Node *root)
}
return strings;
}
////////////////////////////////
//~ rjf: Node Pointer List Functions
internal void
md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node)
{
MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1);
n->v = node;
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
internal void
md_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node)
{
MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1);
n->v = node;
SLLQueuePushFront(list->first, list->last, n);
list->count += 1;
}
+21
View File
@@ -202,6 +202,21 @@ struct MD_NodeRec
S32 pop_count;
};
typedef struct MD_NodePtrNode MD_NodePtrNode;
struct MD_NodePtrNode
{
MD_NodePtrNode *next;
MD_Node *v;
};
typedef struct MD_NodePtrList MD_NodePtrList;
struct MD_NodePtrList
{
MD_NodePtrNode *first;
MD_NodePtrNode *last;
U64 count;
};
////////////////////////////////
//~ rjf: Text -> Tokens Types
@@ -322,4 +337,10 @@ internal MD_ParseResult md_parse_from_text(Arena *arena, String8 filename, Strin
internal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root);
////////////////////////////////
//~ rjf: Node Pointer List Functions
internal void md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node);
internal void md_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node);
#endif // MDESK_H
+3 -5
View File
@@ -606,7 +606,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[213] =
{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}},
};
struct {String8 string; RD_Binding binding;} rd_default_binding_table[109] =
struct {String8 string; RD_Binding binding;} rd_default_binding_table[107] =
{
{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }},
{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}},
@@ -620,10 +620,8 @@ struct {String8 string; RD_Binding binding;} rd_default_binding_table[109] =
{str8_lit_comp("step_over"), {OS_Key_F10, 0 }},
{str8_lit_comp("run_to_line"), {OS_Key_F10, 0 |OS_Modifier_Ctrl }},
{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},
{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Alt}},
{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Alt}},
{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Shift |OS_Modifier_Alt}},
{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Shift |OS_Modifier_Alt}},
{str8_lit_comp("inc_font_size"), {OS_Key_Equal, 0 |OS_Modifier_Alt}},
{str8_lit_comp("dec_font_size"), {OS_Key_Minus, 0 |OS_Modifier_Alt}},
{str8_lit_comp("window"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},
{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_Modifier_Ctrl }},
{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_Modifier_Ctrl }},
+2 -4
View File
@@ -788,10 +788,8 @@ RD_DefaultBindingTable:
{ "set_next_statement" F10 ctrl shift 0 }
//- rjf: font sizes
{ "inc_ui_font_scale" Equal 0 0 alt }
{ "dec_ui_font_scale" Minus 0 0 alt }
{ "inc_code_font_scale" Equal 0 shift alt }
{ "dec_code_font_scale" Minus 0 shift alt }
{ "inc_font_size" Equal 0 0 alt }
{ "dec_font_size" Minus 0 0 alt }
//- rjf: windows
{ "window" N ctrl shift 0 }
+80 -28
View File
@@ -1065,15 +1065,19 @@ rd_color_from_cfg(RD_Cfg *cfg)
internal B32
rd_disabled_from_cfg(RD_Cfg *cfg)
{
MD_Node *schema = rd_schema_from_name(cfg->string);
MD_Node *enabled_schema = md_child_from_string(schema, str8_lit("enabled"), 0);
MD_Node *default_tag = md_tag_from_string(enabled_schema, str8_lit("default"), 0);
MD_Node *child_schema = &md_nil_node;
MD_NodePtrList schemas = rd_schemas_from_name(cfg->string);
for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)
{
child_schema = md_child_from_string(n->v, str8_lit("enabled"), 0);
}
MD_Node *default_tag = md_tag_from_string(child_schema, str8_lit("default"), 0);
String8 value_string = rd_cfg_child_from_string(cfg, str8_lit("enabled"))->first->string;
if(value_string.size == 0)
{
value_string = default_tag->first->string;
}
B32 is_enabled = (str8_match(value_string, str8_lit("1"), 0));
B32 is_enabled = !!e_value_from_string(value_string).u64;
B32 is_disabled = !is_enabled;
if(value_string.size == 0)
{
@@ -1152,19 +1156,19 @@ rd_target_from_cfg(Arena *arena, RD_Cfg *cfg)
return target;
}
internal MD_Node *
rd_schema_from_name(String8 name)
internal MD_NodePtrList
rd_schemas_from_name(String8 name)
{
MD_Node *schema = &md_nil_node;
MD_NodePtrList schemas = {0};
for EachElement(idx, rd_name_schema_info_table)
{
if(str8_match(name, rd_name_schema_info_table[idx].name, 0))
{
schema = rd_state->schemas[idx];
schemas = rd_state->schemas[idx];
break;
}
}
return schema;
return schemas;
}
internal String8
@@ -1207,15 +1211,20 @@ rd_setting_from_name(String8 name)
};
for EachElement(idx, schema_names)
{
MD_Node *schema = rd_schema_from_name(schema_names[idx]);
MD_Node *setting = md_child_from_string(schema, name, 0);
MD_Node *default_tag = md_tag_from_string(setting, str8_lit("default"), 0);
if(default_tag != &md_nil_node)
MD_NodePtrList schemas = rd_schemas_from_name(schema_names[idx]);
for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)
{
result = default_tag->first->string;
break;
MD_Node *schema = n->v;
MD_Node *setting = md_child_from_string(schema, name, 0);
MD_Node *default_tag = md_tag_from_string(setting, str8_lit("default"), 0);
if(default_tag != &md_nil_node)
{
result = default_tag->first->string;
goto end_default_search;
}
}
}
end_default_search:;
scratch_end(scratch);
}
}
@@ -1605,8 +1614,12 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
String8 read_data = {0};
if(child_key.size != 0)
{
MD_Node *root_schema = rd_schema_from_name(root_cfg->string);
MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0);
MD_NodePtrList schemas = rd_schemas_from_name(root_cfg->string);
MD_Node *child_schema = &md_nil_node;
for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)
{
child_schema = md_child_from_string(n->v, child_key, 0);
}
String8 child_type_name = child_schema->first->string;
if(str8_match(child_type_name, str8_lit("path_pt"), 0))
{
@@ -1674,8 +1687,12 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
String8 read_data = {0};
if(child_key.size != 0)
{
MD_Node *root_schema = rd_schema_from_name(ctrl_entity_kind_code_name_table[entity->kind]);
MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0);
MD_NodePtrList schemas = rd_schemas_from_name(ctrl_entity_kind_code_name_table[entity->kind]);
MD_Node *child_schema = &md_nil_node;
for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)
{
child_schema = md_child_from_string(n->v, child_key, 0);
}
if(str8_match(child_schema->string, str8_lit("exe"), 0) ||
str8_match(child_schema->string, str8_lit("label"), 0))
{
@@ -1790,8 +1807,12 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
// rjf: perform write, based on child name in schema
if(child_key.size != 0)
{
MD_Node *root_schema = rd_schema_from_name(ctrl_entity_kind_code_name_table[entity->kind]);
MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0);
MD_NodePtrList schemas = rd_schemas_from_name(ctrl_entity_kind_code_name_table[entity->kind]);
MD_Node *child_schema = &md_nil_node;
for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)
{
child_schema = md_child_from_string(n->v, child_key, 0);
}
if(str8_match(child_schema->string, str8_lit("label"), 0))
{
result = 1;
@@ -2119,7 +2140,7 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval)
RD_Cfg *view = rd_cfg_child_from_string_or_alloc(parent, schema_name);
rd_cfg_child_from_string_or_alloc(view, str8_lit("selected"));
{
MD_Node *schema = rd_schema_from_name(schema_name);
MD_NodePtrList schemas = rd_schemas_from_name(schema_name);
E_Expr *primary_expr = eval.expr;
E_Expr **args = 0;
U64 args_count = 0;
@@ -2146,9 +2167,9 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval)
param_name = arg->first->string;
arg_expr = arg->first->next;
}
else
else if(schemas.last != 0)
{
for MD_EachNode(schema_child, schema->first)
for MD_EachNode(schema_child, schemas.last->v->first)
{
MD_Node *order_tag = md_tag_from_string(schema_child, str8_lit("order"), 0);
if(order_tag != &md_nil_node)
@@ -8679,11 +8700,11 @@ rd_window_frame(void)
ui_eat_event(evt);
if(evt->delta_2f32.y < 0)
{
rd_cmd(RD_CmdKind_IncFontSize);
rd_cmd(RD_CmdKind_IncFontSize, .view = 0);
}
else if(evt->delta_2f32.y > 0)
{
rd_cmd(RD_CmdKind_DecFontSize);
rd_cmd(RD_CmdKind_DecFontSize, .view = 0);
}
}
}
@@ -10903,10 +10924,41 @@ rd_init(CmdLine *cmdln)
// rjf: set up schemas
{
U64 schemas_count = ArrayCount(rd_name_schema_info_table);
rd_state->schemas = push_array(rd_state->arena, MD_Node *, schemas_count);
rd_state->schemas = push_array(rd_state->arena, MD_NodePtrList, schemas_count);
for EachIndex(idx, schemas_count)
{
rd_state->schemas[idx] = md_tree_from_string(rd_state->arena, rd_name_schema_info_table[idx].schema)->first;
Temp scratch = scratch_begin(0, 0);
typedef struct SchemaParseTask SchemaParseTask;
struct SchemaParseTask
{
SchemaParseTask *next;
String8 schema_text;
};
SchemaParseTask start_task = {0, rd_name_schema_info_table[idx].schema};
SchemaParseTask *first_task = &start_task;
SchemaParseTask *last_task = first_task;
for(SchemaParseTask *t = first_task; t != 0; t = t->next)
{
MD_Node *schema = md_tree_from_string(rd_state->arena, t->schema_text)->first;
md_node_ptr_list_push_front(rd_state->arena, &rd_state->schemas[idx], schema);
for MD_EachNode(tag, schema->first_tag)
{
if(str8_match(tag->string, str8_lit("inherit"), 0))
{
for EachIndex(idx2, schemas_count)
{
if(str8_match(rd_name_schema_info_table[idx2].name, tag->first->string, 0))
{
SchemaParseTask *new_task = push_array(scratch.arena, SchemaParseTask, 1);
SLLQueuePush(first_task, last_task, new_task);
new_task->schema_text = rd_name_schema_info_table[idx2].schema;
break;
}
}
}
}
}
scratch_end(scratch);
}
}
+2 -2
View File
@@ -598,7 +598,7 @@ struct RD_State
String8 project_path;
// rjf: schema table
MD_Node **schemas;
MD_NodePtrList *schemas;
// rjf: default theme table
MD_Node *theme_preset_trees[RD_ThemePreset_COUNT];
@@ -863,7 +863,7 @@ internal String8 rd_expr_from_cfg(RD_Cfg *cfg);
internal String8 rd_path_from_cfg(RD_Cfg *cfg);
internal D_Target rd_target_from_cfg(Arena *arena, RD_Cfg *cfg);
internal MD_Node *rd_schema_from_name(String8 name);
internal MD_NodePtrList rd_schemas_from_name(String8 name);
internal String8 rd_setting_from_name(String8 name);
#define rd_setting_b32_from_name(name) (str8_match(rd_setting_from_name(name), str8_lit("1"), 0))
+14 -30
View File
@@ -277,20 +277,12 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers)
////////////////////////////////
//~ rjf: Schema Type Hooks
typedef struct RD_SchemaNode RD_SchemaNode;
struct RD_SchemaNode
{
RD_SchemaNode *next;
MD_Node *schema;
};
typedef struct RD_SchemaIRExt RD_SchemaIRExt;
struct RD_SchemaIRExt
{
RD_Cfg *cfg;
CTRL_Entity *entity;
RD_SchemaNode *first_schema;
RD_SchemaNode *last_schema;
MD_NodePtrList schemas;
};
E_TYPE_IREXT_FUNCTION_DEF(schema)
@@ -303,21 +295,9 @@ E_TYPE_IREXT_FUNCTION_DEF(schema)
E_Interpretation interpret = e_interpret(bytecode);
E_TypeKey type_key = irtree->type_key;
E_Type *type = e_type_from_key__cached(type_key);
MD_Node *schema = rd_schema_from_name(type->name);
ext->cfg = rd_cfg_from_eval_space(interpret.space);
ext->entity = rd_ctrl_entity_from_eval_space(interpret.space);
for MD_EachNode(tag, schema->first_tag)
{
if(str8_match(tag->string, str8_lit("inherit"), 0))
{
RD_SchemaNode *n = push_array(arena, RD_SchemaNode, 1);
n->schema = rd_schema_from_name(tag->first->string);
SLLQueuePush(ext->first_schema, ext->last_schema, n);
}
}
RD_SchemaNode *n = push_array(arena, RD_SchemaNode, 1);
n->schema = schema;
SLLQueuePush(ext->first_schema, ext->last_schema, n);
ext->schemas = rd_schemas_from_name(type->name);
scratch_end(scratch);
}
E_IRExt result = {ext};
@@ -331,9 +311,9 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
if(expr->kind == E_ExprKind_MemberAccess)
{
MD_Node *child_schema = &md_nil_node;
for(RD_SchemaNode *n = ext->first_schema; n != 0; n = n->next)
for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next)
{
for MD_EachNode(child, n->schema->first)
for MD_EachNode(child, n->v->first)
{
if(str8_match(child->string, expr->first->next->string, 0))
{
@@ -512,9 +492,9 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)
ExpandChildNode *first_child_node = 0;
ExpandChildNode *last_child_node = 0;
U64 child_count = 0;
for(RD_SchemaNode *n = ext->first_schema; n != 0; n = n->next)
for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next)
{
MD_Node *schema = n->schema;
MD_Node *schema = n->v;
for MD_EachNode(child, schema->first)
{
if(!md_node_has_tag(child, str8_lit("no_expand"), 0))
@@ -599,11 +579,15 @@ E_TYPE_IREXT_FUNCTION_DEF(cfgs)
//- rjf: gather commands
String8List cmds_list = {0};
{
MD_Node *schema = rd_schema_from_name(cfg_name);
MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0);
for MD_EachNode(cmd, collection_cmds_root->first)
MD_NodePtrList schemas = rd_schemas_from_name(cfg_name);
for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)
{
str8_list_push(arena, &cmds_list, cmd->string);
MD_Node *schema = n->v;
MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0);
for MD_EachNode(cmd, collection_cmds_root->first)
{
str8_list_push(arena, &cmds_list, cmd->string);
}
}
}
+50 -46
View File
@@ -1169,58 +1169,62 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
{
RD_Cfg *cfg = evalled_cfg;
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button, .pct = 1.f, .fstrs = rd_title_fstrs_from_cfg(arena, cfg));
MD_Node *schema = rd_schema_from_name(cfg->string);
MD_Node *cmds_root = md_tag_from_string(schema, str8_lit("commands"), 0);
for MD_EachNode(cmd, cmds_root->first)
MD_NodePtrList schemas = rd_schemas_from_name(cfg->string);
for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)
{
String8 cmd_name = cmd->string;
RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);
switch(cmd_kind)
MD_Node *schema = n->v;
MD_Node *cmds_root = md_tag_from_string(schema, str8_lit("commands"), 0);
for MD_EachNode(cmd, cmds_root->first)
{
default:{}break;
case RD_CmdKind_EnableCfg:
String8 cmd_name = cmd->string;
RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);
switch(cmd_kind)
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(!is_disabled)
default:{}break;
case RD_CmdKind_EnableCfg:
{
cmd_kind = RD_CmdKind_DisableCfg;
}
}break;
case RD_CmdKind_DisableCfg:
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(!is_disabled)
{
cmd_kind = RD_CmdKind_DisableCfg;
}
}break;
case RD_CmdKind_DisableCfg:
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(is_disabled)
{
cmd_kind = RD_CmdKind_EnableCfg;
}
}break;
case RD_CmdKind_SelectCfg:
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(!is_disabled)
{
cmd_kind = RD_CmdKind_DeselectCfg;
}
}break;
case RD_CmdKind_DeselectCfg:
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(is_disabled)
{
cmd_kind = RD_CmdKind_SelectCfg;
}
}break;
}
if(cmd_kind == RD_CmdKind_EnableCfg || cmd_kind == RD_CmdKind_DisableCfg)
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(is_disabled)
{
cmd_kind = RD_CmdKind_EnableCfg;
}
}break;
case RD_CmdKind_SelectCfg:
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_Background,
.px = floor_f32(ui_top_font_size()*6.f),
.string = str8_lit("($expr).enabled"));
}
else if(cmd_kind != RD_CmdKind_Null)
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(!is_disabled)
{
cmd_kind = RD_CmdKind_DeselectCfg;
}
}break;
case RD_CmdKind_DeselectCfg:
{
B32 is_disabled = rd_disabled_from_cfg(cfg);
if(is_disabled)
{
cmd_kind = RD_CmdKind_SelectCfg;
}
}break;
}
if(cmd_kind == RD_CmdKind_EnableCfg || cmd_kind == RD_CmdKind_DisableCfg)
{
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_Background,
.px = floor_f32(ui_top_font_size()*6.f),
.string = str8_lit("($expr).enabled"));
}
else if(cmd_kind != RD_CmdKind_Null)
{
String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string;
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name));
String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string;
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name));
}
}
}
}
+1 -1
View File
@@ -1777,7 +1777,7 @@ ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis)
// rjf: if we have a violation, we need to subtract some amount from all children
F32 violation = total_size - total_allowed_size;
if(violation > 0)
if(violation > 0 && total_weighted_size > 0)
{
// rjf: figure out how much we can take in totality
F32 child_fixup_sum = 0;