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 std::optional<ImVec2> context_menu_open_screen_position() const {
202 return context_menu_ ? context_menu_->context_open_screen_position()
203 : std::nullopt;
204 }
205
206 // Phase 4: Access to editor-provided menu definition
209 void SetContextMenuEnabled(bool enabled) { context_menu_enabled_ = enabled; }
213
214 // Persistent popup management for context menu actions
215 void OpenPersistentPopup(const std::string& popup_id,
216 std::function<void()> render_callback);
217 void ClosePersistentPopup(const std::string& popup_id);
219
220 // Popup registry access (Phase 3: for advanced users and testing)
223
224 // Enhanced view and edit operations
226 void ShowScalingControls();
227 void SetZoomToFit(const gfx::Bitmap& bitmap);
228 void ResetView();
229 void ApplyConfigSnapshot(const CanvasConfig& snapshot);
230 void ApplyScaleSnapshot(const CanvasConfig& snapshot);
231
232 // Modular component access
234 const CanvasConfig& GetConfig() const { return config_; }
236 const CanvasSelection& GetSelection() const { return selection_; }
237 // Clear modern, interaction-handler, and legacy selection state together.
238 void ClearSelection();
239
240 // Enhanced palette management
242 void ShowPaletteEditor();
243 void ShowColorAnalysis();
244 bool ApplyROMPalette(int group_index, int palette_index);
245
246 // BPP format management
248 void ShowBppAnalysis();
250 bool ConvertBitmapFormat(gfx::BppFormat target_format);
252
253 // Enhanced canvas management
255 void SetUsageMode(CanvasUsage usage);
256 auto usage_mode() const { return config_.usage_mode; }
257
258 void RecordCanvasOperation(const std::string& operation_name, double time_ms);
259 void ShowPerformanceUI();
260 void ShowUsageReport();
261
262 // Interaction handler access
269
270 // Automation API access (Phase 4A)
272
273 // Initialization and cleanup
274 void InitializeDefaults();
275 void Cleanup();
276
277 // Size reporting for ImGui table integration
278 ImVec2 GetMinimumSize() const;
279 ImVec2 GetPreferredSize() const;
280 ImVec2 GetCurrentSize() const { return config_.canvas_size; }
281 void SetAutoResize(bool auto_resize) { config_.auto_resize = auto_resize; }
282 bool IsAutoResize() const { return config_.auto_resize; }
283
284 // Table integration helpers
285 void ReserveTableSpace(const std::string& label = "");
286 bool BeginTableCanvas(const std::string& label = "");
287 void EndTableCanvas();
288
294 CanvasRuntime BeginInTable(const std::string& label,
295 const CanvasFrameOptions& options);
296 void EndInTable(CanvasRuntime& runtime, const CanvasFrameOptions& options);
297
298 // Improved interaction detection
299 bool HasValidSelection() const;
300 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
301 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
302 ImVec2 GetLastClickPosition() const;
303
304 // Tile painter methods
305 bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
306 bool DrawSolidTilePainter(const ImVec4& color, int size);
307 void DrawTileOnBitmap(int tile_size, gfx::Bitmap* bitmap, ImVec4 color);
308
309 void DrawOutline(int x, int y, int w, int h);
310 void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color);
311 void DrawOutlineWithColor(int x, int y, int w, int h, uint32_t color);
312
313 void DrawRect(int x, int y, int w, int h, ImVec4 color);
314
315 void DrawText(const std::string& text, int x, int y);
316 void DrawGridLines(float grid_step);
317
318 void DrawInfoGrid(float grid_step = 64.0f, int tile_id_offset = 8,
319 int label_id = 0);
320
321 void DrawLayeredElements();
322
324 float x = mouse_pos_in_canvas_.x;
325 float y = mouse_pos_in_canvas_.y;
326 float step = custom_step_ != 0.0f ? custom_step_ : config_.grid_step;
327 float scale = config_.global_scale != 0.0f ? config_.global_scale : 1.0f;
328 if (step <= 0.0f) {
329 return -1;
330 }
331 int num_columns = (canvas_sz_.x / scale) / step;
332 int num_rows = (canvas_sz_.y / scale) / step;
333 if (num_columns <= 0 || num_rows <= 0) {
334 return -1;
335 }
336 int tile_id = static_cast<int>(
337 (x / step) + (y / step) * static_cast<float>(num_columns));
338 if (tile_id >= num_columns * num_rows) {
339 tile_id = -1; // Invalid tile ID
340 }
341 return tile_id;
342 }
343 void DrawCustomHighlight(float grid_step);
344 bool IsMouseHovering() const { return is_hovered_; }
345 void ZoomIn();
346 void ZoomOut();
347
348 // Points accessors - points_ is maintained separately for custom overlay
349 // drawing
350 const ImVector<ImVec2>& points() const { return points_; }
351 ImVector<ImVec2>* mutable_points() { return &points_; }
352 auto push_back(ImVec2 pos) { points_.push_back(pos); }
353 auto draw_list() const { return draw_list_; }
354 auto zero_point() const { return canvas_p0_; }
355 ImVec2 ToCanvasPos(ImVec2 local) const;
356 auto scrolling() const { return scrolling_; }
357 void set_scrolling(ImVec2 scroll) {
358 state_.geometry.scrolling = scroll;
359 scrolling_ = scroll;
360 config_.scrolling = scroll; // Sync to config for persistence
361 }
362 auto drawn_tile_position() const { return drawn_tile_pos_; }
363 auto canvas_size() const { return canvas_sz_; }
364 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
365 void set_global_scale(float scale);
366 void set_draggable(bool draggable) { draggable_ = draggable; }
367
368 // Modern accessors using modular structure
370 const std::vector<ImVec2>& GetSelectedTiles() const {
371 return selected_tiles_;
372 }
373 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
374 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
375
376 // Configuration accessors
377 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
382 float GetGlobalScale() const { return config_.global_scale; }
383 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
384 void SetGlobalScale(float scale) { config_.global_scale = scale; }
386 float GetGridStep() const { return config_.grid_step; }
387
388 // Rectangle selection boundary control (prevents wrapping in large maps)
389 void SetClampRectToLocalMaps(bool clamp) {
391 }
395 float GetCanvasWidth() const { return config_.canvas_size.x; }
396 float GetCanvasHeight() const { return config_.canvas_size.y; }
397
398 // Legacy compatibility accessors
400 auto selected_tiles() const { return selected_tiles_; }
401 auto selected_tile_pos() const { return selected_tile_pos_; }
402 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
403 auto global_scale() const { return config_.global_scale; }
405 auto custom_step() const { return config_.grid_step; }
406 auto width() const { return config_.canvas_size.x; }
407 auto height() const { return config_.canvas_size.y; }
408
409 // Public accessors for methods that need to be accessed externally
410 auto canvas_id() const { return canvas_id_; }
411
412 // Public methods for drawing operations
413 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
414 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
415 float scale = 1.0f, int alpha = 255);
416 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
417 ImVec2 src_pos, ImVec2 src_size);
418 void DrawBitmapTable(const BitmapTable& gfx_bin);
430 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
431 int tile_size, float scale = 1.0f,
432 int local_map_size = 0x200,
433 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
434 void DrawBitmapPreview(Bitmap& bitmap, const BitmapPreviewOptions& options);
435 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
436 void DrawSelectRect(int current_map, int tile_size = 0x10,
437 float scale = 1.0f);
438 bool DrawTileSelector(int size, int size_y = 0);
439 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
440 void DrawOverlay();
441 auto labels(int i) {
442 if (i >= labels_.size()) {
443 labels_.push_back(ImVector<std::string>());
444 }
445 return labels_[i];
446 }
447 auto mutable_labels(int i) {
448 if (i >= labels_.size()) {
449 int x = i;
450 while (x >= labels_.size()) {
451 labels_.push_back(ImVector<std::string>());
452 x--;
453 }
454 labels_.push_back(ImVector<std::string>());
455 }
456 return &labels_[i];
457 }
458
461
464 auto selected_points() const { return selected_points_; }
465
466 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
467
468 void set_rom(Rom* rom) { rom_ = rom; }
469 Rom* rom() const { return rom_; }
472
473 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
474 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
475 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
476
477 private:
481
482 // Helper to build CanvasRuntime from current state (for delegation to
483 // stateless helpers)
497
498 // Modular configuration and state
502
503 // Phase 4: Optional extensions (lazy-initialized on first use)
504 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
505 // modals, palette_editor, automation_api
506 std::unique_ptr<CanvasExtensions> extensions_;
508
509 // Phase 1: Consolidated state (gradually replacing scattered members)
511
512 // Core canvas state
513 bool is_hovered_ = false;
514 bool refresh_graphics_ = false;
515
516 // Phase 4: Context menu system (declarative menu definition)
519
520 // Phase 4: Persistent popup state for context menu actions (unified registry)
522
523 // Legacy members (to be gradually replaced)
529
530 // Core canvas state
531 Bitmap* bitmap_ = nullptr;
532 Rom* rom_ = nullptr;
534 ImDrawList* draw_list_ = nullptr;
535
536 // Canvas geometry and interaction state
543
544 // Drawing and labeling
545 // NOTE: points_ synchronized from interaction_handler_ for backward
546 // compatibility
547 ImVector<ImVec2> points_;
548 ImVector<ImVector<std::string>> labels_;
549
550 // Identification
551 std::string canvas_id_ = "Canvas";
552 std::string context_id_ = "CanvasContext";
553
554 // Legacy compatibility (gradually being replaced by selection_)
555 std::vector<ImVec2> selected_tiles_;
556 ImVector<ImVec2> selected_points_;
557 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
559 float custom_step_ = 32.0f;
560 float global_scale_ = 1.0f;
561 bool enable_grid_ = true;
566 bool draggable_ = false;
567};
568
570 std::string id;
571 std::string label;
572 std::string shortcut;
573 std::function<bool()> enabled;
574 std::function<void()> on_click;
575};
576
578 public:
579 void Clear() { items_.clear(); }
580 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
581 absl::Span<const CanvasMenuAction> items() const { return items_; }
582 const std::string& popup_id() const { return popup_id_; }
583 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
584
585 private:
586 std::vector<CanvasMenuAction> items_;
587 std::string popup_id_ = "CanvasMenuHost";
588};
589
591 const CanvasRuntime& rt, CanvasConfig& cfg);
593 CanvasConfig& cfg);
594
623 public:
628 explicit ScopedCanvas(const std::string& id,
629 ImVec2 canvas_size = ImVec2(0, 0))
630 : canvas_(new Canvas()), owned_(true), active_(true) {
631 canvas_->Init(id, canvas_size);
632 canvas_->Begin();
633 }
634
638 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
639 ImVec2 canvas_size = ImVec2(0, 0))
640 : canvas_(new Canvas()), owned_(true), active_(true) {
641 canvas_->SetRenderer(renderer);
642 canvas_->Init(id, canvas_size);
643 canvas_->Begin();
644 }
645
649 explicit ScopedCanvas(Canvas& canvas)
650 : canvas_(&canvas), owned_(false), active_(true) {
651 canvas_->Begin();
652 }
653
658 if (active_ && canvas_) {
659 canvas_->End();
660 }
661 if (owned_) {
662 delete canvas_;
663 }
664 }
665
666 // No copy, move only
667 ScopedCanvas(const ScopedCanvas&) = delete;
669
670 ScopedCanvas(ScopedCanvas&& other) noexcept
671 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
672 other.active_ = false;
673 other.canvas_ = nullptr;
674 }
675
679 Canvas* operator->() { return canvas_; }
680 const Canvas* operator->() const { return canvas_; }
681
685 Canvas& operator*() { return *canvas_; }
686 const Canvas& operator*() const { return *canvas_; }
687
691 Canvas* get() { return canvas_; }
692 const Canvas* get() const { return canvas_; }
693
694 private:
696 bool owned_;
698};
699
714 public:
715 CanvasFrame(Canvas& canvas,
717 ~CanvasFrame();
718
719 CanvasFrame(const CanvasFrame&) = delete;
721
722 CanvasFrame(CanvasFrame&& other) noexcept;
723 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
724
725 Canvas* operator->() { return canvas_; }
726 const Canvas* operator->() const { return canvas_; }
727
728 private:
732};
733
734} // namespace gui
735} // namespace yaze
736
737#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:69
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:713
const Canvas * operator->() const
Definition canvas.h:726
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:725
CanvasFrameOptions options_
Definition canvas.h:730
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:581
void set_popup_id(std::string id)
Definition canvas.h:583
void AddItem(CanvasMenuAction item)
Definition canvas.h:580
const std::string & popup_id() const
Definition canvas.h:582
std::vector< CanvasMenuAction > items_
Definition canvas.h:586
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
ImVec2 scrolling_
Definition canvas.h:537
void set_scrolling(ImVec2 scroll)
Definition canvas.h:357
CanvasState state_
Definition canvas.h:510
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:266
auto selected_tile_pos() const
Definition canvas.h:401
ImVector< ImVec2 > points_
Definition canvas.h:547
int highlight_tile_id
Definition canvas.h:525
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1173
PopupRegistry popup_registry_
Definition canvas.h:521
Rom * rom() const
Definition canvas.h:469
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:208
std::string canvas_id_
Definition canvas.h:551
auto labels(int i)
Definition canvas.h:441
float GetCanvasWidth() const
Definition canvas.h:395
auto height() const
Definition canvas.h:407
auto custom_step() const
Definition canvas.h:405
void set_rom(Rom *rom)
Definition canvas.h:468
void ShowScalingControls()
Definition canvas.cc:1709
auto set_current_labels(int i)
Definition canvas.h:459
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:504
CanvasConfig config_
Definition canvas.h:500
ImVec2 selected_tile_pos_
Definition canvas.h:557
auto global_scale() const
Definition canvas.h:403
gfx::IRenderer * renderer_
Definition canvas.h:499
ImVec2 canvas_p1_
Definition canvas.h:540
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:399
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:301
uint64_t edit_palette_group_name_index_
Definition canvas.h:527
auto selected_tiles() const
Definition canvas.h:400
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:484
void ShowBppConversionDialog()
Definition canvas.cc:1866
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:1923
bool GetClampRectToLocalMaps() const
Definition canvas.h:392
auto hover_mouse_pos() const
Definition canvas.h:466
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1584
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:944
ImVector< ImVec2 > * mutable_points()
Definition canvas.h:351
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:352
void EnsurePerformanceIntegration()
Definition canvas.cc:108
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:542
int GetTileIdFromMousePos()
Definition canvas.h:323
auto drawn_tile_position() const
Definition canvas.h:362
const CanvasSelection & GetSelection() const
Definition canvas.h:236
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:564
auto draw_list() const
Definition canvas.h:353
CanvasMenuDefinition editor_menu_
Definition canvas.h:517
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:920
auto width() const
Definition canvas.h:406
void DrawLayeredElements()
Definition canvas.cc:1542
float GetCanvasHeight() const
Definition canvas.h:396
const CanvasConfig & GetConfig() const
Definition canvas.h:234
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:406
bool enable_custom_labels_
Definition canvas.h:563
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:222
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:369
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:263
auto mutable_selected_points()
Definition canvas.h:463
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:528
void ShowPerformanceUI()
Definition canvas.cc:323
zelda3::GameData * game_data() const
Definition canvas.h:471
bool custom_canvas_size_
Definition canvas.h:565
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:534
PopupRegistry & GetPopupRegistry()
Definition canvas.h:221
auto custom_labels_enabled()
Definition canvas.h:404
ImVector< ImVec2 > selected_points_
Definition canvas.h:556
ImVec2 GetCurrentSize() const
Definition canvas.h:280
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:378
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:558
auto mutable_selected_tiles()
Definition canvas.h:462
auto mutable_labels(int i)
Definition canvas.h:447
Bitmap * bitmap_
Definition canvas.h:531
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:506
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:526
ImVec2 GetPreferredSize() const
Definition canvas.cc:401
float GetGridStep() const
Definition canvas.h:386
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:363
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:402
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:548
void set_draggable(bool draggable)
Definition canvas.h:366
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:209
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:1914
auto canvas_id() const
Definition canvas.h:410
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:884
void ShowBppFormatSelector()
Definition canvas.cc:1846
CanvasMenuDefinition & editor_menu()
Definition canvas.h:207
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:373
void SetGridSize(CanvasGridSize grid_size)
Definition canvas.h:99
bool IsAutoResize() const
Definition canvas.h:282
void SetShowBuiltinContextMenu(bool show)
Definition canvas.h:210
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:382
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:374
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:354
CanvasConfig & GetConfig()
Definition canvas.h:233
bool IsMouseHovering() const
Definition canvas.h:344
const std::vector< ImVec2 > & GetSelectedTiles() const
Definition canvas.h:370
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:194
bool refresh_graphics_
Definition canvas.h:514
auto usage_mode() const
Definition canvas.h:256
ImVec2 GetLastClickPosition() const
Definition canvas.cc:509
CanvasSelection & GetSelection()
Definition canvas.h:235
zelda3::GameData * game_data_
Definition canvas.h:533
void ShowPaletteEditor()
Definition canvas.cc:365
float global_scale_
Definition canvas.h:560
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1237
float custom_step_
Definition canvas.h:559
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:389
bool context_menu_enabled_
Definition canvas.h:518
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:501
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:562
ImVec2 canvas_p0_
Definition canvas.h:539
auto scrolling() const
Definition canvas.h:356
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:552
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
Definition canvas.cc:613
ImVec2 canvas_sz_
Definition canvas.h:538
void InitializeDefaults()
Definition canvas.cc:178
void EndTableCanvas()
Definition canvas.cc:434
const ImVector< ImVec2 > & points() const
Definition canvas.h:350
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:281
std::optional< ImVec2 > context_menu_open_screen_position() const
Definition canvas.h:201
void SetGlobalScale(float scale)
Definition canvas.h:384
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:541
void SyncLegacyGeometryFromState()
Definition canvas.cc:101
bool * GetCustomLabelsEnabled()
Definition canvas.h:385
auto selected_points() const
Definition canvas.h:464
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:146
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:555
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:460
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:622
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:628
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:657
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:670
const Canvas * get() const
Definition canvas.h:692
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:685
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:638
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:679
const Canvas * operator->() const
Definition canvas.h:680
Canvas * get()
Get underlying canvas.
Definition canvas.h:691
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:649
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:686
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
Definition bitmap.h:541
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:574
std::function< bool()> enabled
Definition canvas.h:573
Complete menu definition.
Declarative menu item definition.
Definition canvas_menu.h:64
Selection state for canvas interactions.
Complete canvas state snapshot.
CanvasGeometry geometry