1#ifndef YAZE_GUI_CANVAS_H
2#define YAZE_GUI_CANVAS_H
5#define IMGUI_DEFINE_MATH_OPERATORS
23#include "imgui/imgui.h"
34class CanvasAutomationAPI;
61 explicit Canvas(
const std::string&
id);
106 const std::function<
void()> &event,
int tile_size,
162 const std::string& sc =
"")
175 std::function<
bool()> condition) {
190 std::unique_ptr<canvas::CanvasModals>
modals_;
201 void OpenPersistentPopup(
const std::string& popup_id, std::function<
void()> render_callback);
265 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left)
const;
266 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left)
const;
278 void DrawRect(
int x,
int y,
int w,
int h, ImVec4 color);
280 void DrawText(
const std::string& text,
int x,
int y);
283 void DrawInfoGrid(
float grid_step = 64.0f,
int tile_id_offset = 8,
295 if (tile_id >= num_columns * num_rows) {
356 void DrawBitmap(
Bitmap &bitmap,
int x_offset,
int y_offset,
float scale = 1.0f,
int alpha = 255);
357 void DrawBitmap(
Bitmap &bitmap, ImVec2 dest_pos, ImVec2 dest_size, ImVec2 src_pos, ImVec2 src_size);
369 int tile_size,
float scale = 1.0f,
370 int local_map_size = 0x200,
371 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
373 void DrawSelectRect(
int current_map,
int tile_size = 0x10,
float scale = 1.0f);
375 void DrawGrid(
float grid_step = 64.0f,
int tile_id_offset = 8);
379 labels_.push_back(ImVector<std::string>());
387 labels_.push_back(ImVector<std::string>());
390 labels_.push_back(ImVector<std::string>());
483 int num_sheets_to_load,
int canvas_id,
484 bool is_loaded, BitmapTable &graphics_bin);
487 int height,
int tile_size,
bool is_loaded,
488 bool scrollbar,
int canvas_id);
492 const std::string& label =
"",
bool auto_resize =
true);
526 explicit ScopedCanvas(
const std::string&
id, ImVec2 canvas_size = ImVec2(0, 0))
565 other.active_ =
false;
566 other.canvas_ =
nullptr;
The Rom class is used to load, save, and modify Rom data.
Represents a bitmap image optimized for SNES ROM hacking.
Defines an abstract interface for all rendering operations.
Programmatic interface for controlling canvas operations.
Modern, robust canvas for drawing and manipulating graphics.
void set_scrolling(ImVec2 scroll)
auto selected_tile_pos() const
ImVector< ImVec2 > points_
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
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
uint64_t edit_palette_group_name_index_
auto selected_tiles() const
std::unique_ptr< gui::BppComparisonTool > bpp_comparison_tool_
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()
void ShowBppConversionDialog()
CanvasAutomationAPI * GetAutomationAPI()
std::vector< ContextMenuItem > context_menu_items_
bool GetClampRectToLocalMaps() const
auto hover_mouse_pos() const
void ShowAdvancedCanvasProperties()
ImVector< ImVec2 > * mutable_points()
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
std::unique_ptr< gui::BppFormatUI > bpp_format_ui_
auto push_back(ImVec2 pos)
canvas::CanvasUsage GetUsageMode() const
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)
const canvas::CanvasInteractionHandler & GetInteractionHandler() const
bool enable_context_menu_
void DrawLayeredElements()
float GetCanvasHeight() const
const CanvasConfig & GetConfig() const
void ReserveTableSpace(const std::string &label="")
bool enable_custom_labels_
bool IsSelectRectActive() const
auto mutable_selected_points()
void SetRenderer(gfx::IRenderer *renderer)
ImVec2 GetMinimumSize() const
bool DrawTileSelector(int size, int size_y=0)
bool ConvertBitmapFormat(gfx::BppFormat target_format)
void DrawGridLines(float grid_step)
void DrawContextMenuItem(const ContextMenuItem &item)
uint64_t edit_palette_sub_index_
void ClearContextMenuItems()
void ApplyConfigSnapshot(const canvas::CanvasConfig &snapshot)
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)
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)
void SetCanvasGridSize(CanvasGridSize grid_size)
CanvasGridSize grid_size() const
uint16_t edit_palette_index_
std::vector< PopupState > active_popups_
ImVec2 GetPreferredSize() const
float GetGridStep() const
void InitializePaletteEditor(Rom *rom)
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
std::shared_ptr< canvas::CanvasUsageTracker > usage_tracker_
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()
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 SetUsageMode(canvas::CanvasUsage usage)
void End()
End canvas rendering (ImGui-style)
float GetGlobalScale() const
void SetSelectedTilePos(ImVec2 pos)
std::unique_ptr< gui::BppConversionDialog > bpp_conversion_dialog_
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
CanvasConfig & GetConfig()
std::unique_ptr< PaletteWidget > palette_editor_
bool IsMouseHovering() const
const std::vector< ImVec2 > & GetSelectedTiles() const
std::unique_ptr< canvas::CanvasContextMenu > context_menu_
ImVec2 GetLastClickPosition() const
CanvasSelection & GetSelection()
std::unique_ptr< canvas::CanvasModals > modals_
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_
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< canvas::CanvasPerformanceIntegration > performance_integration_
std::unique_ptr< CanvasAutomationAPI > automation_api_
void SetAutoResize(bool auto_resize)
void SetGlobalScale(float scale)
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
void DrawText(const std::string &text, int x, int y)
canvas::CanvasInteractionHandler interaction_handler_
bool * GetCustomLabelsEnabled()
canvas::CanvasInteractionHandler & GetInteractionHandler()
auto selected_points() const
void AddContextMenuItem(const ContextMenuItem &item)
std::vector< ImVec2 > selected_tiles_
bool ApplyROMPalette(int group_index, int palette_index)
auto set_highlight_tile_id(int i)
void ApplyScaleSnapshot(const canvas::CanvasConfig &snapshot)
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
Handles all tile-based interactions for Canvas.
BppFormat
BPP format enumeration for SNES graphics.
std::unordered_map< int, gfx::Bitmap > BitmapTable
CanvasUsage
Canvas usage patterns and tracking.
void BitmapCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, int width, int height, int tile_size, bool is_loaded, bool scrollbar, int canvas_id)
void EndCanvas(Canvas &canvas)
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)
void TableCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, const std::string &label, bool auto_resize)
Main namespace for the application.
Tilemap structure for SNES tile-based graphics management.
Configuration for canvas display and interaction.
bool clamp_rect_to_local_maps
bool enable_custom_labels
Selection state for canvas interactions.
Canvas configuration options for modals.