From b9212732a3f87ea738e82e79d0dadaa504ea5658 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 19 Apr 2024 16:40:53 -0400 Subject: [PATCH] Add flags to collapsing headers in zeml --- src/app/emu/emulator.h | 2 +- src/app/gui/zeml.cc | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/app/emu/emulator.h b/src/app/emu/emulator.h index 8a7927bd..cdf51dff 100644 --- a/src/app/emu/emulator.h +++ b/src/app/emu/emulator.h @@ -41,7 +41,7 @@ class Emulator : public SharedRom { TableNextColumn, BeginChild id="##" size="0,0" flags="NoMove|NoScrollbar" { - CollapsingHeader id="cpuState" title="Register Values" open=true { + CollapsingHeader id="cpuState" title="Register Values" flags="DefaultOpen" { Columns id="registersColumns" count="2" { Text text="A: 0x%04X" data="cpu.A", Text text="D: 0x%04X" data="cpu.D", diff --git a/src/app/gui/zeml.cc b/src/app/gui/zeml.cc index c27f2a01..82d73960 100644 --- a/src/app/gui/zeml.cc +++ b/src/app/gui/zeml.cc @@ -193,6 +193,32 @@ void ParseFlags(const WidgetType& type, const std::string& flags, attributes.flags = new ImGuiWindowFlags(windowFlags); break; } + case WidgetType::CollapsingHeader: { + // Create a flag map using the tree node flags + static std::map flagMap = { + {"None", ImGuiTreeNodeFlags_None}, + {"Selected", ImGuiTreeNodeFlags_Selected}, + {"Framed", ImGuiTreeNodeFlags_Framed}, + {"AllowItemOverlap", ImGuiTreeNodeFlags_AllowItemOverlap}, + {"NoTreePushOnOpen", ImGuiTreeNodeFlags_NoTreePushOnOpen}, + {"NoAutoOpenOnLog", ImGuiTreeNodeFlags_NoAutoOpenOnLog}, + {"DefaultOpen", ImGuiTreeNodeFlags_DefaultOpen}, + {"OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick}, + {"OpenOnArrow", ImGuiTreeNodeFlags_OpenOnArrow}, + {"Leaf", ImGuiTreeNodeFlags_Leaf}, + {"Bullet", ImGuiTreeNodeFlags_Bullet}, + {"FramePadding", ImGuiTreeNodeFlags_FramePadding}, + {"NavLeftJumpsBackHere", ImGuiTreeNodeFlags_NavLeftJumpsBackHere}, + {"CollapsingHeader", ImGuiTreeNodeFlags_CollapsingHeader}}; + ImGuiTreeNodeFlags treeFlags = ImGuiTreeNodeFlags_None; + for (const auto& flag : flag_tokens) { + if (flagMap.find(flag) != flagMap.end()) { + treeFlags |= flagMap[flag]; + } + } + attributes.flags = new ImGuiTreeNodeFlags(treeFlags); + break; + } case WidgetType::Table: { // Create a flag map static std::map flagMap = { @@ -377,13 +403,17 @@ void Render(Node& node) { } } break; - case WidgetType::CollapsingHeader: - if (ImGui::CollapsingHeader(node.attributes.title.c_str())) { + case WidgetType::CollapsingHeader: { + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_None; + if (node.attributes.flags) { + flags = *(ImGuiTreeNodeFlags*)node.attributes.flags; + } + if (ImGui::CollapsingHeader(node.attributes.title.c_str(), flags)) { for (auto& child : node.children) { Render(child); } } - break; + } break; case WidgetType::Columns: ImGui::Columns(node.attributes.count, node.attributes.title.c_str()); ImGui::Separator();