yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
canvas_menu_builder.cc
Go to the documentation of this file.
2
3namespace yaze {
4namespace gui {
5
7 std::function<void()> callback) {
9 item.label = label;
10 item.callback = std::move(callback);
11 pending_items_.push_back(item);
12 return *this;
13}
14
16 const std::string& icon,
17 std::function<void()> callback) {
18 CanvasMenuItem item;
19 item.label = label;
20 item.icon = icon;
21 item.callback = std::move(callback);
22 pending_items_.push_back(item);
23 return *this;
24}
25
27 const std::string& icon,
28 const std::string& shortcut,
29 std::function<void()> callback) {
30 CanvasMenuItem item;
31 item.label = label;
32 item.icon = icon;
33 item.shortcut = shortcut;
34 item.callback = std::move(callback);
35 pending_items_.push_back(item);
36 return *this;
37}
38
40 const std::string& label, const std::string& popup_id,
41 std::function<void()> render_callback) {
42 CanvasMenuItem item =
43 CanvasMenuItem::WithPopup(label, popup_id, render_callback);
44 pending_items_.push_back(item);
45 return *this;
46}
47
49 const std::string& label, const std::string& icon,
50 const std::string& popup_id, std::function<void()> render_callback) {
51 CanvasMenuItem item =
52 CanvasMenuItem::WithPopup(label, popup_id, render_callback);
53 item.icon = icon;
54 pending_items_.push_back(item);
55 return *this;
56}
57
59 const std::string& label, std::function<void()> callback,
60 std::function<bool()> condition) {
61 CanvasMenuItem item = CanvasMenuItem::Conditional(label, callback, condition);
62 pending_items_.push_back(item);
63 return *this;
64}
65
67 const std::string& label, const std::vector<CanvasMenuItem>& subitems) {
68 CanvasMenuItem item;
69 item.label = label;
70 item.subitems = subitems;
71 pending_items_.push_back(item);
72 return *this;
73}
74
76 if (!pending_items_.empty()) {
77 pending_items_.back().separator_after = true;
78 }
79 return *this;
80}
81
83 const std::string& title, MenuSectionPriority priority) {
84 // Flush any pending items to previous section
86
87 // Create new section
88 CanvasMenuSection section;
89 section.title = title;
90 section.priority = priority;
91 section.separator_after = true;
92 menu_.sections.push_back(section);
93
94 // Point current_section_ to the newly added section
96
97 return *this;
98}
99
105
110
112 menu_.sections.clear();
113 pending_items_.clear();
114 current_section_ = nullptr;
115 return *this;
116}
117
119 if (pending_items_.empty()) {
120 return;
121 }
122
123 // If no section exists yet, create a default one
124 if (menu_.sections.empty()) {
125 CanvasMenuSection section;
127 section.separator_after = true;
128 menu_.sections.push_back(section);
130 }
131
132 // Add pending items to current section
133 if (current_section_) {
135 pending_items_.begin(),
136 pending_items_.end());
137 } else {
138 // Add to last section if current_section_ is null
139 menu_.sections.back().items.insert(menu_.sections.back().items.end(),
140 pending_items_.begin(),
141 pending_items_.end());
142 }
143
144 pending_items_.clear();
145}
146
147} // namespace gui
148} // namespace yaze
Builder pattern for constructing canvas menus fluently.
CanvasMenuBuilder & AddSubmenu(const std::string &label, const std::vector< CanvasMenuItem > &subitems)
Add a submenu with nested items.
CanvasMenuBuilder & AddConditionalItem(const std::string &label, std::function< void()> callback, std::function< bool()> condition)
Add a conditional menu item (enabled only when condition is true)
CanvasMenuBuilder & AddItem(const std::string &label, std::function< void()> callback)
Add a simple menu item.
CanvasMenuBuilder & Reset()
Reset the builder to start building a new menu.
CanvasMenuBuilder & AddPopupItem(const std::string &label, const std::string &popup_id, std::function< void()> render_callback)
Add a menu item that opens a persistent popup.
std::vector< CanvasMenuItem > pending_items_
CanvasMenuDefinition Build()
Build the final menu definition.
CanvasMenuBuilder & BeginSection(const std::string &title="", MenuSectionPriority priority=MenuSectionPriority::kEditorSpecific)
Start a new section with optional title.
CanvasMenuBuilder & EndSection()
End the current section.
CanvasMenuBuilder & AddSeparator()
Add a separator to visually group items.
MenuSectionPriority
Menu section priority for controlling rendering order.
Definition canvas_menu.h:23
Complete menu definition.
std::vector< CanvasMenuSection > sections
Declarative menu item definition.
Definition canvas_menu.h:64
std::vector< CanvasMenuItem > subitems
Definition canvas_menu.h:91
static CanvasMenuItem Conditional(const std::string &lbl, std::function< void()> cb, std::function< bool()> condition)
std::function< void()> callback
Definition canvas_menu.h:75
static CanvasMenuItem WithPopup(const std::string &lbl, const std::string &popup_id, std::function< void()> render_callback)
Menu section grouping related menu items.
std::vector< CanvasMenuItem > items
MenuSectionPriority priority