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 ImGui::BeginPopup/EndPopup)
41 std::function<void()> render_callback;
42
43 // Whether to automatically open the popup when menu item is selected
45
46 // Whether the popup should persist across frames until explicitly closed
48
49 // Default constructor
51
52 // Constructor for simple popups
53 CanvasPopupDefinition(const std::string& id, std::function<void()> callback)
54 : popup_id(id), render_callback(std::move(callback)) {}
55};
56
64 // Display label for the menu item
65 std::string label;
66
67 // Optional icon (Material Design icon name or Unicode glyph)
68 std::string icon;
69
70 // Optional keyboard shortcut display (e.g., "Ctrl+S")
71 std::string shortcut;
72
73 // Callback invoked when menu item is selected
74 std::function<void()> callback;
75
76 // Optional popup definition - if present, popup will be managed automatically
77 std::optional<CanvasPopupDefinition> popup;
78
79 // Condition to determine if menu item is enabled
80 std::function<bool()> enabled_condition = []() { return true; };
81
82 // Condition to determine if menu item is visible
83 std::function<bool()> visible_condition = []() { return true; };
84
85 // Nested submenu items
86 std::vector<CanvasMenuItem> subitems;
87
88 // Color for the menu item label
89 ImVec4 color = ImVec4(1, 1, 1, 1);
90
91 // Whether to show a separator after this item
92 bool separator_after = false;
93
94 // Default constructor
95 CanvasMenuItem() = default;
96
97 // Simple menu item constructor
98 CanvasMenuItem(const std::string& lbl, std::function<void()> cb)
99 : label(lbl), callback(std::move(cb)) {}
100
101 // Menu item with icon
102 CanvasMenuItem(const std::string& lbl, const std::string& ico,
103 std::function<void()> cb)
104 : label(lbl), icon(ico), callback(std::move(cb)) {}
105
106 // Menu item with icon and shortcut
107 CanvasMenuItem(const std::string& lbl, const std::string& ico,
108 std::function<void()> cb, const std::string& sc)
109 : label(lbl), icon(ico), callback(std::move(cb)), shortcut(sc) {}
110
111 // Helper to create a disabled menu item
112 static CanvasMenuItem Disabled(const std::string& lbl) {
113 CanvasMenuItem item;
114 item.label = lbl;
115 item.enabled_condition = []() { return false; };
116 return item;
117 }
118
119 // Helper to create a conditional menu item
120 static CanvasMenuItem Conditional(const std::string& lbl,
121 std::function<void()> cb,
122 std::function<bool()> condition) {
123 CanvasMenuItem item;
124 item.label = lbl;
125 item.callback = std::move(cb);
126 item.enabled_condition = std::move(condition);
127 return item;
128 }
129
130 // Helper to create a menu item with popup
131 static CanvasMenuItem WithPopup(const std::string& lbl,
132 const std::string& popup_id,
133 std::function<void()> render_callback) {
134 CanvasMenuItem item;
135 item.label = lbl;
136 item.popup = CanvasPopupDefinition(popup_id, std::move(render_callback));
137 return item;
138 }
139};
140
148 // Optional section title (rendered as colored text)
149 std::string title;
150
151 // Color for section title
152 ImVec4 title_color = ImVec4(0.7f, 0.7f, 0.7f, 1.0f);
153
154 // Menu items in this section
155 std::vector<CanvasMenuItem> items;
156
157 // Whether to show a separator after this section
158 bool separator_after = true;
159
160 // Priority for ordering sections (lower values render first)
162
163 // Default constructor
164 CanvasMenuSection() = default;
165
166 // Constructor with title
167 explicit CanvasMenuSection(const std::string& t) : title(t) {}
168
169 // Constructor with title and items
170 CanvasMenuSection(const std::string& t, const std::vector<CanvasMenuItem>& its)
171 : title(t), items(its) {}
172
173 // Constructor with title, items, and priority
174 CanvasMenuSection(const std::string& t, const std::vector<CanvasMenuItem>& its,
176 : title(t), items(its), priority(prio) {}
177};
178
185 // Menu sections (rendered in order)
186 std::vector<CanvasMenuSection> sections;
187
188 // Whether the menu is enabled
189 bool enabled = true;
190
191 // Default constructor
193
194 // Constructor with sections
195 explicit CanvasMenuDefinition(const std::vector<CanvasMenuSection>& secs)
196 : sections(secs) {}
197
198 // Add a section
199 void AddSection(const CanvasMenuSection& section) {
200 sections.push_back(section);
201 }
202
203 // Add items without a section title
204 void AddItems(const std::vector<CanvasMenuItem>& items) {
205 CanvasMenuSection section;
206 section.items = items;
207 section.separator_after = false;
208 sections.push_back(section);
209 }
210};
211
212// ==================== Free Function API ====================
213
222void RenderMenuItem(const CanvasMenuItem& item,
223 std::function<void(const std::string&, std::function<void()>)>
224 popup_opened_callback = nullptr);
225
234void RenderMenuSection(const CanvasMenuSection& section,
235 std::function<void(const std::string&, std::function<void()>)>
236 popup_opened_callback = nullptr);
237
247void RenderCanvasMenu(const CanvasMenuDefinition& menu,
248 std::function<void(const std::string&, std::function<void()>)>
249 popup_opened_callback = nullptr);
250
251} // namespace gui
252} // namespace yaze
253
254#endif // YAZE_APP_GUI_CANVAS_CANVAS_MENU_H
255
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
Main namespace for the application.
Definition controller.cc:20
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:63
std::vector< CanvasMenuItem > subitems
Definition canvas_menu.h:86
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:80
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:74
std::optional< CanvasPopupDefinition > popup
Definition canvas_menu.h:77
CanvasMenuItem(const std::string &lbl, std::function< void()> cb)
Definition canvas_menu.h:98
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:83
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:53
std::function< void()> render_callback
Definition canvas_menu.h:41