yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_workbench_content.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_WORKSPACE_DUNGEON_WORKBENCH_CONTENT_H
2#define YAZE_APP_EDITOR_DUNGEON_WORKSPACE_DUNGEON_WORKBENCH_CONTENT_H
3
4#include <cstdint>
5#include <deque>
6#include <functional>
7#include <memory>
8#include <string>
9#include <unordered_map>
10
13
14namespace yaze {
15class Rom;
16} // namespace yaze
17
18namespace yaze::zelda3 {
19class PitDamageTable;
20} // namespace yaze::zelda3
21
22namespace yaze::editor {
23
24class DungeonCanvasViewer;
25class DungeonMapPanel;
26class DungeonRoomSelector;
27class CustomCollisionPanel;
28class MinecartTrackEditorPanel;
29class RoomTagEditorPanel;
30class WaterFillPanel;
31enum class RoomSelectionIntent;
32
34 bool show_left = false;
35 bool show_right = false;
36 bool compact_left = false;
37 bool compact_right = false;
38};
39
48
50 bool visible = false;
51 float min_x = 0.0f;
52 float min_y = 0.0f;
53 float max_x = 0.0f;
54 float max_y = 0.0f;
55};
56
61
63 float total_width, float min_canvas_width, float min_sidebar_width,
64 float splitter_width, bool want_left, bool want_right);
65
67 float total_width, float min_canvas_width, float min_sidebar_width,
68 float splitter_width, float stored_left_width, float stored_right_width,
69 bool want_left, bool want_right);
70
71// Single stable window for dungeon editing. This is step 2 in the Workbench plan.
73 public:
75 DungeonRoomSelector* room_selector, int* current_room_id,
76 std::function<void(int)> on_room_selected,
77 std::function<void(int, RoomSelectionIntent)>
78 on_room_selected_with_intent,
79 std::function<void(int)> on_save_room,
80 std::function<void()> on_save_all_rooms,
81 std::function<DungeonCanvasViewer*()> get_viewer,
82 std::function<DungeonCanvasViewer*(int)> get_compare_viewer,
83 std::function<const std::deque<int>&()> get_recent_rooms,
84 std::function<void(int)> forget_recent_room,
85 std::function<void(bool)> set_workflow_mode, Rom* rom = nullptr);
87
88 std::string GetId() const override;
89 std::string GetDisplayName() const override;
90 std::string GetIcon() const override;
91 std::string GetEditorCategory() const override;
92 int GetPriority() const override;
93
94 void SetRom(Rom* rom);
96 CustomCollisionPanel* custom_collision,
97 WaterFillPanel* water_fill,
98 MinecartTrackEditorPanel* minecart_tracks);
99 void SetEmbeddedEditorPanels(WindowContent* object_selector,
100 WindowContent* door_editor,
101 WindowContent* sprite_editor,
102 WindowContent* item_editor,
103 WindowContent* room_graphics,
104 WindowContent* palette_editor);
106 std::function<zelda3::PitDamageTable*()> provider) {
107 get_pit_damage_table_ = std::move(provider);
108 }
109 void FocusRoomInspector();
112 void ShowConnectedGraph();
115 void OpenDoorTool();
116 void OpenSpriteTool();
117 void OpenItemTool();
119 void OpenPaletteTool();
120 void OpenRoomTagsTool();
122 void OpenWaterFillTool();
123 void OpenMinecartTool();
124
125 // Mirror toggle: when true, the inspector renders on the LEFT and the
126 // sidebar renders on the RIGHT (ZScream-style). Width semantics are
127 // preserved (layout_state_.right_width is still the inspector's width),
128 // so splitter drags still affect the correct pane regardless of side.
129 void SetInspectorOnLeft(bool on_left) { inspector_on_left_ = on_left; }
130 bool IsInspectorOnLeft() const { return inspector_on_left_; }
131 // Wired by the editor to persist the user's mirror choice in UserSettings.
132 // Called when the in-inspector swap-side button is clicked.
133 void SetOnInspectorSideChanged(std::function<void(bool)> cb) {
134 on_inspector_side_changed_ = std::move(cb);
135 }
136
137 // Lightweight state probes for unit tests; production rendering remains
138 // driven by the Workbench inspector.
139 bool IsToolDrawerActiveForTesting() const;
140 const char* GetInspectorModeIdForTesting() const;
141 const char* GetActiveToolIdForTesting() const;
143 DrawPitDamageControls(room_id);
144 }
149
151 void NotifyRoomChanged(int previous_room_id) {
152 previous_room_id_ = previous_room_id;
153 }
154
155 // Wire undo/redo state from the editor's UndoManager.
156 void SetUndoRedoProvider(std::function<bool()> can_undo,
157 std::function<bool()> can_redo,
158 std::function<void()> on_undo,
159 std::function<void()> on_redo,
160 std::function<std::string()> undo_desc,
161 std::function<std::string()> redo_desc,
162 std::function<int()> undo_depth) {
163 can_undo_ = std::move(can_undo);
164 can_redo_ = std::move(can_redo);
165 on_undo_ = std::move(on_undo);
166 on_redo_ = std::move(on_redo);
167 undo_desc_ = std::move(undo_desc);
168 redo_desc_ = std::move(redo_desc);
169 undo_depth_ = std::move(undo_depth);
170 }
171
172 void Draw(bool* p_open) override;
173
174 private:
175 enum class WorkbenchTool : uint8_t {
176 None,
177 RoomTags,
179 WaterFill,
186 Palette,
187 };
188
189 void DrawRecentRoomTabs();
190 void DrawSidebarPane(float width, float height, float button_size,
191 bool compact);
192 void DrawSidebarHeader(float button_size, bool compact);
193 void DrawSidebarModeTabs(bool stacked, float segment_height);
194 void DrawSidebarContent();
195 void DrawCanvasPane(float width, float height,
196 DungeonCanvasViewer* primary_viewer,
197 bool left_sidebar_visible);
199 void DrawSplitView(DungeonCanvasViewer& primary_viewer);
200 void DrawInspectorPane(float width, float height, float button_size,
201 bool compact, DungeonCanvasViewer* viewer);
202 void DrawInspectorHeader(float button_size, bool compact);
203 void DrawInspector(DungeonCanvasViewer& viewer, bool compact);
204 void DrawInspectorPrimarySelector(float segment_height);
206 void DrawInspectorShelf(DungeonCanvasViewer& viewer, bool compact);
213 void OpenTool(WorkbenchTool tool);
215 const char* GetWorkbenchToolId(WorkbenchTool tool) const;
216 const char* GetWorkbenchToolTitle(WorkbenchTool tool) const;
217 const char* GetWorkbenchToolIcon(WorkbenchTool tool) const;
218 const char* GetWorkbenchToolShortLabel(WorkbenchTool tool) const;
220 void DrawApplyScopeControls(int room_id);
221 void DrawPitDamageControls(int room_id);
222 void DrawLayerCompositingControls(DungeonCanvasViewer& viewer, int room_id);
225 void SetAllSaveFlags(bool value);
226
227 // Lazily build a room_id → dungeon_name cache from ROM entrance tables so the
228 // room badge can show accurate group context for custom Oracle dungeons.
230
232 int* current_room_id_ = nullptr;
233
234 // Workbench-owned UI state (was in DungeonEditorV2, moved here Phase 6.2).
237 bool inspector_on_left_ = false;
240 std::function<void(int)> on_room_selected_;
242 std::function<void(int)> on_save_room_;
243 std::function<void()> on_save_all_rooms_;
246 std::function<const std::deque<int>&()> get_recent_rooms_;
247 std::function<void(int)> forget_recent_room_;
248 std::function<void(bool)> set_workflow_mode_;
249 std::function<void(bool)> on_inspector_side_changed_;
251 Rom* rom_ = nullptr;
252
253 enum class SidebarMode : uint8_t { Rooms, Entrances };
255 enum class InspectorMode : uint8_t { Room, Selection, Tools };
259
260 char compare_search_buf_[64] = {};
261
262 // ROM-based room→dungeon group label cache (lazy-built on first room render).
263 std::unordered_map<int, std::string> room_dungeon_cache_;
265
266 // Undo/redo providers (set via SetUndoRedoProvider).
267 std::function<bool()> can_undo_;
268 std::function<bool()> can_redo_;
269 std::function<void()> on_undo_;
270 std::function<void()> on_redo_;
271 std::function<std::string()> undo_desc_;
272 std::function<std::string()> redo_desc_;
273 std::function<int()> undo_depth_;
274
275 // Shortcut legend toggle.
283 std::unique_ptr<DungeonMapPanel> embedded_dungeon_map_;
294};
295
296} // namespace yaze::editor
297
298#endif // YAZE_APP_EDITOR_DUNGEON_WORKSPACE_DUNGEON_WORKBENCH_CONTENT_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
WindowContent for displaying multiple rooms in a spatial dungeon layout.
Handles room and entrance selection UI.
void DrawInspector(DungeonCanvasViewer &viewer, bool compact)
void DrawInspectorShelfSelection(DungeonCanvasViewer &viewer)
DungeonWorkbenchContent(DungeonRoomSelector *room_selector, int *current_room_id, std::function< void(int)> on_room_selected, std::function< void(int, RoomSelectionIntent)> on_room_selected_with_intent, std::function< void(int)> on_save_room, std::function< void()> on_save_all_rooms, std::function< DungeonCanvasViewer *()> get_viewer, std::function< DungeonCanvasViewer *(int)> get_compare_viewer, std::function< const std::deque< int > &()> get_recent_rooms, std::function< void(int)> forget_recent_room, std::function< void(bool)> set_workflow_mode, Rom *rom=nullptr)
int GetPriority() const override
Get display priority for menu ordering.
DungeonWorkbenchPitDamageControlRects pit_damage_control_rects_
void DrawSelectionShelf(DungeonCanvasViewer &viewer)
bool IsWorkbenchToolAvailable(WorkbenchTool tool) const
void DrawInspectorHeader(float button_size, bool compact)
void DrawInspectorCompactSummary(DungeonCanvasViewer &viewer)
void DrawSidebarModeTabs(bool stacked, float segment_height)
void SetUndoRedoProvider(std::function< bool()> can_undo, std::function< bool()> can_redo, std::function< void()> on_undo, std::function< void()> on_redo, std::function< std::string()> undo_desc, std::function< std::string()> redo_desc, std::function< int()> undo_depth)
void DrawSidebarPane(float width, float height, float button_size, bool compact)
DungeonMapPanel * GetEmbeddedDungeonMap(DungeonCanvasViewer &viewer)
void DrawInspectorPane(float width, float height, float button_size, bool compact, DungeonCanvasViewer *viewer)
const char * GetWorkbenchToolIcon(WorkbenchTool tool) const
void DrawInspectorShelfRoom(DungeonCanvasViewer &viewer)
void SetOnInspectorSideChanged(std::function< void(bool)> cb)
std::string GetEditorCategory() const override
Editor category this panel belongs to.
const DungeonWorkbenchPitDamageControlRects & GetPitDamageControlRectsForTesting() const
void DrawInspectorShelfTools(DungeonCanvasViewer &viewer)
void DrawCanvasPane(float width, float height, DungeonCanvasViewer *primary_viewer, bool left_sidebar_visible)
void DrawWorkbenchTool(DungeonCanvasViewer &viewer, WorkbenchTool tool)
void DrawSidebarHeader(float button_size, bool compact)
void DrawInspectorToolDrawer(DungeonCanvasViewer &viewer)
const char * GetWorkbenchToolShortLabel(WorkbenchTool tool) const
void DrawDungeonMapPopup(DungeonCanvasViewer &viewer)
std::unique_ptr< DungeonMapPanel > embedded_dungeon_map_
std::function< void(int, RoomSelectionIntent)> on_room_selected_with_intent_
void SetEmbeddedEditorPanels(WindowContent *object_selector, WindowContent *door_editor, WindowContent *sprite_editor, WindowContent *item_editor, WindowContent *room_graphics, WindowContent *palette_editor)
void SetEmbeddedToolPanels(RoomTagEditorPanel *room_tags, CustomCollisionPanel *custom_collision, WaterFillPanel *water_fill, MinecartTrackEditorPanel *minecart_tracks)
const char * GetWorkbenchToolId(WorkbenchTool tool) const
const char * GetWorkbenchToolUnavailableMessage(WorkbenchTool tool) const
void NotifyRoomChanged(int previous_room_id)
Called by the editor when the current room changes.
std::string GetId() const override
Unique identifier for this panel.
void DrawSplitView(DungeonCanvasViewer &primary_viewer)
std::function< zelda3::PitDamageTable *()> get_pit_damage_table_
const char * GetWorkbenchToolTitle(WorkbenchTool tool) const
std::string GetIcon() const override
Material Design icon for this panel.
std::function< DungeonCanvasViewer *(int)> get_compare_viewer_
std::unordered_map< int, std::string > room_dungeon_cache_
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
std::function< void(bool)> on_inspector_side_changed_
void Draw(bool *p_open) override
Draw the panel content.
void SetPitDamageTableProvider(std::function< zelda3::PitDamageTable *()> provider)
std::function< const std::deque< int > &()> get_recent_rooms_
void DrawInspectorShelf(DungeonCanvasViewer &viewer, bool compact)
void DrawLayerCompositingControls(DungeonCanvasViewer &viewer, int room_id)
std::function< DungeonCanvasViewer *()> get_viewer_
WindowContent showing all room tag slots and their usage across rooms.
Base interface for all logical window content components.
Editors are the view controllers for the application.
DungeonWorkbenchPaneLayout ResolveDungeonWorkbenchPaneLayout(float total_width, float min_canvas_width, float min_sidebar_width, float splitter_width, float stored_left_width, float stored_right_width, bool want_left, bool want_right)
RoomSelectionIntent
Intent for room selection in the dungeon editor.
DungeonWorkbenchResponsiveLayout ResolveDungeonWorkbenchResponsiveLayout(float total_width, float min_canvas_width, float min_sidebar_width, float splitter_width, bool want_left, bool want_right)
Zelda 3 specific classes and functions.