yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
object_editor_panel.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_EDITOR_PANEL_H_
2#define YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_EDITOR_PANEL_H_
3
4#include <memory>
5#include <string>
6#include <unordered_map>
7
10#include "app/editor/editor.h"
15#include "app/gui/core/icons.h"
17#include "rom/rom.h"
24#include "zelda3/game_data.h"
25
26namespace yaze {
27namespace editor {
28
50 public:
52 gfx::IRenderer* renderer, Rom* rom, DungeonCanvasViewer* canvas_viewer,
53 std::shared_ptr<zelda3::DungeonObjectEditor> object_editor = nullptr);
54
55 // ==========================================================================
56 // EditorPanel Identity
57 // ==========================================================================
58
59 std::string GetId() const override { return "dungeon.object_editor"; }
60 std::string GetDisplayName() const override { return "Object Editor"; }
61 std::string GetIcon() const override { return ICON_MD_CONSTRUCTION; }
62 std::string GetEditorCategory() const override { return "Dungeon"; }
63 int GetPriority() const override { return 60; }
64
65 // ==========================================================================
66 // EditorPanel Drawing
67 // ==========================================================================
68
69 void Draw(bool* p_open) override;
70 void OnOpen() override {}
71 void OnClose() override {}
72
73 // ==========================================================================
74 // Component Accessors
75 // ==========================================================================
76
81
82 // ==========================================================================
83 // Context Management
84 // ==========================================================================
85
86 void SetCurrentRoom(int room_id) {
87 current_room_id_ = room_id;
89 }
91 // Reset callback flag when viewer changes so we rewire to the new viewer
92 if (canvas_viewer_ != viewer) {
94 }
95 canvas_viewer_ = viewer;
97 }
98
104
105 void SetGameData(zelda3::GameData* game_data) {
106 object_selector_.SetGameData(game_data);
108 }
109
110 void SetRooms(std::array<zelda3::Room, 0x128>* rooms) {
112 }
113
117
118 // ==========================================================================
119 // Programmatic Controls (for agents/automation)
120 // ==========================================================================
121
122 void SelectObject(int obj_id);
123 void SetAgentOptimizedLayout(bool enabled);
125
126 // Object operations
127 void CycleObjectSelection(int direction);
128 void SelectAllObjects();
130 void CopySelectedObjects();
131 void PasteObjects();
132 void CancelPlacement(); // Cancel current object placement
133
134 // Show a red error message near the object controls for ~2 seconds.
135 // Called from DungeonEditorV2::HandleObjectPlaced on placement failure.
136 void SetPlacementError(const std::string& message);
137
138 // ==========================================================================
139 // Static Object Editor (double-click to open)
140 // ==========================================================================
141
142 void OpenStaticObjectEditor(int object_id);
146
147 // Tile editor callback: invoked when user clicks "Edit Tiles"
148 using TileEditorCallback = std::function<void(int16_t object_id)>;
150 tile_editor_callback_ = std::move(callback);
151 }
152
153 private:
154 // Selection change handler
155 void OnSelectionChanged();
156
157 // Drawing methods
158 void DrawObjectSelector();
159 void DrawDoorSection();
160 void DrawEmulatorPreview();
165
166 // Keyboard shortcuts
168 void DeselectAllObjects();
169 void PerformDelete();
171 void NudgeSelectedObjects(int dx, int dy);
172 void ScrollToObject(size_t index);
173
174 // ==========================================================================
175 // Member Variables
176 // ==========================================================================
177
178 Rom* rom_ = nullptr;
181
182 // Components
185
186 // Object preview canvases (one per object type)
187 std::unordered_map<int, gui::Canvas> object_preview_canvases_;
188
189 // UI state
192 bool show_object_list_ = true;
194 bool show_grid_ = true;
195 bool show_object_ids_ = false;
198
199 // Selected object for placement
203 std::shared_ptr<zelda3::DungeonObjectEditor> object_editor_;
204
205 // Selection state cache (updated via callback)
208
209 // Static object editor state (opened via double-click)
213 gui::Canvas static_preview_canvas_{"##StaticObjectPreview", ImVec2(128, 128)};
215 std::unique_ptr<zelda3::ObjectParser> object_parser_;
218
219 // Door placement state
222
223 // Shortcut help popup state
225
226 // Placement error feedback: shown in red for kPlacementErrorDuration seconds.
227 static constexpr double kPlacementErrorDuration = 2.0;
229 double placement_error_time_ = -1.0; // ImGui::GetTime() when error was set
230
231 // Tile editor callback
233};
234
235} // namespace editor
236} // namespace yaze
237
238#endif // YAZE_APP_EDITOR_DUNGEON_PANELS_OBJECT_EDITOR_PANEL_H_
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
Handles object selection, preview, and editing UI.
void set_rooms(std::array< zelda3::Room, 0x128 > *rooms)
void SetGameData(zelda3::GameData *game_data)
void SetCurrentPaletteGroup(const gfx::PaletteGroup &palette_group)
Base interface for all logical panel components.
Unified panel for dungeon object editing.
gui::DungeonObjectEmulatorPreview & emulator_preview()
int GetPriority() const override
Get display priority for menu ordering.
std::string GetIcon() const override
Material Design icon for this panel.
void SetCanvasViewer(DungeonCanvasViewer *viewer)
void OnClose() override
Called when panel is hidden.
std::string GetId() const override
Unique identifier for this panel.
std::function< void(int16_t object_id)> TileEditorCallback
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
void SetGameData(zelda3::GameData *game_data)
void SetPlacementError(const std::string &message)
ObjectEditorPanel(gfx::IRenderer *renderer, Rom *rom, DungeonCanvasViewer *canvas_viewer, std::shared_ptr< zelda3::DungeonObjectEditor > object_editor=nullptr)
static constexpr double kPlacementErrorDuration
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
std::unique_ptr< zelda3::ObjectParser > object_parser_
std::unordered_map< int, gui::Canvas > object_preview_canvases_
void OnOpen() override
Called when panel becomes visible.
gui::DungeonObjectEmulatorPreview emulator_preview_
void SetContext(EditorContext ctx)
void set_tile_editor_callback(TileEditorCallback callback)
gfx::BackgroundBuffer static_preview_buffer_
void SetRooms(std::array< zelda3::Room, 0x128 > *rooms)
void Draw(bool *p_open) override
Draw the panel content.
DungeonObjectSelector & object_selector()
std::shared_ptr< zelda3::DungeonObjectEditor > object_editor_
std::string GetEditorCategory() const override
Editor category this panel belongs to.
zelda3::ObjectDrawInfo static_editor_draw_info_
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
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:150
#define ICON_MD_CONSTRUCTION
Definition icons.h:458
DoorType
Door types from ALTTP.
Definition door_types.h:33
@ NormalDoor
Normal door (upper layer)
Lightweight view into the essential runtime context (Rom + GameData)
Definition editor.h:70
zelda3::GameData * game_data
Definition editor.h:72
Represents a group of palettes.
Draw routine information for object rendering.