1#ifndef YAZE_APP_EDITOR_SETTINGS_EDITOR_H
2#define YAZE_APP_EDITOR_SETTINGS_EDITOR_H
4#include "absl/status/status.h"
8#include "imgui/imgui.h"
41 {
"Enabled", ImGuiDataType_Bool, 1,
43 {
"MyInt", ImGuiDataType_S32, 1, offsetof(ExampleTreeNode, DataInt)},
44 {
"MyVec2", ImGuiDataType_Float, 2, offsetof(ExampleTreeNode, DataVec2)},
47static ExampleTreeNode* ExampleTree_CreateNode(
const char* name,
49 ExampleTreeNode* parent) {
50 ExampleTreeNode* node = IM_NEW(ExampleTreeNode);
51 snprintf(node->Name, IM_ARRAYSIZE(node->Name),
"%s", name);
53 node->Parent = parent;
54 if (parent) parent->Childs.push_back(node);
59static ExampleTreeNode* ExampleTree_CreateDemoTree() {
60 static const char* root_names[] = {
"Apple",
"Banana",
"Cherry",
61 "Kiwi",
"Mango",
"Orange",
62 "Pineapple",
"Strawberry",
"Watermelon"};
65 ExampleTreeNode* node_L0 = ExampleTree_CreateNode(
"<ROOT>", ++uid, NULL);
66 for (
int idx_L0 = 0; idx_L0 < IM_ARRAYSIZE(root_names) * 2; idx_L0++) {
67 snprintf(name_buf, 32,
"%s %d", root_names[idx_L0 / 2], idx_L0 % 2);
68 ExampleTreeNode* node_L1 = ExampleTree_CreateNode(name_buf, ++uid, node_L0);
69 const int number_of_childs = (int)strlen(node_L1->Name);
70 for (
int idx_L1 = 0; idx_L1 < number_of_childs; idx_L1++) {
71 snprintf(name_buf, 32,
"Child %d", idx_L1);
72 ExampleTreeNode* node_L2 =
73 ExampleTree_CreateNode(name_buf, ++uid, node_L1);
74 node_L2->HasData =
true;
76 snprintf(name_buf, 32,
"Sub-child %d", 0);
77 ExampleTreeNode* node_L3 =
78 ExampleTree_CreateNode(name_buf, ++uid, node_L2);
79 node_L3->HasData =
true;
90 ImGui::SetNextItemWidth(-FLT_MIN);
91 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_F,
92 ImGuiInputFlags_Tooltip);
93 ImGui::PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus,
true);
94 if (ImGui::InputTextWithHint(
"##Filter",
"incl,-excl",
Filter.InputBuf,
95 IM_ARRAYSIZE(
Filter.InputBuf),
96 ImGuiInputTextFlags_EscapeClearsAll))
100 ImGuiTableFlags table_flags = ImGuiTableFlags_Resizable |
101 ImGuiTableFlags_ScrollY |
102 ImGuiTableFlags_RowBg;
103 if (ImGui::BeginTable(
"##split", 2, table_flags)) {
104 ImGui::TableSetupColumn(
"Object", ImGuiTableColumnFlags_WidthStretch,
106 ImGui::TableSetupColumn(
"Contents", ImGuiTableColumnFlags_WidthStretch,
112 if (
Filter.PassFilter(node->Name))
120 ImGui::PushID((
int)node->
UID);
121 ImGui::TableNextRow();
122 ImGui::TableSetColumnIndex(0);
123 ImGui::AlignTextToFramePadding();
124 ImGuiTreeNodeFlags tree_flags = ImGuiTreeNodeFlags_None;
126 ImGuiTreeNodeFlags_SpanAllColumns |
127 ImGuiTreeNodeFlags_AllowOverlap;
129 ImGuiTreeNodeFlags_OpenOnArrow |
130 ImGuiTreeNodeFlags_OpenOnDoubleClick;
134 ImGuiTreeNodeFlags_NavLeftJumpsBackHere;
136 ImGui::TreeNodeEx(
"##Object", tree_flags,
"%s", node->
Name);
137 ImGui::TableSetColumnIndex(1);
138 ImGui::TextDisabled(
"UID: 0x%08X", node->
UID);
143 if (node_open && node->
HasData) {
153 ImGui::TableNextRow();
154 ImGui::TableSetColumnIndex(0);
155 ImGui::AlignTextToFramePadding();
156 ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop | ImGuiItemFlags_NoNav,
158 ImGui::Selectable(field_desc.Name,
false,
159 ImGuiSelectableFlags_SpanAllColumns |
160 ImGuiSelectableFlags_AllowOverlap);
161 ImGui::PopItemFlag();
162 ImGui::TableSetColumnIndex(1);
163 ImGui::PushID(field_desc.Name);
164 void* field_ptr = (
void*)(((
unsigned char*)node) + field_desc.Offset);
165 switch (field_desc.DataType) {
166 case ImGuiDataType_Bool: {
167 IM_ASSERT(field_desc.DataCount == 1);
168 ImGui::Checkbox(
"##Editor", (
bool*)field_ptr);
171 case ImGuiDataType_S32: {
172 int v_min = INT_MIN, v_max = INT_MAX;
173 ImGui::SetNextItemWidth(-FLT_MIN);
174 ImGui::DragScalarN(
"##Editor", field_desc.DataType, field_ptr,
175 field_desc.DataCount, 1.0f, &v_min, &v_max);
178 case ImGuiDataType_Float: {
179 float v_min = 0.0f, v_max = 1.0f;
180 ImGui::SetNextItemWidth(-FLT_MIN);
181 ImGui::SliderScalarN(
"##Editor", field_desc.DataType, field_ptr,
182 field_desc.DataCount, &v_min, &v_max);
189 if (node_open) ImGui::TreePop();
195static void ShowExampleAppPropertyEditor(
bool* p_open) {
196 ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver);
197 if (!ImGui::Begin(
"Example: Property editor", p_open)) {
202 static ExampleAppPropertyEditor property_editor;
203 static ExampleTreeNode* tree_data = ExampleTree_CreateDemoTree();
204 property_editor.Draw(tree_data);
217 absl::Status
Load()
override;
218 absl::Status
Save()
override {
return absl::UnimplementedError(
"Save"); }
219 absl::Status
Update()
override;
222 absl::Status
Cut()
override {
return absl::UnimplementedError(
"Cut"); }
223 absl::Status
Copy()
override {
return absl::UnimplementedError(
"Copy"); }
224 absl::Status
Paste()
override {
return absl::UnimplementedError(
"Paste"); }
225 absl::Status
Undo()
override {
return absl::UnimplementedError(
"Undo"); }
226 absl::Status
Redo()
override {
return absl::UnimplementedError(
"Redo"); }
227 absl::Status
Find()
override {
return absl::UnimplementedError(
"Find"); }
The Rom class is used to load, save, and modify Rom data.
Interface for editor classes.
absl::Status Undo() override
void DrawGeneralSettings()
absl::Status Update() override
void DrawPerformanceSettings()
absl::Status Find() override
absl::Status Redo() override
UserSettings * user_settings_
absl::Status Load() override
void Initialize() override
void set_user_settings(UserSettings *settings)
absl::Status Copy() override
absl::Status Paste() override
absl::Status Save() override
SettingsEditor(Rom *rom=nullptr, UserSettings *user_settings=nullptr)
void DrawKeyboardShortcuts()
absl::Status Cut() override
void DrawEditorBehavior()
bool IsRomLoaded() const override
void DrawAIAgentSettings()
Manages user preferences and settings persistence.
Main namespace for the application.
void DrawTreeNode(ExampleTreeNode *node)
void Draw(ExampleTreeNode *root_node)
ImVector< ExampleTreeNode * > Childs