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
11#include "imgui/imgui.h"
12
13namespace yaze {
14namespace gui {
15
16namespace {
17inline void Dispatch(const std::function<void(CanvasContextMenu::Command,
18 const CanvasConfig&)>& handler,
20 if (handler) {
21 handler(command, config);
22 }
23}
24} // namespace
25
26void CanvasContextMenu::Initialize(const std::string& canvas_id) {
27 canvas_id_ = canvas_id;
28 enabled_ = true;
30 palette_editor_ = std::make_unique<PaletteEditorWidget>();
31
32 // Initialize canvas state
33 canvas_size_ = ImVec2(0, 0);
34 content_size_ = ImVec2(0, 0);
35 global_scale_ = 1.0F;
36 grid_step_ = 32.0F;
37 enable_grid_ = true;
38 enable_hex_labels_ = false;
41 is_draggable_ = false;
42 auto_resize_ = false;
43 scrolling_ = ImVec2(0, 0);
44
45 // Create default menu items
47}
48
52
54 global_items_.push_back(item);
55}
56
58 CanvasUsage usage) {
59 usage_specific_items_[usage].push_back(item);
60}
61
66
68 const std::string& context_id, const ImVec2& /* mouse_pos */, Rom* rom,
69 const gfx::Bitmap* bitmap, const gfx::SnesPalette* /* palette */,
70 const std::function<void(Command, const CanvasConfig&)>& command_handler,
71 CanvasConfig current_config, Canvas* canvas) {
72 if (!enabled_)
73 return;
74
75 // Context menu (under default mouse threshold)
76 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
77 enable_context_menu_ && drag_delta.x == 0.0F && drag_delta.y == 0.0F) {
78 ImGui::OpenPopupOnItemClick(context_id.c_str(),
79 ImGuiPopupFlags_MouseButtonRight);
80 }
81
82 // Phase 4: Popup callback for automatic popup management
83 auto popup_callback = [canvas](const std::string& id,
84 std::function<void()> callback) {
85 if (canvas) {
86 canvas->GetPopupRegistry().Open(id, callback);
87 }
88 };
89
90 // Contents of the Context Menu (Phase 4: Priority-based ordering)
91 if (ImGui::BeginPopup(context_id.c_str())) {
92 // PRIORITY 0: Editor-specific items (from Canvas::editor_menu_)
93 if (canvas && !canvas->editor_menu().sections.empty()) {
94 RenderCanvasMenu(canvas->editor_menu(), popup_callback);
95 }
96
97 // Only show built-in menu items if show_builtin_context_menu is true
98 if (current_config.show_builtin_context_menu) {
99 // Also render usage-specific items (legacy support)
101 RenderUsageSpecificMenu(popup_callback);
102 ImGui::Separator();
103 }
104
105 // PRIORITY 10: Bitmap/Palette operations
106 if (bitmap) {
107 RenderBitmapOperationsMenu(const_cast<gfx::Bitmap*>(bitmap));
108 ImGui::Separator();
109
110 RenderPaletteOperationsMenu(rom, const_cast<gfx::Bitmap*>(bitmap));
111 ImGui::Separator();
112
114 ImGui::Separator();
115 }
116
117 // PRIORITY 20: Canvas properties
118 RenderCanvasPropertiesMenu(command_handler, current_config);
119 ImGui::Separator();
120
121 RenderViewControlsMenu(command_handler, current_config);
122 ImGui::Separator();
123
124 RenderGridControlsMenu(command_handler, current_config);
125 ImGui::Separator();
126
127 RenderScalingControlsMenu(command_handler, current_config);
128
129 // PRIORITY 30: Debug/Performance
130 if (ImGui::GetIO().KeyCtrl) { // Only show when Ctrl is held
131 ImGui::Separator();
133 }
134
135 // Render global menu items (if any)
136 if (!global_items_.empty()) {
137 ImGui::Separator();
138 RenderMenuSection("Custom Actions", global_items_, popup_callback);
139 }
140 }
141
142 ImGui::EndPopup();
143 }
144}
145
149
151 const ImVec2& canvas_size, const ImVec2& content_size, float global_scale,
152 float grid_step, bool enable_grid, bool /* enable_hex_labels */,
153 bool /* enable_custom_labels */, bool /* enable_context_menu */,
154 bool /* is_draggable */, bool /* auto_resize */, const ImVec2& scrolling) {
155 canvas_size_ = canvas_size;
156 content_size_ = content_size;
157 global_scale_ = global_scale;
158 grid_step_ = grid_step;
159 enable_grid_ = enable_grid;
160 enable_hex_labels_ = false; // Field not used anymore
161 enable_custom_labels_ = false; // Field not used anymore
162 enable_context_menu_ = true; // Field not used anymore
163 is_draggable_ = false; // Field not used anymore
164 auto_resize_ = false; // Field not used anymore
165 scrolling_ = scrolling;
166}
167
169 const CanvasMenuItem& item,
170 std::function<void(const std::string&, std::function<void()>)>
171 popup_callback) {
172 // Phase 4: Delegate to canvas_menu.h implementation
173 gui::RenderMenuItem(item, popup_callback);
174}
175
177 const std::string& title, const std::vector<CanvasMenuItem>& items,
178 std::function<void(const std::string&, std::function<void()>)>
179 popup_callback) {
180 if (items.empty())
181 return;
182
183 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F), "%s", title.c_str());
184 for (const auto& item : items) {
185 RenderMenuItem(item, popup_callback);
186 }
187}
188
190 std::function<void(const std::string&, std::function<void()>)>
191 popup_callback) {
193 if (it == usage_specific_items_.end() || it->second.empty()) {
194 return;
195 }
196
197 std::string usage_name = GetUsageModeName(current_usage_);
198 ImVec4 usage_color = GetUsageModeColor(current_usage_);
199
200 ImGui::TextColored(usage_color, "%s %s Mode", ICON_MD_COLOR_LENS,
201 usage_name.c_str());
202 ImGui::Separator();
203
204 for (const auto& item : it->second) {
205 RenderMenuItem(item, popup_callback);
206 }
207}
208
210 const std::function<void(Command, const CanvasConfig&)>& command_handler,
211 CanvasConfig current_config) {
212 if (ImGui::BeginMenu("View Controls")) {
213 if (ImGui::MenuItem("Reset View", "Ctrl+R")) {
214 Dispatch(command_handler, Command::kResetView, current_config);
215 }
216 if (ImGui::MenuItem("Zoom to Fit", "Ctrl+F")) {
217 Dispatch(command_handler, Command::kZoomToFit, current_config);
218 }
219 if (ImGui::MenuItem("Zoom In", "Ctrl++")) {
220 CanvasConfig updated = current_config;
221 updated.global_scale *= 1.25F;
222 Dispatch(command_handler, Command::kSetScale, updated);
223 }
224 if (ImGui::MenuItem("Zoom Out", "Ctrl+-")) {
225 CanvasConfig updated = current_config;
226 updated.global_scale *= 0.8F;
227 Dispatch(command_handler, Command::kSetScale, updated);
228 }
229 ImGui::Separator();
230 if (ImGui::MenuItem("Show Grid", nullptr, enable_grid_)) {
231 CanvasConfig updated = current_config;
232 updated.enable_grid = !enable_grid_;
233 Dispatch(command_handler, Command::kToggleGrid, updated);
234 }
235 if (ImGui::MenuItem("Show Hex Labels", nullptr, enable_hex_labels_)) {
236 CanvasConfig updated = current_config;
238 Dispatch(command_handler, Command::kToggleHexLabels, updated);
239 }
240 if (ImGui::MenuItem("Show Custom Labels", nullptr, enable_custom_labels_)) {
241 CanvasConfig updated = current_config;
243 Dispatch(command_handler, Command::kToggleCustomLabels, updated);
244 }
245 ImGui::EndMenu();
246 }
247}
248
250 const std::function<void(Command, const CanvasConfig&)>& command_handler,
251 CanvasConfig current_config) {
252 if (ImGui::BeginMenu(ICON_MD_SETTINGS " Canvas Properties")) {
253 ImGui::Text("Canvas Size: %.0f x %.0f", canvas_size_.x, canvas_size_.y);
254 ImGui::Text("Content Size: %.0f x %.0f", content_size_.x, content_size_.y);
255 ImGui::Text("Global Scale: %.2f", global_scale_);
256 ImGui::Text("Grid Step: %.1f", grid_step_);
257 ImGui::Text("Mouse Position: %.0f x %.0f", 0.0F,
258 0.0F); // Would need actual mouse pos
259
260 if (ImGui::MenuItem("Advanced Properties...")) {
261 CanvasConfig updated = current_config;
262 updated.enable_grid = enable_grid_;
266 updated.is_draggable = is_draggable_;
267 updated.auto_resize = auto_resize_;
268 updated.grid_step = grid_step_;
269 updated.canvas_size = canvas_size_;
270 updated.content_size = content_size_;
271 updated.scrolling = scrolling_;
272 Dispatch(command_handler, Command::kOpenAdvancedProperties, updated);
273 }
274
275 ImGui::EndMenu();
276 }
277}
278
280 if (!bitmap)
281 return;
282
283 if (ImGui::BeginMenu(ICON_MD_IMAGE " Bitmap Properties")) {
284 ImGui::Text("Size: %d x %d", bitmap->width(), bitmap->height());
285 if (auto* surface = bitmap->surface()) {
286 ImGui::Text("Pitch: %d", surface->pitch);
287 ImGui::Text("BitsPerPixel: %d",
289 ImGui::Text("BytesPerPixel: %d",
291 }
292
293 if (ImGui::BeginMenu("Format")) {
294 if (ImGui::MenuItem("Indexed")) {
296 // Queue texture update via Arena's deferred system
299 }
300 if (ImGui::MenuItem("4BPP")) {
302 // Queue texture update via Arena's deferred system
305 }
306 if (ImGui::MenuItem("8BPP")) {
308 // Queue texture update via Arena's deferred system
311 }
312 ImGui::EndMenu();
313 }
314 ImGui::EndMenu();
315 }
316}
317
319 gfx::Bitmap* bitmap) {
320 if (!bitmap)
321 return;
322
323 if (ImGui::BeginMenu(ICON_MD_PALETTE " Palette Operations")) {
324 if (ImGui::MenuItem("Edit Palette...")) {
325 palette_editor_->ShowPaletteEditor(*bitmap->mutable_palette(),
326 "Palette Editor");
327 }
328 if (ImGui::MenuItem("Color Analysis...")) {
329 palette_editor_->ShowColorAnalysis(*bitmap, "Color Analysis");
330 }
331
332 if (rom && ImGui::BeginMenu("ROM Palette Selection")) {
333 palette_editor_->Initialize(rom);
334
335 // Render palette selector inline
336 ImGui::Text("Group:");
337 ImGui::SameLine();
338 ImGui::InputScalar("##group", ImGuiDataType_U64,
340 ImGui::Text("Palette:");
341 ImGui::SameLine();
342 ImGui::InputScalar("##palette", ImGuiDataType_U64, &edit_palette_index_);
343
344 if (ImGui::Button("Apply to Canvas")) {
345 palette_editor_->ApplyROMPalette(bitmap, edit_palette_group_name_index_,
347 }
348 ImGui::EndMenu();
349 }
350
351 if (ImGui::BeginMenu("View Palette")) {
352 DisplayEditablePalette(*bitmap->mutable_palette(), "Palette", true, 8);
353 ImGui::EndMenu();
354 }
355
356 ImGui::Separator();
357
358 // Palette Help submenu
359 if (ImGui::BeginMenu(ICON_MD_HELP " Palette Help")) {
360 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F), "Bitmap Metadata");
361 ImGui::Separator();
362
363 const auto& meta = bitmap->metadata();
364 ImGui::Text("Source BPP: %d", meta.source_bpp);
365 ImGui::Text("Palette Format: %s",
366 meta.palette_format == 0 ? "Full" : "Sub-palette");
367 ImGui::Text("Source Type: %s", meta.source_type.c_str());
368 ImGui::Text("Expected Colors: %d", meta.palette_colors);
369 ImGui::Text("Actual Palette Size: %zu", bitmap->palette().size());
370
371 ImGui::Separator();
372 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F),
373 "Palette Application Method");
374 if (meta.palette_format == 0) {
375 ImGui::TextWrapped(
376 "Full palette (SetPalette) - all colors applied directly");
377 } else {
378 ImGui::TextWrapped(
379 "Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, "
380 "1-7 from palette");
381 }
382
383 ImGui::Separator();
384 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F), "Documentation");
385 if (ImGui::MenuItem("Palette System Architecture")) {
386 ImGui::SetClipboardText("yaze/docs/palette-system-architecture.md");
387 // TODO: Open file in system viewer
388 }
389 if (ImGui::MenuItem("User Palette Guide")) {
390 ImGui::SetClipboardText("yaze/docs/user-palette-guide.md");
391 // TODO: Open file in system viewer
392 }
393
394 ImGui::EndMenu();
395 }
396
397 ImGui::EndMenu();
398 }
399}
400
402 if (!palette_editor_)
403 return;
404
405 palette_editor_->DrawROMPaletteSelector();
406}
407
409 const gfx::Bitmap* /* bitmap */) {
410 if (ImGui::BeginMenu(ICON_MD_SWAP_HORIZ " BPP Operations")) {
411 if (ImGui::MenuItem("Format Analysis...")) {
412 // Open BPP analysis
413 }
414 if (ImGui::MenuItem("Convert Format...")) {
415 // Open BPP conversion dialog
416 }
417 if (ImGui::MenuItem("Format Comparison...")) {
418 // Open format comparison tool
419 }
420
421 ImGui::EndMenu();
422 }
423}
424
426 if (ImGui::BeginMenu(ICON_MD_TRENDING_UP " Performance")) {
427 auto& profiler = gfx::PerformanceProfiler::Get();
428 auto canvas_stats = profiler.GetStats("canvas_operations");
429 auto draw_stats = profiler.GetStats("canvas_draw");
430
431 ImGui::Text("Canvas Operations: %zu", canvas_stats.sample_count);
432 ImGui::Text("Average Time: %.2f ms", draw_stats.avg_time_us / 1000.0);
433
434 if (ImGui::MenuItem("Performance Dashboard...")) {
436 }
437 if (ImGui::MenuItem("Usage Report...")) {
438 // Open usage report
439 }
440
441 ImGui::EndMenu();
442 }
443}
444
446 const std::function<void(Command, const CanvasConfig&)>& command_handler,
447 CanvasConfig current_config) {
448 if (ImGui::BeginMenu(ICON_MD_GRID_ON " Grid Controls")) {
449 const struct GridOption {
450 const char* label;
451 float value;
452 } options[] = {
453 {"8x8", 8.0F}, {"16x16", 16.0F}, {"32x32", 32.0F}, {"64x64", 64.0F}};
454
455 for (const auto& option : options) {
456 bool selected = grid_step_ == option.value;
457 if (ImGui::MenuItem(option.label, nullptr, selected)) {
458 CanvasConfig updated = current_config;
459 updated.grid_step = option.value;
460 Dispatch(command_handler, Command::kSetGridStep, updated);
461 }
462 }
463
464 ImGui::EndMenu();
465 }
466}
467
469 const std::function<void(Command, const CanvasConfig&)>& command_handler,
470 CanvasConfig current_config) {
471 if (ImGui::BeginMenu(ICON_MD_ZOOM_IN " Scaling Controls")) {
472 const struct ScaleOption {
473 const char* label;
474 float value;
475 } options[] = {{"0.25x", 0.25F}, {"0.5x", 0.5F}, {"1x", 1.0F},
476 {"2x", 2.0F}, {"4x", 4.0F}, {"8x", 8.0F}};
477
478 for (const auto& option : options) {
479 if (ImGui::MenuItem(option.label)) {
480 CanvasConfig updated = current_config;
481 updated.global_scale = option.value;
482 Dispatch(command_handler, Command::kSetScale, updated);
483 }
484 }
485
486 ImGui::EndMenu();
487 }
488}
489
490void CanvasContextMenu::RenderMaterialIcon(const std::string& icon_name,
491 const ImVec4& color) {
492 // Simple material icon rendering using Unicode symbols
493 static std::unordered_map<std::string, const char*> icon_map = {
494 {"grid_on", ICON_MD_GRID_ON},
495 {"label", ICON_MD_LABEL},
496 {"edit", ICON_MD_EDIT},
497 {"menu", ICON_MD_MENU},
498 {"drag_indicator", ICON_MD_DRAG_INDICATOR},
499 {"fit_screen", ICON_MD_FIT_SCREEN},
500 {"zoom_in", ICON_MD_ZOOM_IN},
501 {"speed", ICON_MD_SPEED},
502 {"timer", ICON_MD_TIMER},
503 {"functions", ICON_MD_FUNCTIONS},
504 {"schedule", ICON_MD_SCHEDULE},
505 {"refresh", ICON_MD_REFRESH},
506 {"settings", ICON_MD_SETTINGS},
507 {"info", ICON_MD_INFO},
508 {"view", ICON_MD_VISIBILITY},
509 {"properties", ICON_MD_SETTINGS},
510 {"bitmap", ICON_MD_IMAGE},
511 {"palette", ICON_MD_PALETTE},
512 {"bpp", ICON_MD_SWAP_HORIZ},
513 {"performance", ICON_MD_TRENDING_UP},
514 {"grid", ICON_MD_GRID_ON},
515 {"scaling", ICON_MD_ZOOM_IN}};
516
517 auto it = icon_map.find(icon_name);
518 if (it != icon_map.end()) {
519 ImGui::TextColored(color, "%s", it->second);
520 }
521}
522
524 switch (usage) {
526 return "Tile Painting";
528 return "Tile Selecting";
530 return "Rectangle Selection";
532 return "Color Painting";
534 return "Bitmap Editing";
536 return "Palette Editing";
538 return "BPP Conversion";
540 return "Performance Mode";
542 return "Entity Manipulation";
544 return "Unknown";
545 default:
546 return "Unknown";
547 }
548}
549
551 switch (usage) {
553 return ImVec4(0.2F, 1.0F, 0.2F, 1.0F); // Green
555 return ImVec4(0.2F, 0.8F, 1.0F, 1.0F); // Blue
557 return ImVec4(1.0F, 0.8F, 0.2F, 1.0F); // Yellow
559 return ImVec4(1.0F, 0.2F, 1.0F, 1.0F); // Magenta
561 return ImVec4(1.0F, 0.5F, 0.2F, 1.0F); // Orange
563 return ImVec4(0.8F, 0.2F, 1.0F, 1.0F); // Purple
565 return ImVec4(0.2F, 1.0F, 1.0F, 1.0F); // Cyan
567 return ImVec4(1.0F, 0.2F, 0.2F, 1.0F); // Red
569 return ImVec4(0.4F, 0.8F, 1.0F, 1.0F); // Light Blue
571 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
572 default:
573 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
574 }
575}
576
578 // Phase 4: Create default menu items using unified CanvasMenuItem
579
580 // Tile Painting mode items
581 CanvasMenuItem tile_paint_item("Paint Tile", "paint", []() {
582 // Tile painting action
583 });
584 usage_specific_items_[CanvasUsage::kTilePainting].push_back(tile_paint_item);
585
586 // Tile Selecting mode items
587 CanvasMenuItem tile_select_item("Select Tile", "select", []() {
588 // Tile selection action
589 });
591 tile_select_item);
592
593 // Rectangle Selection mode items
594 CanvasMenuItem rect_select_item("Select Rectangle", "rect", []() {
595 // Rectangle selection action
596 });
598 rect_select_item);
599
600 // Color Painting mode items
601 CanvasMenuItem color_paint_item("Paint Color", "color", []() {
602 // Color painting action
603 });
605 color_paint_item);
606
607 // Bitmap Editing mode items
608 CanvasMenuItem bitmap_edit_item("Edit Bitmap", "edit", []() {
609 // Bitmap editing action
610 });
612 bitmap_edit_item);
613
614 // Palette Editing mode items
615 CanvasMenuItem palette_edit_item("Edit Palette", "palette", []() {
616 // Palette editing action
617 });
619 palette_edit_item);
620
621 // BPP Conversion mode items
622 CanvasMenuItem bpp_convert_item("Convert Format", "convert", []() {
623 // BPP conversion action
624 });
626 bpp_convert_item);
627
628 // Performance Mode items
629 CanvasMenuItem perf_item("Performance Analysis", "perf", []() {
630 // Performance analysis action
631 });
633}
634
636 const std::string& label, const std::string& icon,
637 std::function<void()> callback) {
638 return CanvasMenuItem(label, icon, callback);
639}
640
642 const std::string& label, const std::string& icon,
643 std::function<void()> callback) {
644 return CanvasMenuItem(label, icon, callback);
645}
646
648 const std::string& label, const std::string& icon,
649 std::function<void()> callback) {
650 return CanvasMenuItem(label, icon, callback);
651}
652
654 const std::string& label, const std::string& icon,
655 std::function<void()> callback) {
656 return CanvasMenuItem(label, icon, callback);
657}
658
660 const std::string& label, const std::string& icon,
661 std::function<void()> callback) {
662 return CanvasMenuItem(label, icon, callback);
663}
664
665} // namespace gui
666} // namespace yaze
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
Definition arena.cc:34
static Arena & Get()
Definition arena.cc:19
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
const SnesPalette & palette() const
Definition bitmap.h:368
void Reformat(int format)
Reformat the bitmap to use a different pixel format.
Definition bitmap.cc:275
BitmapMetadata & metadata()
Definition bitmap.h:370
SnesPalette * mutable_palette()
Definition bitmap.h:369
int height() const
Definition bitmap.h:374
int width() const
Definition bitmap.h:373
SDL_Surface * surface() const
Definition bitmap.h:379
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:150
PopupRegistry & GetPopupRegistry()
Definition canvas.h:312
CanvasMenuDefinition & editor_menu()
Definition canvas.h:298
void Open(const std::string &popup_id, std::function< void()> render_callback)
Open a persistent popup.
#define ICON_MD_FUNCTIONS
Definition icons.h:863
#define ICON_MD_SETTINGS
Definition icons.h:1699
#define ICON_MD_INFO
Definition icons.h:993
#define ICON_MD_FIT_SCREEN
Definition icons.h:781
#define ICON_MD_TRENDING_UP
Definition icons.h:2016
#define ICON_MD_SWAP_HORIZ
Definition icons.h:1896
#define ICON_MD_REFRESH
Definition icons.h:1572
#define ICON_MD_SCHEDULE
Definition icons.h:1652
#define ICON_MD_LABEL
Definition icons.h:1053
#define ICON_MD_DRAG_INDICATOR
Definition icons.h:624
#define ICON_MD_VISIBILITY
Definition icons.h:2101
#define ICON_MD_EDIT
Definition icons.h:645
#define ICON_MD_SPEED
Definition icons.h:1817
#define ICON_MD_GRID_ON
Definition icons.h:896
#define ICON_MD_TIMER
Definition icons.h:1982
#define ICON_MD_IMAGE
Definition icons.h:982
#define ICON_MD_ZOOM_IN
Definition icons.h:2194
#define ICON_MD_MENU
Definition icons.h:1196
#define ICON_MD_PALETTE
Definition icons.h:1370
#define ICON_MD_COLOR_LENS
Definition icons.h:440
#define ICON_MD_HELP
Definition icons.h:933
@ kIndexed
Definition bitmap.h:36
@ k8bpp
Definition bitmap.h:38
@ k4bpp
Definition bitmap.h:37
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:352
int GetSurfaceBitsPerPixel(SDL_Surface *surface)
Get bits per pixel from a surface.
Definition sdl_compat.h:434
int GetSurfaceBytesPerPixel(SDL_Surface *surface)
Get bytes per pixel from a surface.
Definition sdl_compat.h:507
SDL2/SDL3 compatibility layer.
Unified configuration for canvas display and interaction.
std::vector< CanvasMenuSection > sections
Declarative menu item definition.
Definition canvas_menu.h:64