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 std::optional<ImVec2> viewport_size = std::nullopt);
186
187 // Context Menu refers to what happens when the right mouse button is pressed
188 // This routine also handles the scrolling for the canvas.
189 void DrawContextMenu();
190
191 // Phase 4: Use unified menu item definition from canvas_menu.h
193
194 // Enhanced canvas components (non-optional, used every frame)
195 std::unique_ptr<CanvasContextMenu> context_menu_;
196 std::shared_ptr<CanvasUsageTracker> usage_tracker_;
197 std::shared_ptr<CanvasPerformanceIntegration> performance_integration_;
199
200 void AddContextMenuItem(const gui::CanvasMenuItem& item);
202 // Called once before opening/rendering a new context menu. Editors can build
203 // actions from the click location; false rejects an invalid target.
204 void SetContextMenuOpenCallback(std::function<bool(const ImVec2&)> callback) {
205 context_menu_open_callback_ = std::move(callback);
206 }
207 bool PrepareContextMenu(const ImVec2& screen_position) {
209 context_menu_open_callback_(screen_position);
210 }
211 std::optional<ImVec2> context_menu_open_screen_position() const {
212 return context_menu_ ? context_menu_->context_open_screen_position()
213 : std::nullopt;
214 }
215
216 // Phase 4: Access to editor-provided menu definition
219 void SetContextMenuEnabled(bool enabled) { context_menu_enabled_ = enabled; }
223
224 // Persistent popup management for context menu actions
225 void OpenPersistentPopup(const std::string& popup_id,
226 std::function<void()> render_callback);
227 void ClosePersistentPopup(const std::string& popup_id);
229
230 // Popup registry access (Phase 3: for advanced users and testing)
233
234 // Enhanced view and edit operations
236 void ShowScalingControls();
237 void SetZoomToFit(const gfx::Bitmap& bitmap);
238 void ResetView();
239 void ApplyConfigSnapshot(const CanvasConfig& snapshot);
240 void ApplyScaleSnapshot(const CanvasConfig& snapshot);
241
242 // Modular component access
244 const CanvasConfig& GetConfig() const { return config_; }
246 const CanvasSelection& GetSelection() const { return selection_; }
247 // Clear modern, interaction-handler, and legacy selection state together.
248 void ClearSelection();
249
250 // Enhanced palette management
252 void ShowPaletteEditor();
253 void ShowColorAnalysis();
254 bool ApplyROMPalette(int group_index, int palette_index);
255
256 // BPP format management
258 void ShowBppAnalysis();
260 bool ConvertBitmapFormat(gfx::BppFormat target_format);
262
263 // Enhanced canvas management
265 void SetUsageMode(CanvasUsage usage);
266 auto usage_mode() const { return config_.usage_mode; }
267
268 void RecordCanvasOperation(const std::string& operation_name, double time_ms);
269 void ShowPerformanceUI();
270 void ShowUsageReport();
271
272 // Interaction handler access
279
280 // Automation API access (Phase 4A)
282
283 // Initialization and cleanup
284 void InitializeDefaults();
285 void Cleanup();
286
287 // Size reporting for ImGui table integration
288 ImVec2 GetMinimumSize() const;
289 ImVec2 GetPreferredSize() const;
290 ImVec2 GetCurrentSize() const { return config_.canvas_size; }
291 void SetAutoResize(bool auto_resize) { config_.auto_resize = auto_resize; }
292 bool IsAutoResize() const { return config_.auto_resize; }
293
294 // Table integration helpers
295 void ReserveTableSpace(const std::string& label = "");
296 bool BeginTableCanvas(const std::string& label = "");
297 void EndTableCanvas();
298
304 CanvasRuntime BeginInTable(const std::string& label,
305 const CanvasFrameOptions& options);
306 void EndInTable(CanvasRuntime& runtime, const CanvasFrameOptions& options);
307
308 // Improved interaction detection
309 bool HasValidSelection() const;
310 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
311 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
312 ImVec2 GetLastClickPosition() const;
313
314 // Tile painter methods
315 bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
316 bool DrawSolidTilePainter(const ImVec4& color, int size);
317 void DrawTileOnBitmap(int tile_size, gfx::Bitmap* bitmap, ImVec4 color);
318
319 void DrawOutline(int x, int y, int w, int h);
320 void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color);
321 void DrawOutlineWithColor(int x, int y, int w, int h, uint32_t color);
322
323 void DrawRect(int x, int y, int w, int h, ImVec4 color);
324
325 void DrawText(const std::string& text, int x, int y);
326 void DrawGridLines(float grid_step);
327
328 void DrawInfoGrid(float grid_step = 64.0f, int tile_id_offset = 8,
329 int label_id = 0);
330
331 void DrawLayeredElements();
332
334 float x = mouse_pos_in_canvas_.x;
335 float y = mouse_pos_in_canvas_.y;
336 float step = custom_step_ != 0.0f ? custom_step_ : config_.grid_step;
337 float scale = config_.global_scale != 0.0f ? config_.global_scale : 1.0f;
338 if (step <= 0.0f) {
339 return -1;
340 }
341 int num_columns = (canvas_sz_.x / scale) / step;
342 int num_rows = (canvas_sz_.y / scale) / step;
343 if (num_columns <= 0 || num_rows <= 0) {
344 return -1;
345 }
346 int tile_id = static_cast<int>(
347 (x / step) + (y / step) * static_cast<float>(num_columns));
348 if (tile_id >= num_columns * num_rows) {
349 tile_id = -1; // Invalid tile ID
350 }
351 return tile_id;
352 }
353 void DrawCustomHighlight(float grid_step);
354 bool IsMouseHovering() const { return is_hovered_; }
355 void ZoomIn();
356 void ZoomOut();
357
358 // Points accessors - points_ is maintained separately for custom overlay
359 // drawing
360 const ImVector<ImVec2>& points() const { return points_; }
361 ImVector<ImVec2>* mutable_points() { return &points_; }
362 auto push_back(ImVec2 pos) { points_.push_back(pos); }
363 auto draw_list() const { return draw_list_; }
364 auto zero_point() const { return canvas_p0_; }
365 ImVec2 ToCanvasPos(ImVec2 local) const;
366 auto scrolling() const { return scrolling_; }
367 void set_scrolling(ImVec2 scroll) {
368 state_.geometry.scrolling = scroll;
369 scrolling_ = scroll;
370 config_.scrolling = scroll; // Sync to config for persistence
371 }
372 auto drawn_tile_position() const { return drawn_tile_pos_; }
373 auto canvas_size() const { return canvas_sz_; }
374 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
375 void set_global_scale(float scale);
376 void set_draggable(bool draggable) { draggable_ = draggable; }
377
378 // Modern accessors using modular structure
380 const std::vector<ImVec2>& GetSelectedTiles() const {
381 return selected_tiles_;
382 }
383 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
384 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
385
386 // Configuration accessors
387 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
392 float GetGlobalScale() const { return config_.global_scale; }
393 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
394 void SetGlobalScale(float scale) { config_.global_scale = scale; }
396 float GetGridStep() const { return config_.grid_step; }
397
398 // Rectangle selection boundary control (prevents wrapping in large maps)
399 void SetClampRectToLocalMaps(bool clamp) {
401 }
405 float GetCanvasWidth() const { return config_.canvas_size.x; }
406 float GetCanvasHeight() const { return config_.canvas_size.y; }
407
408 // Legacy compatibility accessors
410 auto selected_tiles() const { return selected_tiles_; }
411 auto selected_tile_pos() const { return selected_tile_pos_; }
412 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
413 auto global_scale() const { return config_.global_scale; }
415 auto custom_step() const { return config_.grid_step; }
416 auto width() const { return config_.canvas_size.x; }
417 auto height() const { return config_.canvas_size.y; }
418
419 // Public accessors for methods that need to be accessed externally
420 auto canvas_id() const { return canvas_id_; }
421
422 // Public methods for drawing operations
423 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
424 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
425 float scale = 1.0f, int alpha = 255);
426 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
427 ImVec2 src_pos, ImVec2 src_size);
428 void DrawBitmapTable(const BitmapTable& gfx_bin);
440 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
441 int tile_size, float scale = 1.0f,
442 int local_map_size = 0x200,
443 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
444 void DrawBitmapPreview(Bitmap& bitmap, const BitmapPreviewOptions& options);
445 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
446 void DrawSelectRect(int current_map, int tile_size = 0x10,
447 float scale = 1.0f);
448 bool DrawTileSelector(int size, int size_y = 0);
449 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
450 void DrawOverlay();
451 auto labels(int i) {
452 if (i >= labels_.size()) {
453 labels_.push_back(ImVector<std::string>());
454 }
455 return labels_[i];
456 }
457 auto mutable_labels(int i) {
458 if (i >= labels_.size()) {
459 int x = i;
460 while (x >= labels_.size()) {
461 labels_.push_back(ImVector<std::string>());
462 x--;
463 }
464 labels_.push_back(ImVector<std::string>());
465 }
466 return &labels_[i];
467 }
468
471
474 auto selected_points() const { return selected_points_; }
475
476 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
477
478 void set_rom(Rom* rom) { rom_ = rom; }
479 Rom* rom() const { return rom_; }
482
483 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
484 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
485 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
486
487 private:
491
492 // Helper to build CanvasRuntime from current state (for delegation to
493 // stateless helpers)
507
508 // Modular configuration and state
512
513 // Phase 4: Optional extensions (lazy-initialized on first use)
514 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
515 // modals, palette_editor, automation_api
516 std::unique_ptr<CanvasExtensions> extensions_;
518
519 // Phase 1: Consolidated state (gradually replacing scattered members)
521
522 // Core canvas state
523 bool is_hovered_ = false;
524 bool refresh_graphics_ = false;
525
526 // Phase 4: Context menu system (declarative menu definition)
529 std::function<bool(const ImVec2&)> context_menu_open_callback_;
530
531 // Phase 4: Persistent popup state for context menu actions (unified registry)
533
534 // Legacy members (to be gradually replaced)
540
541 // Core canvas state
542 Bitmap* bitmap_ = nullptr;
543 Rom* rom_ = nullptr;
545 ImDrawList* draw_list_ = nullptr;
546
547 // Canvas geometry and interaction state
554
555 // Drawing and labeling
556 // NOTE: points_ synchronized from interaction_handler_ for backward
557 // compatibility
558 ImVector<ImVec2> points_;
559 ImVector<ImVector<std::string>> labels_;
560
561 // Identification
562 std::string canvas_id_ = "Canvas";
563 std::string context_id_ = "CanvasContext";
564
565 // Legacy compatibility (gradually being replaced by selection_)
566 std::vector<ImVec2> selected_tiles_;
567 ImVector<ImVec2> selected_points_;
568 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
570 float custom_step_ = 32.0f;
571 float global_scale_ = 1.0f;
572 bool enable_grid_ = true;
577 bool draggable_ = false;
578};
579
581 std::string id;
582 std::string label;
583 std::string shortcut;
584 std::function<bool()> enabled;
585 std::function<void()> on_click;
586};
587
589 public:
590 void Clear() { items_.clear(); }
591 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
592 absl::Span<const CanvasMenuAction> items() const { return items_; }
593 const std::string& popup_id() const { return popup_id_; }
594 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
595
596 private:
597 std::vector<CanvasMenuAction> items_;
598 std::string popup_id_ = "CanvasMenuHost";
599};
600
602 const CanvasRuntime& rt, CanvasConfig& cfg);
604 CanvasConfig& cfg);
605
634 public:
639 explicit ScopedCanvas(const std::string& id,
640 ImVec2 canvas_size = ImVec2(0, 0))
641 : canvas_(new Canvas()), owned_(true), active_(true) {
642 canvas_->Init(id, canvas_size);
643 canvas_->Begin();
644 }
645
649 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
650 ImVec2 canvas_size = ImVec2(0, 0))
651 : canvas_(new Canvas()), owned_(true), active_(true) {
652 canvas_->SetRenderer(renderer);
653 canvas_->Init(id, canvas_size);
654 canvas_->Begin();
655 }
656
660 explicit ScopedCanvas(Canvas& canvas)
661 : canvas_(&canvas), owned_(false), active_(true) {
662 canvas_->Begin();
663 }
664
669 if (active_ && canvas_) {
670 canvas_->End();
671 }
672 if (owned_) {
673 delete canvas_;
674 }
675 }
676
677 // No copy, move only
678 ScopedCanvas(const ScopedCanvas&) = delete;
680
681 ScopedCanvas(ScopedCanvas&& other) noexcept
682 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
683 other.active_ = false;
684 other.canvas_ = nullptr;
685 }
686
690 Canvas* operator->() { return canvas_; }
691 const Canvas* operator->() const { return canvas_; }
692
696 Canvas& operator*() { return *canvas_; }
697 const Canvas& operator*() const { return *canvas_; }
698
702 Canvas* get() { return canvas_; }
703 const Canvas* get() const { return canvas_; }
704
705 private:
707 bool owned_;
709};
710
725 public:
726 CanvasFrame(Canvas& canvas,
728 ~CanvasFrame();
729
730 CanvasFrame(const CanvasFrame&) = delete;
732
733 CanvasFrame(CanvasFrame&& other) noexcept;
734 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
735
736 Canvas* operator->() { return canvas_; }
737 const Canvas* operator->() const { return canvas_; }
738
739 private:
743};
744
745} // namespace gui
746} // namespace yaze
747
748#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:49
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:70
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:724
const Canvas * operator->() const
Definition canvas.h:737
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:736
CanvasFrameOptions options_
Definition canvas.h:741
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Definition canvas.cc:2100
Handles all tile-based interactions for Canvas.
absl::Span< const CanvasMenuAction > items() const
Definition canvas.h:592
void set_popup_id(std::string id)
Definition canvas.h:594
void AddItem(CanvasMenuAction item)
Definition canvas.h:591
const std::string & popup_id() const
Definition canvas.h:593
std::vector< CanvasMenuAction > items_
Definition canvas.h:597
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
ImVec2 scrolling_
Definition canvas.h:548
void set_scrolling(ImVec2 scroll)
Definition canvas.h:367
CanvasState state_
Definition canvas.h:520
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:276
auto selected_tile_pos() const
Definition canvas.h:411
ImVector< ImVec2 > points_
Definition canvas.h:558
int highlight_tile_id
Definition canvas.h:536
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1293
PopupRegistry popup_registry_
Definition canvas.h:532
Rom * rom() const
Definition canvas.h:479
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:218
std::string canvas_id_
Definition canvas.h:562
auto labels(int i)
Definition canvas.h:451
float GetCanvasWidth() const
Definition canvas.h:405
auto height() const
Definition canvas.h:417
auto custom_step() const
Definition canvas.h:415
void set_rom(Rom *rom)
Definition canvas.h:478
void ShowScalingControls()
Definition canvas.cc:1834
auto set_current_labels(int i)
Definition canvas.h:469
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:593
CanvasConfig config_
Definition canvas.h:510
ImVec2 selected_tile_pos_
Definition canvas.h:568
auto global_scale() const
Definition canvas.h:413
gfx::IRenderer * renderer_
Definition canvas.h:509
ImVec2 canvas_p1_
Definition canvas.h:551
void ShowBppAnalysis()
Definition canvas.cc:1984
gfx::IRenderer * renderer() const
Definition canvas.h:96
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1365
auto select_rect_active() const
Definition canvas.h:409
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:385
uint64_t edit_palette_group_name_index_
Definition canvas.h:538
auto selected_tiles() const
Definition canvas.h:410
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:1377
bool BeginTableCanvas(const std::string &label="")
Definition canvas.cc:500
void InitializeEnhancedComponents()
Definition canvas.cc:368
CanvasRuntime BuildCurrentRuntime() const
Definition canvas.h:494
void ShowBppConversionDialog()
Definition canvas.cc:1995
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:2054
bool GetClampRectToLocalMaps() const
Definition canvas.h:402
auto hover_mouse_pos() const
Definition canvas.h:476
void SetContextMenuOpenCallback(std::function< bool(const ImVec2 &)> callback)
Definition canvas.h:204
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1709
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:1062
ImVector< ImVec2 > * mutable_points()
Definition canvas.h:361
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
Definition canvas.cc:694
void DrawContextMenu()
Definition canvas.cc:823
auto push_back(ImVec2 pos)
Definition canvas.h:362
void EnsurePerformanceIntegration()
Definition canvas.cc:189
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:553
int GetTileIdFromMousePos()
Definition canvas.h:333
auto drawn_tile_position() const
Definition canvas.h:372
const CanvasSelection & GetSelection() const
Definition canvas.h:246
bool DrawTilemapPainter(gfx::Tilemap &tilemap, int current_tile)
Definition canvas.cc:1116
bool DrawSolidTilePainter(const ImVec4 &color, int size)
Definition canvas.cc:1154
bool enable_context_menu_
Definition canvas.h:575
auto draw_list() const
Definition canvas.h:363
CanvasMenuDefinition editor_menu_
Definition canvas.h:527
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:1038
auto width() const
Definition canvas.h:416
void DrawLayeredElements()
Definition canvas.cc:1667
float GetCanvasHeight() const
Definition canvas.h:406
const CanvasConfig & GetConfig() const
Definition canvas.h:244
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:495
bool enable_custom_labels_
Definition canvas.h:574
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:232
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
Definition canvas.cc:2087
void ShowUsageReport()
Definition canvas.cc:414
bool IsSelectRectActive() const
Definition canvas.h:379
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:273
auto mutable_selected_points()
Definition canvas.h:473
void SetRenderer(gfx::IRenderer *renderer)
Definition canvas.h:95
ImVec2 GetMinimumSize() const
Definition canvas.cc:485
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
Definition canvas.cc:2076
bool DrawTileSelector(int size, int size_y=0)
Definition canvas.cc:1229
void ClearSelection()
Definition canvas.cc:357
bool ConvertBitmapFormat(gfx::BppFormat target_format)
Definition canvas.cc:2017
void DrawGridLines(float grid_step)
Definition canvas.cc:1573
void SetCustomGridStep(float step)
Definition canvas.h:118
uint64_t edit_palette_sub_index_
Definition canvas.h:539
void ShowPerformanceUI()
Definition canvas.cc:407
zelda3::GameData * game_data() const
Definition canvas.h:481
bool custom_canvas_size_
Definition canvas.h:576
void ClearContextMenuItems()
Definition canvas.cc:994
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
Definition canvas.cc:2064
void SetGameData(zelda3::GameData *game_data)
Definition canvas.cc:442
void DrawRect(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1563
bool HasValidSelection() const
Definition canvas.cc:585
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
Definition canvas.cc:1068
ImDrawList * draw_list_
Definition canvas.h:545
PopupRegistry & GetPopupRegistry()
Definition canvas.h:231
auto custom_labels_enabled()
Definition canvas.h:414
ImVector< ImVec2 > selected_points_
Definition canvas.h:567
ImVec2 GetCurrentSize() const
Definition canvas.h:290
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:388
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:677
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
Definition canvas.cc:1208
void DrawCustomHighlight(float grid_step)
Definition canvas.cc:1615
bool select_rect_active_
Definition canvas.h:569
auto mutable_selected_tiles()
Definition canvas.h:472
auto mutable_labels(int i)
Definition canvas.h:457
Bitmap * bitmap_
Definition canvas.h:542
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:516
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:971
uint16_t edit_palette_index_
Definition canvas.h:537
ImVec2 GetPreferredSize() const
Definition canvas.cc:490
float GetGridStep() const
Definition canvas.h:396
CanvasInteractionHandler interaction_handler_
Definition canvas.h:198
void InitializePaletteEditor(Rom *rom)
Definition canvas.cc:433
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
Definition canvas.cc:607
std::function< bool(const ImVec2 &) context_menu_open_callback_)
Definition canvas.h:529
auto canvas_size() const
Definition canvas.h:373
bool PrepareContextMenu(const ImVec2 &screen_position)
Definition canvas.h:207
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:412
void SetZoomToFit(const gfx::Bitmap &bitmap)
Definition canvas.cc:1014
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:589
ImVector< ImVector< std::string > > labels_
Definition canvas.h:559
void set_draggable(bool draggable)
Definition canvas.h:376
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:219
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:2045
auto canvas_id() const
Definition canvas.h:420
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:1004
void ShowBppFormatSelector()
Definition canvas.cc:1971
CanvasMenuDefinition & editor_menu()
Definition canvas.h:217
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
Definition canvas.cc:395
void RenderPersistentPopups()
Definition canvas.cc:1009
void set_global_scale(float scale)
Definition canvas.cc:323
ImVec2 GetSelectedTilePos() const
Definition canvas.h:383
void SetGridSize(CanvasGridSize grid_size)
Definition canvas.h:99
bool IsAutoResize() const
Definition canvas.h:292
void SetShowBuiltinContextMenu(bool show)
Definition canvas.h:220
std::shared_ptr< CanvasUsageTracker > usage_tracker_
Definition canvas.h:196
void End()
End canvas rendering (ImGui-style)
Definition canvas.cc:613
float GetGlobalScale() const
Definition canvas.h:392
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:384
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
Definition canvas.cc:563
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
Definition canvas.cc:1259
auto zero_point() const
Definition canvas.h:364
CanvasConfig & GetConfig()
Definition canvas.h:243
bool IsMouseHovering() const
Definition canvas.h:354
const std::vector< ImVec2 > & GetSelectedTiles() const
Definition canvas.h:380
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:195
bool refresh_graphics_
Definition canvas.h:524
auto usage_mode() const
Definition canvas.h:266
ImVec2 GetLastClickPosition() const
Definition canvas.cc:598
CanvasSelection & GetSelection()
Definition canvas.h:245
zelda3::GameData * game_data_
Definition canvas.h:544
void ShowPaletteEditor()
Definition canvas.cc:449
float global_scale_
Definition canvas.h:571
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1359
float custom_step_
Definition canvas.h:570
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:399
bool context_menu_enabled_
Definition canvas.h:528
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0), std::optional< ImVec2 > viewport_size=std::nullopt)
Definition canvas.cc:702
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
Definition canvas.cc:1578
CanvasSelection selection_
Definition canvas.h:511
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:527
bool enable_hex_tile_labels_
Definition canvas.h:573
ImVec2 canvas_p0_
Definition canvas.h:550
auto scrolling() const
Definition canvas.h:366
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
Definition canvas.cc:998
void DrawBitmapTable(const BitmapTable &gfx_bin)
Definition canvas.cc:1340
std::string context_id_
Definition canvas.h:563
ImVec2 canvas_sz_
Definition canvas.h:549
void InitializeDefaults()
Definition canvas.cc:259
void EndTableCanvas()
Definition canvas.cc:523
const ImVector< ImVec2 > & points() const
Definition canvas.h:360
std::shared_ptr< CanvasPerformanceIntegration > performance_integration_
Definition canvas.h:197
void Init(const CanvasConfig &config)
Initialize canvas with configuration (post-construction) Preferred over constructor parameters for ne...
Definition canvas.cc:202
void SetAutoResize(bool auto_resize)
Definition canvas.h:291
std::optional< ImVec2 > context_menu_open_screen_position() const
Definition canvas.h:211
void SetGlobalScale(float scale)
Definition canvas.h:394
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
Definition canvas.cc:1620
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:961
void DrawText(const std::string &text, int x, int y)
Definition canvas.cc:1568
ImVec2 drawn_tile_pos_
Definition canvas.h:552
void SyncLegacyGeometryFromState()
Definition canvas.cc:182
bool * GetCustomLabelsEnabled()
Definition canvas.h:395
auto selected_points() const
Definition canvas.h:474
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:227
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:566
bool ApplyROMPalette(int group_index, int palette_index)
Definition canvas.cc:475
void ShowColorAnalysis()
Definition canvas.cc:463
auto set_highlight_tile_id(int i)
Definition canvas.h:470
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:633
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:639
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:668
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:681
const Canvas * get() const
Definition canvas.h:703
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:696
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:649
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:690
const Canvas * operator->() const
Definition canvas.h:691
Canvas * get()
Get underlying canvas.
Definition canvas.h:702
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:660
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:697
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
Definition bitmap.h:549
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:585
std::function< bool()> enabled
Definition canvas.h:584
Complete menu definition.
Declarative menu item definition.
Definition canvas_menu.h:64
Selection state for canvas interactions.
Complete canvas state snapshot.
CanvasGeometry geometry