yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
canvas_menu.h
Go to the documentation of this file.
1#ifndef YAZE_APP_GUI_CANVAS_CANVAS_MENU_H
2#define YAZE_APP_GUI_CANVAS_CANVAS_MENU_H
3
4#include <functional>
5#include <optional>
6#include <string>
7#include <vector>
8
9#include "imgui/imgui.h"
10
11namespace yaze {
12namespace gui {
13
24 kEditorSpecific = 0, // Highest priority - editor-specific actions
25 kBitmapPalette = 10, // Medium priority - bitmap/palette operations
26 kCanvasProperties = 20, // Low priority - canvas settings
27 kDebug = 30 // Lowest priority - debug/performance
28};
29
37 // Unique popup identifier for ImGui
38 std::string popup_id;
39
40 // Callback that renders the popup content (should call
41 // ImGui::BeginPopup/EndPopup)
42 std::function<void()> render_callback;
43
44 // Whether to automatically open the popup when menu item is selected
46
47 // Whether the popup should persist across frames until explicitly closed
49
50 // Default constructor
52
53 // Constructor for simple popups
54 CanvasPopupDefinition(const std::string& id, std::function<void()> callback)
55 : popup_id(id), render_callback(std::move(callback)) {}
56};
57
65 // Display label for the menu item
66 std::string label;
67
68 // Optional icon (Material Design icon name or Unicode glyph)
69 std::string icon;
70
71 // Optional keyboard shortcut display (e.g., "Ctrl+S")
72 std::string shortcut;
73
74 // Callback invoked when menu item is selected
75 std::function<void()> callback;
76
77 // Optional popup definition - if present, popup will be managed automatically
78 std::optional<CanvasPopupDefinition> popup;
79
80 // Condition to determine if menu item is enabled
81 std::function<bool()> enabled_condition = []() {
82 return true;
83 };
84
85 // Condition to determine if menu item is visible
86 std::function<bool()> visible_condition = []() {
87 return true;
88 };
89
90 // Optional checked state for toggle-like menu items.
91 std::function<bool()> checked_condition;
92
93 // Nested submenu items
94 std::vector<CanvasMenuItem> subitems;
95
96 // Color for the menu item label
97 ImVec4 color = ImVec4(1, 1, 1, 1);
98
99 // Whether to show a separator after this item
100 bool separator_after = false;
101
102 // Default constructor
103 CanvasMenuItem() = default;
104
105 // Simple menu item constructor
106 CanvasMenuItem(const std::string& lbl, std::function<void()> cb)
107 : label(lbl), callback(std::move(cb)) {}
108
109 // Menu item with icon
110 CanvasMenuItem(const std::string& lbl, const std::string& ico,
111 std::function<void()> cb)
112 : label(lbl), icon(ico), callback(std::move(cb)) {}
113
114 // Menu item with icon and shortcut
115 CanvasMenuItem(const std::string& lbl, const std::string& ico,
116 std::function<void()> cb, const std::string& sc)
117 : label(lbl), icon(ico), callback(std::move(cb)), shortcut(sc) {}
118
119 // Helper to create a disabled menu item
120 static CanvasMenuItem Disabled(const std::string& lbl) {
121 CanvasMenuItem item;
122 item.label = lbl;
123 item.enabled_condition = []() {
124 return false;
125 };
126 return item;
127 }
128
129 // Helper to create a conditional menu item
130 static CanvasMenuItem Conditional(const std::string& lbl,
131 std::function<void()> cb,
132 std::function<bool()> condition) {
133 CanvasMenuItem item;
134 item.label = lbl;
135 item.callback = std::move(cb);
136 item.enabled_condition = std::move(condition);
137 return item;
138 }
139
140 // Helper to create a menu item with popup
141 static CanvasMenuItem WithPopup(const std::string& lbl,
142 const std::string& popup_id,
143 std::function<void()> render_callback) {
144 CanvasMenuItem item;
145 item.label = lbl;
146 item.popup = CanvasPopupDefinition(popup_id, std::move(render_callback));
147 return item;
148 }
149};
150
158 // Optional section title (rendered as colored text)
159 std::string title;
160
161 // Color for section title
162 ImVec4 title_color = ImVec4(0.7f, 0.7f, 0.7f, 1.0f);
163
164 // Menu items in this section
165 std::vector<CanvasMenuItem> items;
166
167 // Whether to show a separator after this section
168 bool separator_after = true;
169
170 // Priority for ordering sections (lower values render first)
172
173 // Default constructor
174 CanvasMenuSection() = default;
175
176 // Constructor with title
177 explicit CanvasMenuSection(const std::string& t) : title(t) {}
178
179 // Constructor with title and items
180 CanvasMenuSection(const std::string& t,
181 const std::vector<CanvasMenuItem>& its)
182 : title(t), items(its) {}
183
184 // Constructor with title, items, and priority
185 CanvasMenuSection(const std::string& t,
186 const std::vector<CanvasMenuItem>& its,
188 : title(t), items(its), priority(prio) {}
189};
190
197 // Menu sections (rendered in order)
198 std::vector<CanvasMenuSection> sections;
199
200 // Whether the menu is enabled
201 bool enabled = true;
202
203 // Default constructor
205
206 // Constructor with sections
207 explicit CanvasMenuDefinition(const std::vector<CanvasMenuSection>& secs)
208 : sections(secs) {}
209
210 // Add a section
211 void AddSection(const CanvasMenuSection& section) {
212 sections.push_back(section);
213 }
214
215 // Add items without a section title
216 void AddItems(const std::vector<CanvasMenuItem>& items) {
217 CanvasMenuSection section;
218 section.items = items;
219 section.separator_after = false;
220 sections.push_back(section);
221 }
222};
223
224// ==================== Free Function API ====================
225
234void RenderMenuItem(
235 const CanvasMenuItem& item,
236 std::function<void(const std::string&, std::function<void()>)>
237 popup_opened_callback = nullptr);
238
248 const CanvasMenuSection& section,
249 std::function<void(const std::string&, std::function<void()>)>
250 popup_opened_callback = nullptr);
251
262 const CanvasMenuDefinition& menu,
263 std::function<void(const std::string&, std::function<void()>)>
264 popup_opened_callback = nullptr);
265
266} // namespace gui
267} // namespace yaze
268
269#endif // YAZE_APP_GUI_CANVAS_CANVAS_MENU_H
MenuSectionPriority
Menu section priority for controlling rendering order.
Definition canvas_menu.h:23
void RenderCanvasMenu(const CanvasMenuDefinition &menu, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a complete menu definition.
void RenderMenuSection(const CanvasMenuSection &section, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a menu section.
void RenderMenuItem(const CanvasMenuItem &item, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a single menu item.
Definition canvas_menu.cc:6
Complete menu definition.
std::vector< CanvasMenuSection > sections
void AddItems(const std::vector< CanvasMenuItem > &items)
void AddSection(const CanvasMenuSection &section)
CanvasMenuDefinition(const std::vector< CanvasMenuSection > &secs)
Declarative menu item definition.
Definition canvas_menu.h:64
std::function< bool()> checked_condition
Definition canvas_menu.h:91
std::vector< CanvasMenuItem > subitems
Definition canvas_menu.h:94
CanvasMenuItem(const std::string &lbl, const std::string &ico, std::function< void()> cb, const std::string &sc)
std::function< bool()> enabled_condition
Definition canvas_menu.h:81
CanvasMenuItem(const std::string &lbl, const std::string &ico, std::function< void()> cb)
static CanvasMenuItem Conditional(const std::string &lbl, std::function< void()> cb, std::function< bool()> condition)
std::function< void()> callback
Definition canvas_menu.h:75
std::optional< CanvasPopupDefinition > popup
Definition canvas_menu.h:78
CanvasMenuItem(const std::string &lbl, std::function< void()> cb)
static CanvasMenuItem WithPopup(const std::string &lbl, const std::string &popup_id, std::function< void()> render_callback)
std::function< bool()> visible_condition
Definition canvas_menu.h:86
static CanvasMenuItem Disabled(const std::string &lbl)
Menu section grouping related menu items.
CanvasMenuSection(const std::string &t, const std::vector< CanvasMenuItem > &its, MenuSectionPriority prio)
CanvasMenuSection(const std::string &t, const std::vector< CanvasMenuItem > &its)
CanvasMenuSection(const std::string &t)
std::vector< CanvasMenuItem > items
MenuSectionPriority priority
Declarative popup definition for menu items.
Definition canvas_menu.h:36
CanvasPopupDefinition(const std::string &id, std::function< void()> callback)
Definition canvas_menu.h:54
std::function< void()> render_callback
Definition canvas_menu.h:42