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
3#include "app/gfx/arena.h"
7#include "app/gui/icons.h"
8#include "app/gui/color.h"
10#include "imgui/imgui.h"
11
12namespace yaze {
13namespace gui {
14namespace canvas {
15
16namespace {
17inline void Dispatch(
18 const std::function<void(CanvasContextMenu::Command, 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<PaletteWidget>();
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 usage_specific_items_[usage].push_back(item);
59}
60
65
66void CanvasContextMenu::Render(const std::string& context_id, const ImVec2& mouse_pos, Rom* rom,
67 const gfx::Bitmap* bitmap, const gfx::SnesPalette* palette,
68 const std::function<void(Command, const CanvasConfig&)>& command_handler,
69 CanvasConfig current_config) {
70 if (!enabled_) return;
71
72 // Context menu (under default mouse threshold)
73 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
74 enable_context_menu_ && drag_delta.x == 0.0F && drag_delta.y == 0.0F) {
75 ImGui::OpenPopupOnItemClick(context_id.c_str(), ImGuiPopupFlags_MouseButtonRight);
76 }
77
78 // Contents of the Context Menu
79 if (ImGui::BeginPopup(context_id.c_str())) {
80 // Render usage-specific menu first
82
83 // Add separator if there are usage-specific items
85 ImGui::Separator();
86 }
87
88 // Render view controls
89 RenderViewControlsMenu(command_handler, current_config);
90 ImGui::Separator();
91
92 // Render canvas properties
93 RenderCanvasPropertiesMenu(command_handler, current_config);
94 ImGui::Separator();
95
96 // Render bitmap operations if bitmap is available
97 if (bitmap) {
98 RenderBitmapOperationsMenu(const_cast<gfx::Bitmap*>(bitmap));
99 ImGui::Separator();
100 }
101
102 // Render palette operations if bitmap is available
103 if (bitmap) {
104 RenderPaletteOperationsMenu(rom, const_cast<gfx::Bitmap*>(bitmap));
105 ImGui::Separator();
106 }
107
108 if (bitmap) {
110 ImGui::Separator();
111 }
112
114 ImGui::Separator();
115
116 RenderGridControlsMenu(command_handler, current_config);
117 ImGui::Separator();
118
119 RenderScalingControlsMenu(command_handler, current_config);
120
121 // Render global menu items
122 if (!global_items_.empty()) {
123 ImGui::Separator();
124 RenderMenuSection("Custom Actions", global_items_);
125 }
126
127 ImGui::EndPopup();
128 }
129}
130
134
135void CanvasContextMenu::SetCanvasState(const ImVec2& canvas_size,
136 const ImVec2& content_size,
137 float global_scale,
138 float grid_step,
139 bool enable_grid,
140 bool enable_hex_labels,
141 bool enable_custom_labels,
142 bool enable_context_menu,
143 bool is_draggable,
144 bool auto_resize,
145 const ImVec2& scrolling) {
146 canvas_size_ = canvas_size;
147 content_size_ = content_size;
148 global_scale_ = global_scale;
149 grid_step_ = grid_step;
150 enable_grid_ = enable_grid;
156 scrolling_ = scrolling;
157}
158
160 if (!item.visible_condition()) {
161 return;
162 }
163
164 if (!item.enabled_condition()) {
165 ImGui::BeginDisabled();
166 }
167
168 if (item.subitems.empty()) {
169 // Simple menu item
170 if (ImGui::MenuItem(item.label.c_str(),
171 item.shortcut.empty() ? nullptr : item.shortcut.c_str())) {
172 item.callback();
173 }
174 } else {
175 // Menu with subitems
176 if (ImGui::BeginMenu(item.label.c_str())) {
177 for (const auto& subitem : item.subitems) {
178 RenderMenuItem(subitem);
179 }
180 ImGui::EndMenu();
181 }
182 }
183
184 if (!item.enabled_condition()) {
185 ImGui::EndDisabled();
186 }
187
188 if (item.separator_after) {
189 ImGui::Separator();
190 }
191}
192
193void CanvasContextMenu::RenderMenuSection(const std::string& title,
194 const std::vector<ContextMenuItem>& items) {
195 if (items.empty()) return;
196
197 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F), "%s", title.c_str());
198 for (const auto& item : items) {
199 RenderMenuItem(item);
200 }
201}
202
205 if (it == usage_specific_items_.end() || it->second.empty()) {
206 return;
207 }
208
209 std::string usage_name = GetUsageModeName(current_usage_);
210 ImVec4 usage_color = GetUsageModeColor(current_usage_);
211
212 ImGui::TextColored(usage_color, "%s %s Mode", ICON_MD_COLOR_LENS, usage_name.c_str());
213 ImGui::Separator();
214
215 for (const auto& item : it->second) {
216 RenderMenuItem(item);
217 }
218}
219
221 const std::function<void(Command, const CanvasConfig&)>& command_handler,
222 CanvasConfig current_config) {
223 if (ImGui::BeginMenu("View Controls")) {
224 if (ImGui::MenuItem("Reset View", "Ctrl+R")) {
225 Dispatch(command_handler, Command::kResetView, current_config);
226 }
227 if (ImGui::MenuItem("Zoom to Fit", "Ctrl+F")) {
228 Dispatch(command_handler, Command::kZoomToFit, current_config);
229 }
230 if (ImGui::MenuItem("Zoom In", "Ctrl++")) {
231 CanvasConfig updated = current_config;
232 updated.global_scale *= 1.25F;
233 Dispatch(command_handler, Command::kSetScale, updated);
234 }
235 if (ImGui::MenuItem("Zoom Out", "Ctrl+-")) {
236 CanvasConfig updated = current_config;
237 updated.global_scale *= 0.8F;
238 Dispatch(command_handler, Command::kSetScale, updated);
239 }
240 ImGui::Separator();
241 if (ImGui::MenuItem("Show Grid", nullptr, enable_grid_)) {
242 CanvasConfig updated = current_config;
243 updated.enable_grid = !enable_grid_;
244 Dispatch(command_handler, Command::kToggleGrid, updated);
245 }
246 if (ImGui::MenuItem("Show Hex Labels", nullptr, enable_hex_labels_)) {
247 CanvasConfig updated = current_config;
249 Dispatch(command_handler, Command::kToggleHexLabels, updated);
250 }
251 if (ImGui::MenuItem("Show Custom Labels", nullptr, enable_custom_labels_)) {
252 CanvasConfig updated = current_config;
254 Dispatch(command_handler, Command::kToggleCustomLabels, updated);
255 }
256 ImGui::EndMenu();
257 }
258}
259
261 const std::function<void(Command, const CanvasConfig&)>& command_handler,
262 CanvasConfig current_config) {
263 if (ImGui::BeginMenu(ICON_MD_SETTINGS " Canvas Properties")) {
264 ImGui::Text("Canvas Size: %.0f x %.0f", canvas_size_.x, canvas_size_.y);
265 ImGui::Text("Content Size: %.0f x %.0f", content_size_.x, content_size_.y);
266 ImGui::Text("Global Scale: %.2f", global_scale_);
267 ImGui::Text("Grid Step: %.1f", grid_step_);
268 ImGui::Text("Mouse Position: %.0f x %.0f", 0.0F, 0.0F); // Would need actual mouse pos
269
270 if (ImGui::MenuItem("Advanced Properties...")) {
271 CanvasConfig updated = current_config;
272 updated.enable_grid = enable_grid_;
276 updated.is_draggable = is_draggable_;
277 updated.auto_resize = auto_resize_;
278 updated.grid_step = grid_step_;
279 updated.canvas_size = canvas_size_;
280 updated.content_size = content_size_;
281 updated.scrolling = scrolling_;
282 Dispatch(command_handler, Command::kOpenAdvancedProperties, updated);
283 }
284
285 ImGui::EndMenu();
286 }
287}
288
290 if (!bitmap) return;
291
292 if (ImGui::BeginMenu(ICON_MD_IMAGE " Bitmap Properties")) {
293 ImGui::Text("Size: %d x %d", bitmap->width(), bitmap->height());
294 ImGui::Text("Pitch: %d", bitmap->surface()->pitch);
295 ImGui::Text("BitsPerPixel: %d", bitmap->surface()->format->BitsPerPixel);
296 ImGui::Text("BytesPerPixel: %d", bitmap->surface()->format->BytesPerPixel);
297
298 if (ImGui::BeginMenu("Format")) {
299 if (ImGui::MenuItem("Indexed")) {
301 // Queue texture update via Arena's deferred system
304 }
305 if (ImGui::MenuItem("4BPP")) {
307 // Queue texture update via Arena's deferred system
310 }
311 if (ImGui::MenuItem("8BPP")) {
313 // Queue texture update via Arena's deferred system
316 }
317 ImGui::EndMenu();
318 }
319 ImGui::EndMenu();
320 }
321}
322
324 if (!bitmap) return;
325
326 if (ImGui::BeginMenu(ICON_MD_PALETTE " Palette Operations")) {
327 if (ImGui::MenuItem("Edit Palette...")) {
328 palette_editor_->ShowPaletteEditor(*bitmap->mutable_palette(), "Palette Editor");
329 }
330 if (ImGui::MenuItem("Color Analysis...")) {
331 palette_editor_->ShowColorAnalysis(*bitmap, "Color Analysis");
332 }
333
334 if (rom && ImGui::BeginMenu("ROM Palette Selection")) {
335 palette_editor_->Initialize(rom);
336
337 // Render palette selector inline
338 ImGui::Text("Group:"); ImGui::SameLine();
339 ImGui::InputScalar("##group", ImGuiDataType_U64, &edit_palette_group_name_index_);
340 ImGui::Text("Palette:"); ImGui::SameLine();
341 ImGui::InputScalar("##palette", ImGuiDataType_U64, &edit_palette_index_);
342
343 if (ImGui::Button("Apply to Canvas")) {
345 }
346 ImGui::EndMenu();
347 }
348
349 if (ImGui::BeginMenu("View Palette")) {
350 DisplayEditablePalette(*bitmap->mutable_palette(), "Palette", true, 8);
351 ImGui::EndMenu();
352 }
353 ImGui::EndMenu();
354 }
355}
356
358 if (!palette_editor_) return;
359
360 palette_editor_->DrawROMPaletteSelector();
361}
362
364 if (ImGui::BeginMenu(ICON_MD_SWAP_HORIZ " BPP Operations")) {
365 if (ImGui::MenuItem("Format Analysis...")) {
366 // Open BPP analysis
367 }
368 if (ImGui::MenuItem("Convert Format...")) {
369 // Open BPP conversion dialog
370 }
371 if (ImGui::MenuItem("Format Comparison...")) {
372 // Open format comparison tool
373 }
374
375 ImGui::EndMenu();
376 }
377}
378
380 if (ImGui::BeginMenu(ICON_MD_TRENDING_UP " Performance")) {
381 auto& profiler = gfx::PerformanceProfiler::Get();
382 auto canvas_stats = profiler.GetStats("canvas_operations");
383 auto draw_stats = profiler.GetStats("canvas_draw");
384
385 ImGui::Text("Canvas Operations: %zu", canvas_stats.sample_count);
386 ImGui::Text("Average Time: %.2f ms", draw_stats.avg_time_us / 1000.0);
387
388 if (ImGui::MenuItem("Performance Dashboard...")) {
390 }
391 if (ImGui::MenuItem("Usage Report...")) {
392 // Open usage report
393 }
394
395 ImGui::EndMenu();
396 }
397}
398
400 const std::function<void(Command, const CanvasConfig&)>& command_handler,
401 CanvasConfig current_config) {
402 if (ImGui::BeginMenu(ICON_MD_GRID_ON " Grid Controls")) {
403 const struct GridOption {
404 const char* label;
405 float value;
406 } options[] = {{"8x8", 8.0F}, {"16x16", 16.0F},
407 {"32x32", 32.0F}, {"64x64", 64.0F}};
408
409 for (const auto& option : options) {
410 bool selected = grid_step_ == option.value;
411 if (ImGui::MenuItem(option.label, nullptr, selected)) {
412 CanvasConfig updated = current_config;
413 updated.grid_step = option.value;
414 Dispatch(command_handler, Command::kSetGridStep, updated);
415 }
416 }
417
418 ImGui::EndMenu();
419 }
420}
421
423 const std::function<void(Command, const CanvasConfig&)>& command_handler,
424 CanvasConfig current_config) {
425 if (ImGui::BeginMenu(ICON_MD_ZOOM_IN " Scaling Controls")) {
426 const struct ScaleOption {
427 const char* label;
428 float value;
429 } options[] = {{"0.25x", 0.25F}, {"0.5x", 0.5F}, {"1x", 1.0F},
430 {"2x", 2.0F}, {"4x", 4.0F}, {"8x", 8.0F}};
431
432 for (const auto& option : options) {
433 if (ImGui::MenuItem(option.label)) {
434 CanvasConfig updated = current_config;
435 updated.global_scale = option.value;
436 Dispatch(command_handler, Command::kSetScale, updated);
437 }
438 }
439
440 ImGui::EndMenu();
441 }
442}
443
444void CanvasContextMenu::RenderMaterialIcon(const std::string& icon_name, const ImVec4& color) {
445 // Simple material icon rendering using Unicode symbols
446 static std::unordered_map<std::string, const char*> icon_map = {
447 {"grid_on", ICON_MD_GRID_ON}, {"label", ICON_MD_LABEL}, {"edit", ICON_MD_EDIT}, {"menu", ICON_MD_MENU},
448 {"drag_indicator", ICON_MD_DRAG_INDICATOR}, {"fit_screen", ICON_MD_FIT_SCREEN}, {"zoom_in", ICON_MD_ZOOM_IN},
449 {"speed", ICON_MD_SPEED}, {"timer", ICON_MD_TIMER}, {"functions", ICON_MD_FUNCTIONS}, {"schedule", ICON_MD_SCHEDULE},
450 {"refresh", ICON_MD_REFRESH}, {"settings", ICON_MD_SETTINGS}, {"info", ICON_MD_INFO},
451 {"view", ICON_MD_VISIBILITY}, {"properties", ICON_MD_SETTINGS}, {"bitmap", ICON_MD_IMAGE}, {"palette", ICON_MD_PALETTE},
452 {"bpp", ICON_MD_SWAP_HORIZ}, {"performance", ICON_MD_TRENDING_UP}, {"grid", ICON_MD_GRID_ON}, {"scaling", ICON_MD_ZOOM_IN}
453 };
454
455 auto it = icon_map.find(icon_name);
456 if (it != icon_map.end()) {
457 ImGui::TextColored(color, "%s", it->second);
458 }
459}
460
462 switch (usage) {
463 case CanvasUsage::kTilePainting: return "Tile Painting";
464 case CanvasUsage::kTileSelecting: return "Tile Selecting";
465 case CanvasUsage::kSelectRectangle: return "Rectangle Selection";
466 case CanvasUsage::kColorPainting: return "Color Painting";
467 case CanvasUsage::kBitmapEditing: return "Bitmap Editing";
468 case CanvasUsage::kPaletteEditing: return "Palette Editing";
469 case CanvasUsage::kBppConversion: return "BPP Conversion";
470 case CanvasUsage::kPerformanceMode: return "Performance Mode";
471 case CanvasUsage::kUnknown: return "Unknown";
472 default: return "Unknown";
473 }
474}
475
477 switch (usage) {
478 case CanvasUsage::kTilePainting: return ImVec4(0.2F, 1.0F, 0.2F, 1.0F); // Green
479 case CanvasUsage::kTileSelecting: return ImVec4(0.2F, 0.8F, 1.0F, 1.0F); // Blue
480 case CanvasUsage::kSelectRectangle: return ImVec4(1.0F, 0.8F, 0.2F, 1.0F); // Yellow
481 case CanvasUsage::kColorPainting: return ImVec4(1.0F, 0.2F, 1.0F, 1.0F); // Magenta
482 case CanvasUsage::kBitmapEditing: return ImVec4(1.0F, 0.5F, 0.2F, 1.0F); // Orange
483 case CanvasUsage::kPaletteEditing: return ImVec4(0.8F, 0.2F, 1.0F, 1.0F); // Purple
484 case CanvasUsage::kBppConversion: return ImVec4(0.2F, 1.0F, 1.0F, 1.0F); // Cyan
485 case CanvasUsage::kPerformanceMode: return ImVec4(1.0F, 0.2F, 0.2F, 1.0F); // Red
486 case CanvasUsage::kUnknown: return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
487 default: return ImVec4(0.7F, 0.7F, 0.7F, 1.0F); // Gray
488 }
489}
490
492 // Create default menu items for different usage modes
493
494 // Tile Painting mode items
495 ContextMenuItem tile_paint_item("Paint Tile", "paint", []() {
496 // Tile painting action
497 });
498 usage_specific_items_[CanvasUsage::kTilePainting].push_back(tile_paint_item);
499
500 // Tile Selecting mode items
501 ContextMenuItem tile_select_item("Select Tile", "select", []() {
502 // Tile selection action
503 });
504 usage_specific_items_[CanvasUsage::kTileSelecting].push_back(tile_select_item);
505
506 // Rectangle Selection mode items
507 ContextMenuItem rect_select_item("Select Rectangle", "rect", []() {
508 // Rectangle selection action
509 });
510 usage_specific_items_[CanvasUsage::kSelectRectangle].push_back(rect_select_item);
511
512 // Color Painting mode items
513 ContextMenuItem color_paint_item("Paint Color", "color", []() {
514 // Color painting action
515 });
516 usage_specific_items_[CanvasUsage::kColorPainting].push_back(color_paint_item);
517
518 // Bitmap Editing mode items
519 ContextMenuItem bitmap_edit_item("Edit Bitmap", "edit", []() {
520 // Bitmap editing action
521 });
522 usage_specific_items_[CanvasUsage::kBitmapEditing].push_back(bitmap_edit_item);
523
524 // Palette Editing mode items
525 ContextMenuItem palette_edit_item("Edit Palette", "palette", []() {
526 // Palette editing action
527 });
528 usage_specific_items_[CanvasUsage::kPaletteEditing].push_back(palette_edit_item);
529
530 // BPP Conversion mode items
531 ContextMenuItem bpp_convert_item("Convert Format", "convert", []() {
532 // BPP conversion action
533 });
534 usage_specific_items_[CanvasUsage::kBppConversion].push_back(bpp_convert_item);
535
536 // Performance Mode items
537 ContextMenuItem perf_item("Performance Analysis", "perf", []() {
538 // Performance analysis action
539 });
541}
542
544 const std::string& icon,
545 std::function<void()> callback) {
546 return ContextMenuItem(label, icon, callback);
547}
548
550 const std::string& icon,
551 std::function<void()> callback) {
552 return ContextMenuItem(label, icon, callback);
553}
554
556 const std::string& icon,
557 std::function<void()> callback) {
558 return ContextMenuItem(label, icon, callback);
559}
560
562 const std::string& icon,
563 std::function<void()> callback) {
564 return ContextMenuItem(label, icon, callback);
565}
566
568 const std::string& icon,
569 std::function<void()> callback) {
570 return ContextMenuItem(label, icon, callback);
571}
572
573} // namespace canvas
574} // namespace gui
575} // namespace yaze
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
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
void Reformat(int format)
Reformat the bitmap to use a different pixel format.
Definition bitmap.cc:228
SnesPalette * mutable_palette()
Definition bitmap.h:252
int height() const
Definition bitmap.h:254
int width() const
Definition bitmap.h:253
SDL_Surface * surface() const
Definition bitmap.h:259
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 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 AddMenuItem(const ContextMenuItem &item)
ContextMenuItem CreateBppMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void RenderScalingControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
ImVec4 GetUsageModeColor(CanvasUsage usage) const
ContextMenuItem CreatePaletteMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void RenderCanvasPropertiesMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
void RenderBppOperationsMenu(const gfx::Bitmap *bitmap)
ContextMenuItem CreateBitmapMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void RenderPaletteOperationsMenu(Rom *rom, gfx::Bitmap *bitmap)
void Initialize(const std::string &canvas_id)
std::unique_ptr< PaletteWidget > palette_editor_
void RenderMenuItem(const ContextMenuItem &item)
std::unordered_map< CanvasUsage, std::vector< ContextMenuItem > > usage_specific_items_
ContextMenuItem CreateViewMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
void RenderMaterialIcon(const std::string &icon_name, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderGridControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
void RenderBitmapOperationsMenu(gfx::Bitmap *bitmap)
void RenderViewControlsMenu(const std::function< void(Command, const CanvasConfig &)> &command_handler, CanvasConfig current_config)
std::vector< ContextMenuItem > global_items_
void RenderMenuSection(const std::string &title, const std::vector< ContextMenuItem > &items)
ContextMenuItem CreatePerformanceMenuItem(const std::string &label, const std::string &icon, std::function< void()> callback)
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 canvas::CanvasConfig &)> &command_handler, CanvasConfig current_config)
std::string GetUsageModeName(CanvasUsage usage) const
#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
@ 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.
absl::Status DisplayEditablePalette(gfx::SnesPalette &palette, const std::string &title, bool show_color_picker, int colors_per_row, ImGuiColorEditFlags flags)
Definition color.cc:166
Main namespace for the application.
Canvas configuration options for modals.