yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
canvas.h
Go to the documentation of this file.
1#ifndef YAZE_GUI_CANVAS_H
2#define YAZE_GUI_CANVAS_H
3
5#define IMGUI_DEFINE_MATH_OPERATORS
6
7#include <cstdint>
8#include <functional>
9#include <memory>
10#include <optional>
11#include <string>
12#include <string_view>
13#include <vector>
14
15#include "absl/types/span.h"
16#include "app/gfx/core/bitmap.h"
34#include "imgui/imgui.h"
35#include "rom/rom.h"
36#include "zelda3/game_data.h"
37
38namespace yaze {
39
44namespace gui {
45
46// Forward declarations (full includes would cause circular dependency or bloat)
47class CanvasAutomationAPI;
48struct CanvasExtensions;
49
50using gfx::Bitmap;
52
64class Canvas {
65 public:
66 // Default constructor
67 Canvas();
68 ~Canvas();
69
74 void Init(const CanvasConfig& config);
75 void Init(const std::string& id, ImVec2 canvas_size = ImVec2(0, 0));
76
77 // Thin delegators (editor headers use these in member initializers).
78 explicit Canvas(const std::string& id);
79 explicit Canvas(const std::string& id, ImVec2 canvas_size);
80 explicit Canvas(const std::string& id, ImVec2 canvas_size,
82 explicit Canvas(const std::string& id, ImVec2 canvas_size,
85 explicit Canvas(gfx::IRenderer* renderer, const std::string& id);
86 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
87 ImVec2 canvas_size);
88 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
90 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
92 float global_scale);
93
94 // Set renderer after construction (for late initialization)
96 gfx::IRenderer* renderer() const { return renderer_; }
97
98 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
100 switch (grid_size) {
102 config_.grid_step = 8.0f;
103 break;
105 config_.grid_step = 16.0f;
106 break;
108 config_.grid_step = 32.0f;
109 break;
111 config_.grid_step = 64.0f;
112 break;
113 }
115 }
116
117 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
118 void SetCustomGridStep(float step) {
119 config_.grid_step = step;
120 custom_step_ = step;
121 }
122
123 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
125
127 if (config_.grid_step == 8.0f)
129 if (config_.grid_step == 16.0f)
131 if (config_.grid_step == 32.0f)
133 if (config_.grid_step == 64.0f)
135 return CanvasGridSize::k16x16; // Default
136 }
137
139 const ImVec4& color,
140 const std::function<void()>& event, int tile_size,
141 float scale = 1.0f);
142
143 void UpdateInfoGrid(ImVec2 bg_size, float grid_size = 64.0f,
144 int label_id = 0);
145
146 // ==================== Modern ImGui-Style Interface ====================
147
165 void Begin(ImVec2 canvas_size = ImVec2(0, 0));
166 void Begin(const CanvasFrameOptions& options);
167
174 void End();
175 void End(const CanvasFrameOptions& options);
176
177 // ==================== Legacy Interface (Backward Compatible)
178 // ====================
179
180 // Background for the Canvas represents region without any content drawn to
181 // it, but can be controlled by the user. This is the low-level frame setup;
182 // prefer gui::BeginCanvas(..., CanvasFrameOptions) when you need child
183 // windows, optional grid step, and matching EndCanvas.
184 void DrawBackground(ImVec2 canvas_size = ImVec2(0, 0));
185
186 // Context Menu refers to what happens when the right mouse button is pressed
187 // This routine also handles the scrolling for the canvas.
188 void DrawContextMenu();
189
190 // Phase 4: Use unified menu item definition from canvas_menu.h
192
193 // Enhanced canvas components (non-optional, used every frame)
194 std::unique_ptr<CanvasContextMenu> context_menu_;
195 std::shared_ptr<CanvasUsageTracker> usage_tracker_;
196 std::shared_ptr<CanvasPerformanceIntegration> performance_integration_;
198
199 void AddContextMenuItem(const gui::CanvasMenuItem& item);
201
202 // Phase 4: Access to editor-provided menu definition
205 void SetContextMenuEnabled(bool enabled) { context_menu_enabled_ = enabled; }
209
210 // Persistent popup management for context menu actions
211 void OpenPersistentPopup(const std::string& popup_id,
212 std::function<void()> render_callback);
213 void ClosePersistentPopup(const std::string& popup_id);
215
216 // Popup registry access (Phase 3: for advanced users and testing)
219
220 // Enhanced view and edit operations
222 void ShowScalingControls();
223 void SetZoomToFit(const gfx::Bitmap& bitmap);
224 void ResetView();
225 void ApplyConfigSnapshot(const CanvasConfig& snapshot);
226 void ApplyScaleSnapshot(const CanvasConfig& snapshot);
227
228 // Modular component access
230 const CanvasConfig& GetConfig() const { return config_; }
232 const CanvasSelection& GetSelection() const { return selection_; }
233 // Clear modern, interaction-handler, and legacy selection state together.
234 void ClearSelection();
235
236 // Enhanced palette management
238 void ShowPaletteEditor();
239 void ShowColorAnalysis();
240 bool ApplyROMPalette(int group_index, int palette_index);
241
242 // BPP format management
244 void ShowBppAnalysis();
246 bool ConvertBitmapFormat(gfx::BppFormat target_format);
248
249 // Enhanced canvas management
251 void SetUsageMode(CanvasUsage usage);
252 auto usage_mode() const { return config_.usage_mode; }
253
254 void RecordCanvasOperation(const std::string& operation_name, double time_ms);
255 void ShowPerformanceUI();
256 void ShowUsageReport();
257
258 // Interaction handler access
265
266 // Automation API access (Phase 4A)
268
269 // Initialization and cleanup
270 void InitializeDefaults();
271 void Cleanup();
272
273 // Size reporting for ImGui table integration
274 ImVec2 GetMinimumSize() const;
275 ImVec2 GetPreferredSize() const;
276 ImVec2 GetCurrentSize() const { return config_.canvas_size; }
277 void SetAutoResize(bool auto_resize) { config_.auto_resize = auto_resize; }
278 bool IsAutoResize() const { return config_.auto_resize; }
279
280 // Table integration helpers
281 void ReserveTableSpace(const std::string& label = "");
282 bool BeginTableCanvas(const std::string& label = "");
283 void EndTableCanvas();
284
290 CanvasRuntime BeginInTable(const std::string& label,
291 const CanvasFrameOptions& options);
292 void EndInTable(CanvasRuntime& runtime, const CanvasFrameOptions& options);
293
294 // Improved interaction detection
295 bool HasValidSelection() const;
296 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
297 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
298 ImVec2 GetLastClickPosition() const;
299
300 // Tile painter methods
301 bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
302 bool DrawSolidTilePainter(const ImVec4& color, int size);
303 void DrawTileOnBitmap(int tile_size, gfx::Bitmap* bitmap, ImVec4 color);
304
305 void DrawOutline(int x, int y, int w, int h);
306 void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color);
307 void DrawOutlineWithColor(int x, int y, int w, int h, uint32_t color);
308
309 void DrawRect(int x, int y, int w, int h, ImVec4 color);
310
311 void DrawText(const std::string& text, int x, int y);
312 void DrawGridLines(float grid_step);
313
314 void DrawInfoGrid(float grid_step = 64.0f, int tile_id_offset = 8,
315 int label_id = 0);
316
317 void DrawLayeredElements();
318
320 float x = mouse_pos_in_canvas_.x;
321 float y = mouse_pos_in_canvas_.y;
322 float step = custom_step_ != 0.0f ? custom_step_ : config_.grid_step;
323 float scale = config_.global_scale != 0.0f ? config_.global_scale : 1.0f;
324 if (step <= 0.0f) {
325 return -1;
326 }
327 int num_columns = (canvas_sz_.x / scale) / step;
328 int num_rows = (canvas_sz_.y / scale) / step;
329 if (num_columns <= 0 || num_rows <= 0) {
330 return -1;
331 }
332 int tile_id = static_cast<int>(
333 (x / step) + (y / step) * static_cast<float>(num_columns));
334 if (tile_id >= num_columns * num_rows) {
335 tile_id = -1; // Invalid tile ID
336 }
337 return tile_id;
338 }
339 void DrawCustomHighlight(float grid_step);
340 bool IsMouseHovering() const { return is_hovered_; }
341 void ZoomIn();
342 void ZoomOut();
343
344 // Points accessors - points_ is maintained separately for custom overlay
345 // drawing
346 const ImVector<ImVec2>& points() const { return points_; }
347 ImVector<ImVec2>* mutable_points() { return &points_; }
348 auto push_back(ImVec2 pos) { points_.push_back(pos); }
349 auto draw_list() const { return draw_list_; }
350 auto zero_point() const { return canvas_p0_; }
351 ImVec2 ToCanvasPos(ImVec2 local) const;
352 auto scrolling() const { return scrolling_; }
353 void set_scrolling(ImVec2 scroll) {
354 state_.geometry.scrolling = scroll;
355 scrolling_ = scroll;
356 config_.scrolling = scroll; // Sync to config for persistence
357 }
358 auto drawn_tile_position() const { return drawn_tile_pos_; }
359 auto canvas_size() const { return canvas_sz_; }
360 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
361 void set_global_scale(float scale);
362 void set_draggable(bool draggable) { draggable_ = draggable; }
363
364 // Modern accessors using modular structure
366 const std::vector<ImVec2>& GetSelectedTiles() const {
367 return selected_tiles_;
368 }
369 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
370 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
371
372 // Configuration accessors
373 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
378 float GetGlobalScale() const { return config_.global_scale; }
379 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
380 void SetGlobalScale(float scale) { config_.global_scale = scale; }
382 float GetGridStep() const { return config_.grid_step; }
383
384 // Rectangle selection boundary control (prevents wrapping in large maps)
385 void SetClampRectToLocalMaps(bool clamp) {
387 }
391 float GetCanvasWidth() const { return config_.canvas_size.x; }
392 float GetCanvasHeight() const { return config_.canvas_size.y; }
393
394 // Legacy compatibility accessors
396 auto selected_tiles() const { return selected_tiles_; }
397 auto selected_tile_pos() const { return selected_tile_pos_; }
398 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
399 auto global_scale() const { return config_.global_scale; }
401 auto custom_step() const { return config_.grid_step; }
402 auto width() const { return config_.canvas_size.x; }
403 auto height() const { return config_.canvas_size.y; }
404
405 // Public accessors for methods that need to be accessed externally
406 auto canvas_id() const { return canvas_id_; }
407
408 // Public methods for drawing operations
409 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
410 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
411 float scale = 1.0f, int alpha = 255);
412 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
413 ImVec2 src_pos, ImVec2 src_size);
414 void DrawBitmapTable(const BitmapTable& gfx_bin);
426 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
427 int tile_size, float scale = 1.0f,
428 int local_map_size = 0x200,
429 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
430 void DrawBitmapPreview(Bitmap& bitmap, const BitmapPreviewOptions& options);
431 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
432 void DrawSelectRect(int current_map, int tile_size = 0x10,
433 float scale = 1.0f);
434 bool DrawTileSelector(int size, int size_y = 0);
435 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
436 void DrawOverlay();
437 auto labels(int i) {
438 if (i >= labels_.size()) {
439 labels_.push_back(ImVector<std::string>());
440 }
441 return labels_[i];
442 }
443 auto mutable_labels(int i) {
444 if (i >= labels_.size()) {
445 int x = i;
446 while (x >= labels_.size()) {
447 labels_.push_back(ImVector<std::string>());
448 x--;
449 }
450 labels_.push_back(ImVector<std::string>());
451 }
452 return &labels_[i];
453 }
454
457
460 auto selected_points() const { return selected_points_; }
461
462 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
463
464 void set_rom(Rom* rom) { rom_ = rom; }
465 Rom* rom() const { return rom_; }
468
469 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
470 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
471 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
472
473 private:
477
478 // Helper to build CanvasRuntime from current state (for delegation to
479 // stateless helpers)
493
494 // Modular configuration and state
498
499 // Phase 4: Optional extensions (lazy-initialized on first use)
500 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
501 // modals, palette_editor, automation_api
502 std::unique_ptr<CanvasExtensions> extensions_;
504
505 // Phase 1: Consolidated state (gradually replacing scattered members)
507
508 // Core canvas state
509 bool is_hovered_ = false;
510 bool refresh_graphics_ = false;
511
512 // Phase 4: Context menu system (declarative menu definition)
515
516 // Phase 4: Persistent popup state for context menu actions (unified registry)
518
519 // Legacy members (to be gradually replaced)
525
526 // Core canvas state
527 Bitmap* bitmap_ = nullptr;
528 Rom* rom_ = nullptr;
530 ImDrawList* draw_list_ = nullptr;
531
532 // Canvas geometry and interaction state
539
540 // Drawing and labeling
541 // NOTE: points_ synchronized from interaction_handler_ for backward
542 // compatibility
543 ImVector<ImVec2> points_;
544 ImVector<ImVector<std::string>> labels_;
545
546 // Identification
547 std::string canvas_id_ = "Canvas";
548 std::string context_id_ = "CanvasContext";
549
550 // Legacy compatibility (gradually being replaced by selection_)
551 std::vector<ImVec2> selected_tiles_;
552 ImVector<ImVec2> selected_points_;
553 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
555 float custom_step_ = 32.0f;
556 float global_scale_ = 1.0f;
557 bool enable_grid_ = true;
562 bool draggable_ = false;
563};
564
566 std::string id;
567 std::string label;
568 std::string shortcut;
569 std::function<bool()> enabled;
570 std::function<void()> on_click;
571};
572
574 public:
575 void Clear() { items_.clear(); }
576 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
577 absl::Span<const CanvasMenuAction> items() const { return items_; }
578 const std::string& popup_id() const { return popup_id_; }
579 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
580
581 private:
582 std::vector<CanvasMenuAction> items_;
583 std::string popup_id_ = "CanvasMenuHost";
584};
585
587 const CanvasRuntime& rt, CanvasConfig& cfg);
589 CanvasConfig& cfg);
590
619 public:
624 explicit ScopedCanvas(const std::string& id,
625 ImVec2 canvas_size = ImVec2(0, 0))
626 : canvas_(new Canvas()), owned_(true), active_(true) {
627 canvas_->Init(id, canvas_size);
628 canvas_->Begin();
629 }
630
634 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
635 ImVec2 canvas_size = ImVec2(0, 0))
636 : canvas_(new Canvas()), owned_(true), active_(true) {
637 canvas_->SetRenderer(renderer);
638 canvas_->Init(id, canvas_size);
639 canvas_->Begin();
640 }
641
645 explicit ScopedCanvas(Canvas& canvas)
646 : canvas_(&canvas), owned_(false), active_(true) {
647 canvas_->Begin();
648 }
649
654 if (active_ && canvas_) {
655 canvas_->End();
656 }
657 if (owned_) {
658 delete canvas_;
659 }
660 }
661
662 // No copy, move only
663 ScopedCanvas(const ScopedCanvas&) = delete;
665
666 ScopedCanvas(ScopedCanvas&& other) noexcept
667 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
668 other.active_ = false;
669 other.canvas_ = nullptr;
670 }
671
675 Canvas* operator->() { return canvas_; }
676 const Canvas* operator->() const { return canvas_; }
677
681 Canvas& operator*() { return *canvas_; }
682 const Canvas& operator*() const { return *canvas_; }
683
687 Canvas* get() { return canvas_; }
688 const Canvas* get() const { return canvas_; }
689
690 private:
692 bool owned_;
694};
695
710 public:
711 CanvasFrame(Canvas& canvas,
713 ~CanvasFrame();
714
715 CanvasFrame(const CanvasFrame&) = delete;
717
718 CanvasFrame(CanvasFrame&& other) noexcept;
719 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
720
721 Canvas* operator->() { return canvas_; }
722 const Canvas* operator->() const { return canvas_; }
723
724 private:
728};
729
730} // namespace gui
731} // namespace yaze
732
733#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
Programmatic interface for controlling canvas operations.
Lightweight RAII guard for existing Canvas instances.
Definition canvas.h:709
const Canvas * operator->() const
Definition canvas.h:722
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:721
CanvasFrameOptions options_
Definition canvas.h:726
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Definition canvas.cc:1968
Handles all tile-based interactions for Canvas.
absl::Span< const CanvasMenuAction > items() const
Definition canvas.h:577
void set_popup_id(std::string id)
Definition canvas.h:579
void AddItem(CanvasMenuAction item)
Definition canvas.h:576
const std::string & popup_id() const
Definition canvas.h:578
std::vector< CanvasMenuAction > items_
Definition canvas.h:582
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
ImVec2 scrolling_
Definition canvas.h:533
void set_scrolling(ImVec2 scroll)
Definition canvas.h:353
CanvasState state_
Definition canvas.h:506
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:262
auto selected_tile_pos() const
Definition canvas.h:397
ImVector< ImVec2 > points_
Definition canvas.h:543
int highlight_tile_id
Definition canvas.h:521
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1173
PopupRegistry popup_registry_
Definition canvas.h:517
Rom * rom() const
Definition canvas.h:465
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:204
std::string canvas_id_
Definition canvas.h:547
auto labels(int i)
Definition canvas.h:437
float GetCanvasWidth() const
Definition canvas.h:391
auto height() const
Definition canvas.h:403
auto custom_step() const
Definition canvas.h:401
void set_rom(Rom *rom)
Definition canvas.h:464
void ShowScalingControls()
Definition canvas.cc:1709
auto set_current_labels(int i)
Definition canvas.h:455
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:504
CanvasConfig config_
Definition canvas.h:496
ImVec2 selected_tile_pos_
Definition canvas.h:553
auto global_scale() const
Definition canvas.h:399
gfx::IRenderer * renderer_
Definition canvas.h:495
ImVec2 canvas_p1_
Definition canvas.h:536
void ShowBppAnalysis()
Definition canvas.cc:1857
gfx::IRenderer * renderer() const
Definition canvas.h:96
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1242
auto select_rect_active() const
Definition canvas.h:395
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:301
uint64_t edit_palette_group_name_index_
Definition canvas.h:523
auto selected_tiles() const
Definition canvas.h:396
ImVec2 ToCanvasPos(ImVec2 local) const
void DrawBitmapPreview(Bitmap &bitmap, const BitmapPreviewOptions &options)
void DrawBitmapGroup(std::vector< int > &group, gfx::Tilemap &tilemap, int tile_size, float scale=1.0f, int local_map_size=0x200, ImVec2 total_map_size=ImVec2(0x1000, 0x1000))
Draw group of bitmaps for multi-tile selection preview.
Definition canvas.cc:1252
bool BeginTableCanvas(const std::string &label="")
Definition canvas.cc:411
void InitializeEnhancedComponents()
Definition canvas.cc:284
CanvasRuntime BuildCurrentRuntime() const
Definition canvas.h:480
void ShowBppConversionDialog()
Definition canvas.cc:1866
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:1923
bool GetClampRectToLocalMaps() const
Definition canvas.h:388
auto hover_mouse_pos() const
Definition canvas.h:462
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1584
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:944
ImVector< ImVec2 > * mutable_points()
Definition canvas.h:347
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
Definition canvas.cc:605
void DrawContextMenu()
Definition canvas.cc:703
auto push_back(ImVec2 pos)
Definition canvas.h:348
void EnsurePerformanceIntegration()
Definition canvas.cc:108
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:538
int GetTileIdFromMousePos()
Definition canvas.h:319
auto drawn_tile_position() const
Definition canvas.h:358
const CanvasSelection & GetSelection() const
Definition canvas.h:232
bool DrawTilemapPainter(gfx::Tilemap &tilemap, int current_tile)
Definition canvas.cc:996
bool DrawSolidTilePainter(const ImVec4 &color, int size)
Definition canvas.cc:1034
bool enable_context_menu_
Definition canvas.h:560
auto draw_list() const
Definition canvas.h:349
CanvasMenuDefinition editor_menu_
Definition canvas.h:513
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:920
auto width() const
Definition canvas.h:402
void DrawLayeredElements()
Definition canvas.cc:1542
float GetCanvasHeight() const
Definition canvas.h:392
const CanvasConfig & GetConfig() const
Definition canvas.h:230
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:406
bool enable_custom_labels_
Definition canvas.h:559
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:218
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
Definition canvas.cc:1955
void ShowUsageReport()
Definition canvas.cc:330
bool IsSelectRectActive() const
Definition canvas.h:365
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:259
auto mutable_selected_points()
Definition canvas.h:459
void SetRenderer(gfx::IRenderer *renderer)
Definition canvas.h:95
ImVec2 GetMinimumSize() const
Definition canvas.cc:396
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
Definition canvas.cc:1944
bool DrawTileSelector(int size, int size_y=0)
Definition canvas.cc:1109
void ClearSelection()
Definition canvas.cc:273
bool ConvertBitmapFormat(gfx::BppFormat target_format)
Definition canvas.cc:1886
void DrawGridLines(float grid_step)
Definition canvas.cc:1448
void SetCustomGridStep(float step)
Definition canvas.h:118
uint64_t edit_palette_sub_index_
Definition canvas.h:524
void ShowPerformanceUI()
Definition canvas.cc:323
zelda3::GameData * game_data() const
Definition canvas.h:467
bool custom_canvas_size_
Definition canvas.h:561
void ClearContextMenuItems()
Definition canvas.cc:874
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
Definition canvas.cc:1933
void SetGameData(zelda3::GameData *game_data)
Definition canvas.cc:358
void DrawRect(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1438
bool HasValidSelection() const
Definition canvas.cc:496
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
Definition canvas.cc:950
ImDrawList * draw_list_
Definition canvas.h:530
PopupRegistry & GetPopupRegistry()
Definition canvas.h:217
auto custom_labels_enabled()
Definition canvas.h:400
ImVector< ImVec2 > selected_points_
Definition canvas.h:552
ImVec2 GetCurrentSize() const
Definition canvas.h:276
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:374
void UpdateColorPainter(gfx::IRenderer *renderer, gfx::Bitmap &bitmap, const ImVec4 &color, const std::function< void()> &event, int tile_size, float scale=1.0f)
Definition canvas.cc:588
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
Definition canvas.cc:1088
void DrawCustomHighlight(float grid_step)
Definition canvas.cc:1490
bool select_rect_active_
Definition canvas.h:554
auto mutable_selected_tiles()
Definition canvas.h:458
auto mutable_labels(int i)
Definition canvas.h:443
Bitmap * bitmap_
Definition canvas.h:527
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:502
void SetCanvasGridSize(CanvasGridSize grid_size)
Definition canvas.h:124
CanvasGridSize grid_size() const
Definition canvas.h:126
void AddContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:851
uint16_t edit_palette_index_
Definition canvas.h:522
ImVec2 GetPreferredSize() const
Definition canvas.cc:401
float GetGridStep() const
Definition canvas.h:382
CanvasInteractionHandler interaction_handler_
Definition canvas.h:197
void InitializePaletteEditor(Rom *rom)
Definition canvas.cc:349
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
Definition canvas.cc:518
auto canvas_size() const
Definition canvas.h:359
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:398
void SetZoomToFit(const gfx::Bitmap &bitmap)
Definition canvas.cc:894
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:500
ImVector< ImVector< std::string > > labels_
Definition canvas.h:544
void set_draggable(bool draggable)
Definition canvas.h:362
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:205
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:1914
auto canvas_id() const
Definition canvas.h:406
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:884
void ShowBppFormatSelector()
Definition canvas.cc:1846
CanvasMenuDefinition & editor_menu()
Definition canvas.h:203
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
Definition canvas.cc:311
void RenderPersistentPopups()
Definition canvas.cc:889
void set_global_scale(float scale)
Definition canvas.cc:239
ImVec2 GetSelectedTilePos() const
Definition canvas.h:369
void SetGridSize(CanvasGridSize grid_size)
Definition canvas.h:99
bool IsAutoResize() const
Definition canvas.h:278
void SetShowBuiltinContextMenu(bool show)
Definition canvas.h:206
std::shared_ptr< CanvasUsageTracker > usage_tracker_
Definition canvas.h:195
void End()
End canvas rendering (ImGui-style)
Definition canvas.cc:524
float GetGlobalScale() const
Definition canvas.h:378
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:370
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
Definition canvas.cc:474
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
Definition canvas.cc:1139
auto zero_point() const
Definition canvas.h:350
CanvasConfig & GetConfig()
Definition canvas.h:229
bool IsMouseHovering() const
Definition canvas.h:340
const std::vector< ImVec2 > & GetSelectedTiles() const
Definition canvas.h:366
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:194
bool refresh_graphics_
Definition canvas.h:510
auto usage_mode() const
Definition canvas.h:252
ImVec2 GetLastClickPosition() const
Definition canvas.cc:509
CanvasSelection & GetSelection()
Definition canvas.h:231
zelda3::GameData * game_data_
Definition canvas.h:529
void ShowPaletteEditor()
Definition canvas.cc:365
float global_scale_
Definition canvas.h:556
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1237
float custom_step_
Definition canvas.h:555
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:385
bool context_menu_enabled_
Definition canvas.h:514
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
Definition canvas.cc:1453
CanvasSelection selection_
Definition canvas.h:497
CanvasRuntime BeginInTable(const std::string &label, const CanvasFrameOptions &options)
Begin canvas in table cell with frame options (modern API) Returns CanvasRuntime for stateless helper...
Definition canvas.cc:438
bool enable_hex_tile_labels_
Definition canvas.h:558
ImVec2 canvas_p0_
Definition canvas.h:535
auto scrolling() const
Definition canvas.h:352
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
Definition canvas.cc:878
void DrawBitmapTable(const BitmapTable &gfx_bin)
Definition canvas.cc:1220
std::string context_id_
Definition canvas.h:548
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
Definition canvas.cc:613
ImVec2 canvas_sz_
Definition canvas.h:534
void InitializeDefaults()
Definition canvas.cc:178
void EndTableCanvas()
Definition canvas.cc:434
const ImVector< ImVec2 > & points() const
Definition canvas.h:346
std::shared_ptr< CanvasPerformanceIntegration > performance_integration_
Definition canvas.h:196
void Init(const CanvasConfig &config)
Initialize canvas with configuration (post-construction) Preferred over constructor parameters for ne...
Definition canvas.cc:121
void SetAutoResize(bool auto_resize)
Definition canvas.h:277
void SetGlobalScale(float scale)
Definition canvas.h:380
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
Definition canvas.cc:1495
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:841
void DrawText(const std::string &text, int x, int y)
Definition canvas.cc:1443
ImVec2 drawn_tile_pos_
Definition canvas.h:537
void SyncLegacyGeometryFromState()
Definition canvas.cc:101
bool * GetCustomLabelsEnabled()
Definition canvas.h:381
auto selected_points() const
Definition canvas.h:460
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:146
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:551
bool ApplyROMPalette(int group_index, int palette_index)
Definition canvas.cc:387
void ShowColorAnalysis()
Definition canvas.cc:377
auto set_highlight_tile_id(int i)
Definition canvas.h:456
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:618
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:624
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:653
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:666
const Canvas * get() const
Definition canvas.h:688
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:681
ScopedCanvas(gfx::IRenderer *renderer, const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (with optional renderer)
Definition canvas.h:634
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:675
const Canvas * operator->() const
Definition canvas.h:676
Canvas * get()
Get underlying canvas.
Definition canvas.h:687
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:645
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:682
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
Definition bitmap.h:518
BppFormat
BPP format enumeration for SNES graphics.
CanvasUsage
Canvas usage patterns and tracking.
void RenderContextMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
void RegisterDefaultCanvasMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118
Unified configuration for canvas display and interaction.
Optional extension modules for Canvas.
std::function< void()> on_click
Definition canvas.h:570
std::function< bool()> enabled
Definition canvas.h:569
Complete menu definition.
Declarative menu item definition.
Definition canvas_menu.h:64
Selection state for canvas interactions.
Complete canvas state snapshot.
CanvasGeometry geometry