yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
canvas_context_menu.cc
Go to the documentation of this file.
2
10#include "imgui/imgui.h"
11
12namespace yaze {
13namespace gui {
14
15namespace {
16inline void Dispatch(
17 const std::function<void(CanvasContextMenu::Command, const CanvasConfig&)>& handler,
19 if (handler) {
20 handler(command, config);
21 }
22}
23} // namespace
24
25void CanvasContextMenu::Initialize(const std::string& canvas_id) {
26 canvas_id_ = canvas_id;
27 enabled_ = true;
29 palette_editor_ = std::make_unique<PaletteEditorWidget>();
30
31 // Initialize canvas state
32 canvas_size_ = ImVec2(0, 0);
33 content_size_ = ImVec2(0, 0);
34 global_scale_ = 1.0F;
35 grid_step_ = 32.0F;
36 enable_grid_ = true;
37 enable_hex_labels_ = false;
40 is_draggable_ = false;
41 auto_resize_ = false;
42 scrolling_ = ImVec2(0, 0);
43
44 // Create default menu items
46}
47
51
53 global_items_.push_back(item);
54}
55
57 usage_specific_items_[usage].push_back(item);
58}
59
64
65void CanvasContextMenu::Render(const std::string& context_id,
66 const ImVec2& /* mouse_pos */, Rom* rom,
67 const gfx::Bitmap* bitmap,
68 const gfx::SnesPalette* /* palette */,
69 const std::function<void(Command, const CanvasConfig&)>& command_handler,
70 CanvasConfig current_config, Canvas* canvas) {
71 if (!enabled_) return;
72
73 // Context menu (under default mouse threshold)
74 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
75 enable_context_menu_ && drag_delta.x == 0.0F && drag_delta.y == 0.0F) {
76 ImGui::OpenPopupOnItemClick(context_id.c_str(), ImGuiPopupFlags_MouseButtonRight);
77 }
78
79 // Phase 4: Popup callback for automatic popup management
80 auto popup_callback = [canvas](const std::string& id, std::function<void()> callback) {
81 if (canvas) {
82 canvas->GetPopupRegistry().Open(id, callback);
83 }
84 };
85
86 // Contents of the Context Menu (Phase 4: Priority-based ordering)
87 if (ImGui::BeginPopup(context_id.c_str())) {
88 // PRIORITY 0: Editor-specific items (from Canvas::editor_menu_)
89 if (canvas && !canvas->editor_menu().sections.empty()) {
90 RenderCanvasMenu(canvas->editor_menu(), popup_callback);
91 }
92
93 // Also render usage-specific items (legacy support)
95 RenderUsageSpecificMenu(popup_callback);
96 ImGui::Separator();
97 }
98
99 // PRIORITY 10: Bitmap/Palette operations
100 if (bitmap) {
101 RenderBitmapOperationsMenu(const_cast<gfx::Bitmap*>(bitmap));
102 ImGui::Separator();
103
104 RenderPaletteOperationsMenu(rom, const_cast<gfx::Bitmap*>(bitmap));
105 ImGui::Separator();
106
108 ImGui::Separator();
109 }
110
111 // PRIORITY 20: Canvas properties
112 RenderCanvasPropertiesMenu(command_handler, current_config);
113 ImGui::Separator();
114
115 RenderViewControlsMenu(command_handler, current_config);
116 ImGui::Separator();
117
118 RenderGridControlsMenu(command_handler, current_config);
119 ImGui::Separator();
120
121 RenderScalingControlsMenu(command_handler, current_config);
122
123 // PRIORITY 30: Debug/Performance
124 if (ImGui::GetIO().KeyCtrl) { // Only show when Ctrl is held
125 ImGui::Separator();
127 }
128
129 // Render global menu items (if any)
130 if (!global_items_.empty()) {
131 ImGui::Separator();
132 RenderMenuSection("Custom Actions", global_items_, popup_callback);
133 }
134
135 ImGui::EndPopup();
136 }
137}
138
142
143void CanvasContextMenu::SetCanvasState(const ImVec2& canvas_size,
144 const ImVec2& content_size,
145 float global_scale,
146 float grid_step,
147 bool enable_grid,
148 bool /* enable_hex_labels */,
149 bool /* enable_custom_labels */,
150 bool /* enable_context_menu */,
151 bool /* is_draggable */,
152 bool /* auto_resize */,
153 const ImVec2& scrolling) {
154 canvas_size_ = canvas_size;
155 content_size_ = content_size;
156 global_scale_ = global_scale;
157 grid_step_ = grid_step;
158 enable_grid_ = enable_grid;
159 enable_hex_labels_ = false; // Field not used anymore
160 enable_custom_labels_ = false; // Field not used anymore
161 enable_context_menu_ = true; // Field not used anymore
162 is_draggable_ = false; // Field not used anymore
163 auto_resize_ = false; // Field not used anymore
164 scrolling_ = scrolling;
165}
166
168 std::function<void(const std::string&, std::function<void()>)> popup_callback) {
169 // Phase 4: Delegate to canvas_menu.h implementation
170 gui::RenderMenuItem(item, popup_callback);
171}
172
173void CanvasContextMenu::RenderMenuSection(const std::string& title,
174 const std::vector<CanvasMenuItem>& items,
175 std::function<void(const std::string&, std::function<void()>)> popup_callback) {
176 if (items.empty()) return;
177
178 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F), "%s", title.c_str());
179 for (const auto& item : items) {
180 RenderMenuItem(item, popup_callback);
181 }
182}
183
185 std::function<void(const std::string&, std::function<void()>)> popup_callback) {
187 if (it == usage_specific_items_.end() || it->second.empty()) {
188 return;
189 }
190
191 std::string usage_name = GetUsageModeName(current_usage_);
192 ImVec4 usage_color = GetUsageModeColor(current_usage_);
193
194 ImGui::TextColored(usage_color, "%s %s Mode", ICON_MD_COLOR_LENS, usage_name.c_str());
195 ImGui::Separator();
196
197 for (const auto& item : it->second) {
198 RenderMenuItem(item, popup_callback);
199 }
200}
201
203 const std::function<void(Command, const CanvasConfig&)>& command_handler,
204 CanvasConfig current_config) {
205 if (ImGui::BeginMenu("View Controls")) {
206 if (ImGui::MenuItem("Reset View", "Ctrl+R")) {
207 Dispatch(command_handler, Command::kResetView, current_config);
208 }
209 if (ImGui::MenuItem("Zoom to Fit", "Ctrl+F")) {
210 Dispatch(command_handler, Command::kZoomToFit, current_config);
211 }
212 if (ImGui::MenuItem("Zoom In", "Ctrl++")) {
213 CanvasConfig updated = current_config;
214 updated.global_scale *= 1.25F;
215 Dispatch(command_handler, Command::kSetScale, updated);
216 }
217 if (ImGui::MenuItem("Zoom Out", "Ctrl+-")) {
218 CanvasConfig updated = current_config;
219 updated.global_scale *= 0.8F;
220 Dispatch(command_handler, Command::kSetScale, updated);
221 }
222 ImGui::Separator();
223 if (ImGui::MenuItem("Show Grid", nullptr, enable_grid_)) {
224 CanvasConfig updated = current_config;
225 updated.enable_grid = !enable_grid_;
226 Dispatch(command_handler, Command::kToggleGrid, updated);
227 }
228 if (ImGui::MenuItem("Show Hex Labels", nullptr, enable_hex_labels_)) {
229 CanvasConfig updated = current_config;
231 Dispatch(command_handler, Command::kToggleHexLabels, updated);
232 }
233 if (ImGui::MenuItem("Show Custom Labels", nullptr, enable_custom_labels_)) {
234 CanvasConfig updated = current_config;
236 Dispatch(command_handler, Command::kToggleCustomLabels, updated);
237 }
238 ImGui::EndMenu();
239 }
240}
241
243 const std::function<void(Command, const CanvasConfig&)>& command_handler,
244 CanvasConfig current_config) {
245 if (ImGui::BeginMenu(ICON_MD_SETTINGS " Canvas Properties")) {
246 ImGui::Text("Canvas Size: %.0f x %.0f", canvas_size_.x, canvas_size_.y);
247 ImGui::Text("Content Size: %.0f x %.0f", content_size_.x, content_size_.y);
248 ImGui::Text("Global Scale: %.2f", global_scale_);
249 ImGui::Text("Grid Step: %.1f", grid_step_);
250 ImGui::Text("Mouse Position: %.0f x %.0f", 0.0F, 0.0F); // Would need actual mouse pos
251
252 if (ImGui::MenuItem("Advanced Properties...")) {
253 CanvasConfig updated = current_config;
254 updated.enable_grid = enable_grid_;
258 updated.is_draggable = is_draggable_;
259 updated.auto_resize = auto_resize_;
260 updated.grid_step = grid_step_;
261 updated.canvas_size = canvas_size_;
262 updated.content_size = content_size_;
263 updated.scrolling = scrolling_;
264 Dispatch(command_handler, Command::kOpenAdvancedProperties, updated);
265 }
266
267 ImGui::EndMenu();
268 }
269}
270
272 if (!bitmap) return;
273
274 if (ImGui::BeginMenu(ICON_MD_IMAGE " Bitmap Properties")) {
275 ImGui::Text("Size: %d x %d", bitmap->width(), bitmap->height());
276 ImGui::Text("Pitch: %d", bitmap->surface()->pitch);
277 ImGui::Text("BitsPerPixel: %d", bitmap->surface()->format->BitsPerPixel);
278 ImGui::Text("BytesPerPixel: %d", bitmap->surface()->format->BytesPerPixel);
279
280 if (ImGui::BeginMenu("Format")) {
281 if (ImGui::MenuItem("Indexed")) {
283 // Queue texture update via Arena's deferred system
286 }
287 if (ImGui::MenuItem("4BPP")) {
289 // Queue texture update via Arena's deferred system
292 }
293 if (ImGui::MenuItem("8BPP")) {
295 // Queue texture update via Arena's deferred system
298 }
299 ImGui::EndMenu();
300 }
301 ImGui::EndMenu();
302 }
303}
304
306 if (!bitmap) return;
307
308 if (ImGui::BeginMenu(ICON_MD_PALETTE " Palette Operations")) {
309 if (ImGui::MenuItem("Edit Palette...")) {
310 palette_editor_->ShowPaletteEditor(*bitmap->mutable_palette(), "Palette Editor");
311 }
312 if (ImGui::MenuItem("Color Analysis...")) {
313 palette_editor_->ShowColorAnalysis(*bitmap, "Color Analysis");
314 }
315
316 if (rom && ImGui::BeginMenu("ROM Palette Selection")) {
317 palette_editor_->Initialize(rom);
318
319 // Render palette selector inline
320 ImGui::Text("Group:"); ImGui::SameLine();
321 ImGui::InputScalar("##group", ImGuiDataType_U64, &edit_palette_group_name_index_);
322 ImGui::Text("Palette:"); ImGui::SameLine();
323 ImGui::InputScalar("##palette", ImGuiDataType_U64, &edit_palette_index_);
324
325 if (ImGui::Button("Apply to Canvas")) {
327 }
328 ImGui::EndMenu();
329 }
330
331 if (ImGui::BeginMenu("View Palette")) {
332 DisplayEditablePalette(*bitmap->mutable_palette(), "Palette", true, 8);
333 ImGui::EndMenu();
334 }
335
336 ImGui::Separator();
337
338 // Palette Help submenu
339 if (ImGui::BeginMenu(ICON_MD_HELP " Palette Help")) {
340 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F), "Bitmap Metadata");
341 ImGui::Separator();
342
343 const auto& meta = bitmap->metadata();
344 ImGui::Text("Source BPP: %d", meta.source_bpp);
345 ImGui::Text("Palette Format: %s", meta.palette_format == 0 ? "Full" : "Sub-palette");
346 ImGui::Text("Source Type: %s", meta.source_type.c_str());
347 ImGui::Text("Expected Colors: %d", meta.palette_colors);
348 ImGui::Text("Actual Palette Size: %zu", bitmap->palette().size());
349
350 ImGui::Separator();
351 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F), "Palette Application Method");
352 if (meta.palette_format == 0) {
353 ImGui::TextWrapped("Full palette (SetPalette) - all colors applied directly");
354 } else {
355 ImGui::TextWrapped("Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, 1-7 from palette");
356 }
357
358 ImGui::Separator();
359 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F), "Documentation");
360 if (ImGui::MenuItem("Palette System Architecture")) {
361 ImGui::SetClipboardText("yaze/docs/palette-system-architecture.md");
362 // TODO: Open file in system viewer
363 }
364 if (ImGui::MenuItem("User Palette Guide")) {
365 ImGui::SetClipboardText("yaze/docs/user-palette-guide.md");
366 // TODO: Open file in system viewer
367 }
368
369 ImGui::EndMenu();
370 }
371
372 ImGui::EndMenu();
373 }
374}
375
377 if (!palette_editor_) return;
378
379 palette_editor_->DrawROMPaletteSelector();
380}
381
383 if (ImGui::BeginMenu(ICON_MD_SWAP_HORIZ " BPP Operations")) {
384 if (ImGui::MenuItem("Format Analysis...")) {
385 // Open BPP analysis
386 }
387 if (ImGui::MenuItem("Convert Format...")) {
388 // Open BPP conversion dialog
389 }
390 if (ImGui::MenuItem("Format Comparison...")) {
391 // Open format comparison tool
392 }
393
394 ImGui::EndMenu();
395 }
396}
397
399 if (ImGui::BeginMenu(ICON_MD_TRENDING_UP " Performance")) {
400 auto& profiler = gfx::PerformanceProfiler::Get();
401 auto canvas_stats = profiler.GetStats("canvas_operations");
402 auto draw_stats = profiler.GetStats("canvas_draw");
403
404 ImGui::Text("Canvas Operations: %zu", canvas_stats.sample_count);
405 ImGui::Text("Average Time: %.2f ms", draw_stats.avg_time_us / 1000.0);
406
407 if (ImGui::MenuItem("Performance Dashboard...")) {
409 }
410 if (ImGui::MenuItem("Usage Report...")) {
411 // Open usage report
412 }
413
414 ImGui::EndMenu();
415 }
416}
417
419 const std::function<void(Command, const CanvasConfig&)>& command_handler,
420 CanvasConfig current_config) {
421 if (ImGui::BeginMenu(ICON_MD_GRID_ON " Grid Controls")) {
422 const struct GridOption {
423 const char* label;
424 float value;
425 } options[] = {{"8x8", 8.0F}, {"16x16", 16.0F},
426 {"32x32", 32.0F}, {"64x64", 64.0F}};
427
428 for (const auto& option : options) {
429 bool selected = grid_step_ == option.value;
430 if (ImGui::MenuItem(option.label, nullptr, selected)) {
431 CanvasConfig updated = current_config;
432 updated.grid_step = option.value;
433 Dispatch(command_handler, Command::kSetGridStep, updated);
434 }
435 }
436
437 ImGui::EndMenu();
438 }
439}
440
442 const std::function<void(Command, const CanvasConfig&)>& command_handler,
443 CanvasConfig current_config) {
444 if (ImGui::BeginMenu(ICON_MD_ZOOM_IN " Scaling Controls")) {
445 const struct ScaleOption {
446 const char* label;
447 float value;
448 } options[] = {{"0.25x", 0.25F}, {"0.5x", 0.5F}, {"1x", 1.0F},
449 {"2x", 2.0F}, {"4x", 4.0F}, {"8x", 8.0F}};
450
451 for (const auto& option : options) {
452 if (ImGui::MenuItem(option.label)) {
453 CanvasConfig updated = current_config;
454 updated.global_scale = option.value;
455 Dispatch(command_handler, Command::kSetScale, updated);
456 }
457 }
458
459 ImGui::EndMenu();
460 }
461}
462
463void CanvasContextMenu::RenderMaterialIcon(const std::string& icon_name, const ImVec4& color) {
464 // Simple material icon rendering using Unicode symbols
465 static std::unordered_map<std::string, const char*> icon_map = {
466 {"grid_on", ICON_MD_GRID_ON}, {"label", ICON_MD_LABEL}, {"edit", ICON_MD_EDIT}, {"menu", ICON_MD_MENU},
467 {"drag_indicator", ICON_MD_DRAG_INDICATOR}, {"fit_screen", ICON_MD_FIT_SCREEN}, {"zoom_in", ICON_MD_ZOOM_IN},
468 {"speed", ICON_MD_SPEED}, {"timer", ICON_MD_TIMER}, {"functions", ICON_MD_FUNCTIONS}, {"schedule", ICON_MD_SCHEDULE},
469 {"refresh", ICON_MD_REFRESH}, {"settings", ICON_MD_SETTINGS}, {"info", ICON_MD_INFO},
470 {"view", ICON_MD_VISIBILITY}, {"properties", ICON_MD_SETTINGS}, {"bitmap", ICON_MD_IMAGE}, {"palette", ICON_MD_PALETTE},
471 {"bpp", ICON_MD_SWAP_HORIZ}, {"performance", ICON_MD_TRENDING_UP}, {"grid", ICON_MD_GRID_ON}, {"scaling", ICON_MD_ZOOM_IN}
472 };
473
474 auto it = icon_map.find(icon_name);
475 if (it != icon_map.end()) {
476 ImGui::TextColored(color, "%s", it->second);
477 }
478}
479
481 switch (usage) {
482 case CanvasUsage::kTilePainting: return "Tile Painting";
483 case CanvasUsage::kTileSelecting: return "Tile Selecting";
484 case CanvasUsage::kSelectRectangle: return "Rectangle Selection";
485 case CanvasUsage::kColorPainting: return "Color Painting";
486 case CanvasUsage::kBitmapEditing: return "Bitmap Editing";
487 case CanvasUsage::kPaletteEditing: return "Palette Editing";
488 case CanvasUsage::kBppConversion: return "BPP Conversion";
489 case CanvasUsage::kPerformanceMode: return "Performance Mode";
490 case CanvasUsage::kEntityManipulation: return "Entity Manipulation";
491 case CanvasUsage::kUnknown: return "Unknown";
492 default: return "Unknown";
493 }
494}
495
497 switch (usage) {
498 case CanvasUsage::kTilePainting: return ImVec4(0.2F, 1.0F, 0.2F, 1.0F); // Green
499 case CanvasUsage::kTileSelecting: return ImVec4(0.2F, 0.8F, 1.0F, 1.0F); // Blue
500 case CanvasUsage::kSelectRectangle: return ImVec4(1.0F, 0.8F, 0.2F, 1.0F); // Yellow
501 case CanvasUsage::kColorPainting: return ImVec4(1.0F, 0.2F, 1.0F, 1.0F); // Magenta
502 case CanvasUsage::kBitmapEditing: return ImVec4(1.0F, 0.5F, 0.2F, 1.0F); // Orange
503 case CanvasUsage::kPaletteEditing: return ImVec4(0.8F, 0.2F, 1.0F, 1.0F); // Purple
504 case CanvasUsage::kBppConversion: return ImVec4(0.2F, 1.0F, 1.0F, 1.0F); // Cyan
505 case CanvasUsage::kPerformanceMode: return ImVec4(1.0F, 0.2F, 0.2F, 1.0F); // Red
506 case CanvasUsage::kEntityManipulation: return ImVec4(0.4F, 0.8F, 1.0F, 1.0F); // Light Blue
507 case CanvasUsage::kUnknown: return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
508 default: return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
509 }
510}
511
513 // Phase 4: Create default menu items using unified CanvasMenuItem
514
515 // Tile Painting mode items
516 CanvasMenuItem tile_paint_item("Paint Tile", "paint", []() {
517 // Tile painting action
518 });
519 usage_specific_items_[CanvasUsage::kTilePainting].push_back(tile_paint_item);
520
521 // Tile Selecting mode items
522 CanvasMenuItem tile_select_item("Select Tile", "select", []() {
523 // Tile selection action
524 });
525 usage_specific_items_[CanvasUsage::kTileSelecting].push_back(tile_select_item);
526
527 // Rectangle Selection mode items
528 CanvasMenuItem rect_select_item("Select Rectangle", "rect", []() {
529 // Rectangle selection action
530 });
531 usage_specific_items_[CanvasUsage::kSelectRectangle].push_back(rect_select_item);
532
533 // Color Painting mode items
534 CanvasMenuItem color_paint_item("Paint Color", "color", []() {
535 // Color painting action
536 });
537 usage_specific_items_[CanvasUsage::kColorPainting].push_back(color_paint_item);
538
539 // Bitmap Editing mode items
540 CanvasMenuItem bitmap_edit_item("Edit Bitmap", "edit", []() {
541 // Bitmap editing action
542 });
543 usage_specific_items_[CanvasUsage::kBitmapEditing].push_back(bitmap_edit_item);
544
545 // Palette Editing mode items
546 CanvasMenuItem palette_edit_item("Edit Palette", "palette", []() {
547 // Palette editing action
548 });
549 usage_specific_items_[CanvasUsage::kPaletteEditing].push_back(palette_edit_item);
550
551 // BPP Conversion mode items
552 CanvasMenuItem bpp_convert_item("Convert Format", "convert", []() {
553 // BPP conversion action
554 });
555 usage_specific_items_[CanvasUsage::kBppConversion].push_back(bpp_convert_item);
556
557 // Performance Mode items
558 CanvasMenuItem perf_item("Performance Analysis", "perf", []() {
559 // Performance analysis action
560 });
562}
563
565 const std::string& label, const std::string& icon, std::function<void()> callback) {
566 return CanvasMenuItem(label, icon, callback);
567}
568
570 const std::string& label, const std::string& icon, std::function<void()> callback) {
571 return CanvasMenuItem(label, icon, callback);
572}
573
575 const std::string& label, const std::string& icon, std::function<void()> callback) {
576 return CanvasMenuItem(label, icon, callback);
577}
578
580 const std::string& label, const std::string& icon, std::function<void()> callback) {
581 return CanvasMenuItem(label, icon, callback);
582}
583
585 const std::string& label, const std::string& icon, std::function<void()> callback) {
586 return CanvasMenuItem(label, icon, callback);
587}
588
589} // namespace gui
590} // namespace yaze
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:74
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
Definition arena.cc:32
static Arena & Get()
Definition arena.cc:15
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:66
const SnesPalette & palette() const
Definition bitmap.h:277
void Reformat(int format)
Reformat the bitmap to use a different pixel format.
Definition bitmap.cc:228
BitmapMetadata & metadata()
Definition bitmap.h:279
SnesPalette * mutable_palette()
Definition bitmap.h:278
int height() const
Definition bitmap.h:283
int width() const
Definition bitmap.h:282
SDL_Surface * surface() const
Definition bitmap.h:288
static PerformanceDashboard & Get()
void SetVisible(bool visible)
Show/hide the dashboard.
static PerformanceProfiler & Get()
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
void RenderBppOperationsMenu(const gfx::Bitmap *bitmap)
CanvasMenuItem CreatePaletteMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void Initialize(const std::string &canvas_id)
std::unique_ptr< PaletteEditorWidget > palette_editor_
void SetUsageMode(CanvasUsage usage)
std::unordered_map< CanvasUsage, std::vector< CanvasMenuItem > > usage_specific_items_
void RenderMenuItem(const CanvasMenuItem &item, std::function< void(const std::string &, std::function< void()>)> popup_callback)
void SetCanvasState(const ImVec2 &canvas_size, const ImVec2 &content_size, float global_scale, float grid_step, bool enable_grid, bool enable_hex_labels, bool enable_custom_labels, bool enable_context_menu, bool is_draggable, bool auto_resize, const ImVec2 &scrolling)
void RenderScalingControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
void RenderMaterialIcon(const std::string &icon_name, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderUsageSpecificMenu(std::function< void(const std::string &, std::function< void()>)> popup_callback)
void RenderViewControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
CanvasMenuItem CreateBppMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
std::string GetUsageModeName(CanvasUsage usage) const
ImVec4 GetUsageModeColor(CanvasUsage usage) const
void RenderCanvasPropertiesMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
void RenderMenuSection(const std::string &title, const std::vector< CanvasMenuItem > &items, std::function< void(const std::string &, std::function< void()>)> popup_callback)
void RenderGridControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
std::vector< CanvasMenuItem > global_items_
void RenderPaletteOperationsMenu(Rom *rom, gfx::Bitmap *bitmap)
void AddMenuItem(const CanvasMenuItem &item)
void Render(const std::string &context_id, const ImVec2 &mouse_pos, Rom *rom, const gfx::Bitmap *bitmap, const gfx::SnesPalette *palette, const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config, Canvas *canvas)
CanvasMenuItem CreateBitmapMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
CanvasMenuItem CreateViewMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void RenderBitmapOperationsMenu(gfx::Bitmap *bitmap)
CanvasMenuItem CreatePerformanceMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:59
PopupRegistry & GetPopupRegistry()
Definition canvas.h:185
CanvasMenuDefinition & editor_menu()
Definition canvas.h:175
void Open(const std::string &popup_id, std::function< void()> render_callback)
Open a persistent popup.
#define ICON_MD_FUNCTIONS
Definition icons.h:861
#define ICON_MD_SETTINGS
Definition icons.h:1697
#define ICON_MD_INFO
Definition icons.h:991
#define ICON_MD_FIT_SCREEN
Definition icons.h:779
#define ICON_MD_TRENDING_UP
Definition icons.h:2014
#define ICON_MD_SWAP_HORIZ
Definition icons.h:1894
#define ICON_MD_REFRESH
Definition icons.h:1570
#define ICON_MD_SCHEDULE
Definition icons.h:1650
#define ICON_MD_LABEL
Definition icons.h:1051
#define ICON_MD_DRAG_INDICATOR
Definition icons.h:622
#define ICON_MD_VISIBILITY
Definition icons.h:2099
#define ICON_MD_EDIT
Definition icons.h:643
#define ICON_MD_SPEED
Definition icons.h:1815
#define ICON_MD_GRID_ON
Definition icons.h:894
#define ICON_MD_TIMER
Definition icons.h:1980
#define ICON_MD_IMAGE
Definition icons.h:980
#define ICON_MD_ZOOM_IN
Definition icons.h:2192
#define ICON_MD_MENU
Definition icons.h:1194
#define ICON_MD_PALETTE
Definition icons.h:1368
#define ICON_MD_COLOR_LENS
Definition icons.h:438
#define ICON_MD_HELP
Definition icons.h:931
@ kIndexed
Definition bitmap.h:35
@ k8bpp
Definition bitmap.h:37
@ k4bpp
Definition bitmap.h:36
void Dispatch(const std::function< void(CanvasContextMenu::Command, const CanvasConfig &)> &handler, CanvasContextMenu::Command command, CanvasConfig config)
CanvasUsage
Canvas usage patterns and tracking.
void RenderCanvasMenu(const CanvasMenuDefinition &menu, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a complete menu definition.
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
absl::Status DisplayEditablePalette(gfx::SnesPalette &palette, const std::string &title, bool show_color_picker, int colors_per_row, ImGuiColorEditFlags flags)
Definition color.cc:348
Main namespace for the application.
Definition controller.cc:20
Unified configuration for canvas display and interaction.
std::vector< CanvasMenuSection > sections
Declarative menu item definition.
Definition canvas_menu.h:63