1#ifndef YAZE_GUI_CANVAS_H
2#define YAZE_GUI_CANVAS_H
5#define IMGUI_DEFINE_MATH_OPERATORS
15#include "absl/types/span.h"
33#include "imgui/imgui.h"
44class CanvasAutomationAPI;
45struct CanvasExtensions;
164 [[deprecated(
"Use default ctor + Init(id, size) instead")]]
165 explicit Canvas(
const std::string&
id);
166 [[deprecated(
"Use default ctor + Init(id, size) instead")]]
168 [[deprecated(
"Use default ctor + Init(config) instead")]]
171 [[deprecated(
"Use default ctor + Init(config) instead")]]
176 [[deprecated(
"Use default ctor + SetRenderer() + Init() instead")]]
178 [[deprecated(
"Use default ctor + SetRenderer() + Init(id, size) instead")]]
180 [[deprecated(
"Use default ctor + SetRenderer() + Init(id, size) instead")]]
183 [[deprecated(
"Use default ctor + SetRenderer() + Init(config) instead")]]
186 [[deprecated(
"Use default ctor + SetRenderer() + Init(config) instead")]]
237 const std::function<
void()>& event,
int tile_size,
307 std::function<
void()> render_callback);
389 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left)
const;
390 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left)
const;
402 void DrawRect(
int x,
int y,
int w,
int h, ImVec4 color);
404 void DrawText(
const std::string& text,
int x,
int y);
407 void DrawInfoGrid(
float grid_step = 64.0f,
int tile_id_offset = 8,
420 int num_columns = (
canvas_sz_.x / scale) / step;
422 if (num_columns <= 0 || num_rows <= 0) {
426 static_cast<int>((x / step) + (y / step) *
static_cast<float>(num_columns));
427 if (tile_id >= num_columns * num_rows) {
506 float scale = 1.0f,
int alpha = 255);
508 ImVec2 src_pos, ImVec2 src_size);
522 int tile_size,
float scale = 1.0f,
523 int local_map_size = 0x200,
524 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
531 void DrawGrid(
float grid_step = 64.0f,
int tile_id_offset = 8);
535 labels_.push_back(ImVector<std::string>());
543 labels_.push_back(ImVector<std::string>());
546 labels_.push_back(ImVector<std::string>());
565 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
566 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
567 void AddTextAt(ImVec2 local_pos,
const std::string& text, uint32_t color);
663 int num_sheets_to_load,
int canvas_id,
664 bool is_loaded, BitmapTable& graphics_bin);
667 int height,
int tile_size,
bool is_loaded,
668 bool scrollbar,
int canvas_id);
672 const std::string& label =
"",
673 bool auto_resize =
true);
696 const ImVec2& canvas_px);
699 const ImVec2& tile_size_px, ImU32 color);
701 const ImVec2& tile_size_px, ImU32 color);
703 const char* text, ImU32 color);
710 ImU32 color = IM_COL32(255, 255, 255, 200));
717 int tile_size,
float scale, ImVec2 clamp_px);
727ImVec2
ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px);
741 absl::Span<const CanvasMenuAction>
items()
const {
return items_; }
789 ImVec2 canvas_size = ImVec2(0, 0))
798 ImVec2 canvas_size = ImVec2(0, 0))
831 other.active_ =
false;
832 other.canvas_ =
nullptr;
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Represents a bitmap image optimized for SNES ROM hacking.
Defines an abstract interface for all rendering operations.
Programmatic interface for controlling canvas operations.
Lightweight RAII guard for existing Canvas instances.
const Canvas * operator->() const
CanvasFrame(const CanvasFrame &)=delete
CanvasFrameOptions options_
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Handles all tile-based interactions for Canvas.
Modern, robust canvas for drawing and manipulating graphics.
void set_scrolling(ImVec2 scroll)
const CanvasInteractionHandler & GetInteractionHandler() const
auto selected_tile_pos() const
ImVector< ImVec2 > points_
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
PopupRegistry popup_registry_
const CanvasMenuDefinition & editor_menu() const
float GetCanvasWidth() const
void ShowScalingControls()
auto set_current_labels(int i)
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
ImVec2 selected_tile_pos_
auto global_scale() const
gfx::IRenderer * renderer_
gfx::IRenderer * renderer() const
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
auto select_rect_active() const
void SetUsageMode(CanvasUsage usage)
uint64_t edit_palette_group_name_index_
auto selected_tiles() const
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.
bool BeginTableCanvas(const std::string &label="")
void InitializeEnhancedComponents()
CanvasRuntime BuildCurrentRuntime() const
void ShowBppConversionDialog()
CanvasAutomationAPI * GetAutomationAPI()
bool GetClampRectToLocalMaps() const
auto hover_mouse_pos() const
void ShowAdvancedCanvasProperties()
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
ImVector< ImVec2 > * mutable_points()
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
auto push_back(ImVec2 pos)
ImVec2 mouse_pos_in_canvas_
int GetTileIdFromMousePos()
auto drawn_tile_position() const
const CanvasSelection & GetSelection() const
bool DrawTilemapPainter(gfx::Tilemap &tilemap, int current_tile)
bool DrawSolidTilePainter(const ImVec4 &color, int size)
bool enable_context_menu_
CanvasMenuDefinition editor_menu_
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
void DrawLayeredElements()
float GetCanvasHeight() const
const CanvasConfig & GetConfig() const
void ReserveTableSpace(const std::string &label="")
bool enable_custom_labels_
const PopupRegistry & GetPopupRegistry() const
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
bool IsSelectRectActive() const
CanvasInteractionHandler & GetInteractionHandler()
auto mutable_selected_points()
void SetRenderer(gfx::IRenderer *renderer)
ImVec2 GetMinimumSize() const
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
bool DrawTileSelector(int size, int size_y=0)
bool ConvertBitmapFormat(gfx::BppFormat target_format)
void DrawGridLines(float grid_step)
void SetCustomGridStep(float step)
uint64_t edit_palette_sub_index_
zelda3::GameData * game_data() const
void ClearContextMenuItems()
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
void SetGameData(zelda3::GameData *game_data)
void DrawRect(int x, int y, int w, int h, ImVec4 color)
bool HasValidSelection() const
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
PopupRegistry & GetPopupRegistry()
auto custom_labels_enabled()
ImVector< ImVec2 > selected_points_
ImVec2 GetCurrentSize() const
void SetCanvasSize(ImVec2 canvas_size)
void UpdateColorPainter(gfx::IRenderer *renderer, gfx::Bitmap &bitmap, const ImVec4 &color, const std::function< void()> &event, int tile_size, float scale=1.0f)
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
void DrawCustomHighlight(float grid_step)
auto mutable_selected_tiles()
auto mutable_labels(int i)
std::unique_ptr< CanvasExtensions > extensions_
void SetCanvasGridSize(CanvasGridSize grid_size)
CanvasGridSize grid_size() const
void AddContextMenuItem(const gui::CanvasMenuItem &item)
uint16_t edit_palette_index_
ImVec2 GetPreferredSize() const
float GetGridStep() const
CanvasInteractionHandler interaction_handler_
void InitializePaletteEditor(Rom *rom)
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
void set_selected_tile_pos(ImVec2 pos)
void SetZoomToFit(const gfx::Bitmap &bitmap)
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
ImVector< ImVector< std::string > > labels_
void set_draggable(bool draggable)
void SetContextMenuEnabled(bool enabled)
gfx::BppFormat GetCurrentBppFormat() const
void ClosePersistentPopup(const std::string &popup_id)
void ShowBppFormatSelector()
CanvasMenuDefinition & editor_menu()
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
void RenderPersistentPopups()
void set_global_scale(float scale)
ImVec2 GetSelectedTilePos() const
void SetGridSize(CanvasGridSize grid_size)
bool IsAutoResize() const
void SetShowBuiltinContextMenu(bool show)
std::shared_ptr< CanvasUsageTracker > usage_tracker_
void End()
End canvas rendering (ImGui-style)
float GetGlobalScale() const
void SetSelectedTilePos(ImVec2 pos)
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
CanvasConfig & GetConfig()
bool IsMouseHovering() const
const std::vector< ImVec2 > & GetSelectedTiles() const
std::unique_ptr< CanvasContextMenu > context_menu_
ImVec2 GetLastClickPosition() const
CanvasSelection & GetSelection()
zelda3::GameData * game_data_
void DrawOutline(int x, int y, int w, int h)
void SetClampRectToLocalMaps(bool clamp)
bool context_menu_enabled_
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
CanvasSelection selection_
CanvasRuntime BeginInTable(const std::string &label, const CanvasFrameOptions &options)
Begin canvas in table cell with frame options (modern API) Returns CanvasRuntime for stateless helper...
bool enable_hex_tile_labels_
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
void DrawBitmapTable(const BitmapTable &gfx_bin)
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
void InitializeDefaults()
const ImVector< ImVec2 > & points() const
std::shared_ptr< CanvasPerformanceIntegration > performance_integration_
void Init(const CanvasConfig &config)
Initialize canvas with configuration (post-construction) Preferred over constructor parameters for ne...
void SetAutoResize(bool auto_resize)
void SetGlobalScale(float scale)
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
void DrawText(const std::string &text, int x, int y)
bool * GetCustomLabelsEnabled()
auto selected_points() const
CanvasExtensions & EnsureExtensions()
std::vector< ImVec2 > selected_tiles_
bool ApplyROMPalette(int group_index, int palette_index)
auto set_highlight_tile_id(int i)
RAII wrapper for Canvas (ImGui-style)
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
~ScopedCanvas()
Destructor automatically calls End()
ScopedCanvas(ScopedCanvas &&other) noexcept
const Canvas * get() const
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
ScopedCanvas(gfx::IRenderer *renderer, const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (with optional renderer)
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
const Canvas * operator->() const
Canvas * get()
Get underlying canvas.
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
BppFormat
BPP format enumeration for SNES graphics.
void BitmapCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, int width, int height, int tile_size, bool is_loaded, bool scrollbar, int canvas_id)
CanvasUsage
Canvas usage patterns and tracking.
void EndCanvas(Canvas &canvas)
void DrawBitmapPreview(const CanvasRuntime &rt, gfx::Bitmap &bitmap, const BitmapPreviewOptions &options)
bool DrawTileSelector(const CanvasRuntime &rt, int size, int size_y, ImVec2 *out_selected_pos)
bool DrawTilemapPainter(const CanvasRuntime &rt, gfx::Tilemap &tilemap, int current_tile, ImVec2 *out_drawn_pos)
void DrawRect(const CanvasRuntime &rt, int x, int y, int w, int h, ImVec4 color)
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
void GraphicsBinCanvasPipeline(int width, int height, int tile_size, int num_sheets_to_load, int canvas_id, bool is_loaded, gfx::BitmapTable &graphics_bin)
ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px)
bool RenderSelectorPanel(gui::Canvas &canvas, gfx::Bitmap &bmp, const SelectorPanelOpts &opts, TileHit *out_hit)
TileHit TileIndexAt(const ImVec2 &local_pos, float grid_step, float scale, const ImVec2 &canvas_px)
void DrawTileOutline(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const ImVec2 &tile_size_px, ImU32 color)
void DrawTileLabel(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const char *text, ImU32 color)
void DrawText(const CanvasRuntime &rt, const std::string &text, int x, int y)
ZoomToFitResult ComputeZoomToFit(ImVec2 content_px, ImVec2 canvas_px, float padding_px)
void DrawOutline(const CanvasRuntime &rt, int x, int y, int w, int h, ImU32 color)
void TableCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, const std::string &label, bool auto_resize)
bool DrawTilemapRegion(gui::Canvas &canvas, CanvasRuntime &rt, gfx::Tilemap &tilemap, absl::Span< const int > tile_ids, int tile_size, float scale, ImVec2 clamp_px)
void RenderContextMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
void DrawBitmap(const CanvasRuntime &rt, gfx::Bitmap &bitmap, int border_offset, float scale)
void DrawSelectRect(const CanvasRuntime &rt, int current_map, int tile_size, float scale, CanvasSelection &selection)
bool RenderPreviewPanel(const CanvasRuntime &rt, gfx::Bitmap &bmp, const PreviewPanelOpts &opts)
void DrawTileHighlight(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const ImVec2 &tile_size_px, ImU32 color)
void RegisterDefaultCanvasMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
Tilemap structure for SNES tile-based graphics management.
std::optional< float > grid_step
Unified configuration for canvas display and interaction.
bool clamp_rect_to_local_maps
bool enable_custom_labels
bool show_builtin_context_menu
Optional extension modules for Canvas.
std::optional< float > grid_step
Selection state for canvas interactions.
Complete canvas state snapshot.