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 = CanvasMenuItem::WithPopup(label, popup_id, render_callback);
43 pending_items_.push_back(item);
44 return *this;
45}
46
48 const std::string& label, const std::string& icon,
49 const std::string& popup_id, std::function<void()> render_callback) {
50 CanvasMenuItem item = CanvasMenuItem::WithPopup(label, popup_id, render_callback);
51 item.icon = icon;
52 pending_items_.push_back(item);
53 return *this;
54}
55
57 const std::string& label, std::function<void()> callback,
58 std::function<bool()> condition) {
59 CanvasMenuItem item = CanvasMenuItem::Conditional(label, callback, condition);
60 pending_items_.push_back(item);
61 return *this;
62}
63
65 const std::string& label, const std::vector<CanvasMenuItem>& subitems) {
66 CanvasMenuItem item;
67 item.label = label;
68 item.subitems = subitems;
69 pending_items_.push_back(item);
70 return *this;
71}
72
74 if (!pending_items_.empty()) {
75 pending_items_.back().separator_after = true;
76 }
77 return *this;
78}
79
81 const std::string& title, MenuSectionPriority priority) {
82 // Flush any pending items to previous section
84
85 // Create new section
86 CanvasMenuSection section;
87 section.title = title;
88 section.priority = priority;
89 section.separator_after = true;
90 menu_.sections.push_back(section);
91
92 // Point current_section_ to the newly added section
94
95 return *this;
96}
97
103
108
110 menu_.sections.clear();
111 pending_items_.clear();
112 current_section_ = nullptr;
113 return *this;
114}
115
117 if (pending_items_.empty()) {
118 return;
119 }
120
121 // If no section exists yet, create a default one
122 if (menu_.sections.empty()) {
123 CanvasMenuSection section;
125 section.separator_after = true;
126 menu_.sections.push_back(section);
128 }
129
130 // Add pending items to current section
131 if (current_section_) {
133 pending_items_.begin(), pending_items_.end());
134 } else {
135 // Add to last section if current_section_ is null
136 menu_.sections.back().items.insert(menu_.sections.back().items.end(),
137 pending_items_.begin(), pending_items_.end());
138 }
139
140 pending_items_.clear();
141}
142
143} // namespace gui
144} // namespace yaze
145
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
Main namespace for the application.
Definition controller.cc:20
Complete menu definition.
std::vector< CanvasMenuSection > sections
Declarative menu item definition.
Definition canvas_menu.h:63
std::vector< CanvasMenuItem > subitems
Definition canvas_menu.h:86
static CanvasMenuItem Conditional(const std::string &lbl, std::function< void()> cb, std::function< bool()> condition)
std::function< void()> callback
Definition canvas_menu.h:74
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