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 // Nested submenu items
91 std::vector<CanvasMenuItem> subitems;
92
93 // Color for the menu item label
94 ImVec4 color = ImVec4(1, 1, 1, 1);
95
96 // Whether to show a separator after this item
97 bool separator_after = false;
98
99 // Default constructor
100 CanvasMenuItem() = default;
101
102 // Simple menu item constructor
103 CanvasMenuItem(const std::string& lbl, std::function<void()> cb)
104 : label(lbl), callback(std::move(cb)) {}
105
106 // Menu item with icon
107 CanvasMenuItem(const std::string& lbl, const std::string& ico,
108 std::function<void()> cb)
109 : label(lbl), icon(ico), callback(std::move(cb)) {}
110
111 // Menu item with icon and shortcut
112 CanvasMenuItem(const std::string& lbl, const std::string& ico,
113 std::function<void()> cb, const std::string& sc)
114 : label(lbl), icon(ico), callback(std::move(cb)), shortcut(sc) {}
115
116 // Helper to create a disabled menu item
117 static CanvasMenuItem Disabled(const std::string& lbl) {
118 CanvasMenuItem item;
119 item.label = lbl;
120 item.enabled_condition = []() {
121 return false;
122 };
123 return item;
124 }
125
126 // Helper to create a conditional menu item
127 static CanvasMenuItem Conditional(const std::string& lbl,
128 std::function<void()> cb,
129 std::function<bool()> condition) {
130 CanvasMenuItem item;
131 item.label = lbl;
132 item.callback = std::move(cb);
133 item.enabled_condition = std::move(condition);
134 return item;
135 }
136
137 // Helper to create a menu item with popup
138 static CanvasMenuItem WithPopup(const std::string& lbl,
139 const std::string& popup_id,
140 std::function<void()> render_callback) {
141 CanvasMenuItem item;
142 item.label = lbl;
143 item.popup = CanvasPopupDefinition(popup_id, std::move(render_callback));
144 return item;
145 }
146};
147
155 // Optional section title (rendered as colored text)
156 std::string title;
157
158 // Color for section title
159 ImVec4 title_color = ImVec4(0.7f, 0.7f, 0.7f, 1.0f);
160
161 // Menu items in this section
162 std::vector<CanvasMenuItem> items;
163
164 // Whether to show a separator after this section
165 bool separator_after = true;
166
167 // Priority for ordering sections (lower values render first)
169
170 // Default constructor
171 CanvasMenuSection() = default;
172
173 // Constructor with title
174 explicit CanvasMenuSection(const std::string& t) : title(t) {}
175
176 // Constructor with title and items
177 CanvasMenuSection(const std::string& t,
178 const std::vector<CanvasMenuItem>& its)
179 : title(t), items(its) {}
180
181 // Constructor with title, items, and priority
182 CanvasMenuSection(const std::string& t,
183 const std::vector<CanvasMenuItem>& its,
185 : title(t), items(its), priority(prio) {}
186};
187
194 // Menu sections (rendered in order)
195 std::vector<CanvasMenuSection> sections;
196
197 // Whether the menu is enabled
198 bool enabled = true;
199
200 // Default constructor
202
203 // Constructor with sections
204 explicit CanvasMenuDefinition(const std::vector<CanvasMenuSection>& secs)
205 : sections(secs) {}
206
207 // Add a section
208 void AddSection(const CanvasMenuSection& section) {
209 sections.push_back(section);
210 }
211
212 // Add items without a section title
213 void AddItems(const std::vector<CanvasMenuItem>& items) {
214 CanvasMenuSection section;
215 section.items = items;
216 section.separator_after = false;
217 sections.push_back(section);
218 }
219};
220
221// ==================== Free Function API ====================
222
231void RenderMenuItem(
232 const CanvasMenuItem& item,
233 std::function<void(const std::string&, std::function<void()>)>
234 popup_opened_callback = nullptr);
235
245 const CanvasMenuSection& section,
246 std::function<void(const std::string&, std::function<void()>)>
247 popup_opened_callback = nullptr);
248
259 const CanvasMenuDefinition& menu,
260 std::function<void(const std::string&, std::function<void()>)>
261 popup_opened_callback = nullptr);
262
263} // namespace gui
264} // namespace yaze
265
266#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::vector< CanvasMenuItem > subitems
Definition canvas_menu.h:91
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