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#include <utility>
11
14
15namespace yaze {
16class Rom;
17} // namespace yaze
18
19namespace yaze::zelda3 {
20class PitDamageTable;
21} // namespace yaze::zelda3
22
23namespace yaze::editor {
24
25class DungeonCanvasViewer;
26class DungeonMapPanel;
27class DungeonRoomSelector;
28class CustomCollisionPanel;
29class MinecartTrackEditorPanel;
30class RoomTagEditorPanel;
31class WaterFillPanel;
32enum class RoomSelectionIntent;
33
35 bool show_left = false;
36 bool show_right = false;
37 bool compact_left = false;
38 bool compact_right = false;
39};
40
49
51 bool visible = false;
52 float min_x = 0.0f;
53 float min_y = 0.0f;
54 float max_x = 0.0f;
55 float max_y = 0.0f;
56};
57
62
67
68DungeonWorkbenchResponsiveLayout ResolveDungeonWorkbenchResponsiveLayout(
69 float total_width, float min_canvas_width, float min_sidebar_width,
70 float splitter_width, bool want_left, bool want_right);
71
72DungeonWorkbenchPaneLayout ResolveDungeonWorkbenchPaneLayout(
73 float total_width, float min_canvas_width, float min_sidebar_width,
74 float splitter_width, float stored_left_width, float stored_right_width,
75 bool want_left, bool want_right);
76
77bool ResolveCompactInspectorDetailRequest(bool compact, bool detail_requested);
78
79// An already-open standalone tool owns its WindowContent for that frame. Route
80// repeated Workbench requests back to that window instead of drawing the same
81// instance in both presentations.
83 bool standalone_window_open);
84
85// Single stable window for dungeon editing. This is step 2 in the Workbench plan.
87 public:
89 DungeonRoomSelector* room_selector, int* current_room_id,
90 std::function<void(int)> on_room_selected,
91 std::function<void(int, RoomSelectionIntent)>
92 on_room_selected_with_intent,
93 std::function<void(int)> on_save_room,
94 std::function<void()> on_save_all_rooms,
95 std::function<DungeonCanvasViewer*()> get_viewer,
96 std::function<DungeonCanvasViewer*(int)> get_compare_viewer,
97 std::function<const std::deque<int>&()> get_recent_rooms,
98 std::function<void(int)> forget_recent_room,
99 std::function<void(bool)> set_workflow_mode, Rom* rom = nullptr);
101
102 std::string GetId() const override;
103 std::string GetDisplayName() const override;
104 std::string GetIcon() const override;
105 std::string GetEditorCategory() const override;
106 int GetPriority() const override;
107 std::string GetWorkflowGroup() const override { return "Core"; }
108
109 void SetRom(Rom* rom);
111 CustomCollisionPanel* custom_collision,
112 WaterFillPanel* water_fill,
113 MinecartTrackEditorPanel* minecart_tracks);
114 void SetEmbeddedEditorPanels(WindowContent* object_selector,
115 WindowContent* door_editor,
116 WindowContent* sprite_editor,
117 WindowContent* item_editor,
118 WindowContent* room_graphics,
119 WindowContent* palette_editor);
121 std::function<bool(const std::string&)> is_window_open,
122 std::function<bool(const std::string&)> open_and_focus_window) {
123 is_standalone_tool_open_ = std::move(is_window_open);
124 open_and_focus_standalone_tool_ = std::move(open_and_focus_window);
125 }
126 void SetOpenKeyboardShortcutsCallback(std::function<void()> callback) {
127 open_keyboard_shortcuts_ = std::move(callback);
128 }
130 std::function<zelda3::PitDamageTable*()> provider) {
131 get_pit_damage_table_ = std::move(provider);
132 }
133 void FocusRoomInspector();
136 void ShowConnectedGraph();
139 void OpenDoorTool();
140 void OpenSpriteTool();
141 void OpenItemTool();
143 void OpenPaletteTool();
144 void OpenRoomTagsTool();
146 void OpenWaterFillTool();
147 void OpenMinecartTool();
148 bool PopOutActiveTool();
149
150 // Mirror toggle: when true, the inspector renders on the LEFT and the
151 // sidebar renders on the RIGHT (ZScream-style). Width semantics are
152 // preserved (layout_state_.right_width is still the inspector's width),
153 // so splitter drags still affect the correct pane regardless of side.
154 void SetInspectorOnLeft(bool on_left) { inspector_on_left_ = on_left; }
155 bool IsInspectorOnLeft() const { return inspector_on_left_; }
156 // Wired by the editor to persist the user's mirror choice in UserSettings.
157 // Called when the in-inspector swap-side button is clicked.
158 void SetOnInspectorSideChanged(std::function<void(bool)> cb) {
159 on_inspector_side_changed_ = std::move(cb);
160 }
162 std::function<void(DungeonCanvasViewer&)> cb) {
163 on_primary_canvas_drawn_ = std::move(cb);
164 }
165
166 // Lightweight state probes for unit tests; production rendering remains
167 // driven by the Workbench inspector.
169 const char* GetInspectorModeIdForTesting() const;
170 const char* GetActiveToolIdForTesting() const;
172 DrawPitDamageControls(room_id);
173 }
178 void SetAllSaveFlagsForTesting(bool value) { SetAllSaveFlags(value); }
179
181 void NotifyRoomChanged(int previous_room_id) {
182 previous_room_id_ = previous_room_id;
183 }
184
185 // Wire undo/redo state from the editor's UndoManager.
186 void SetUndoRedoProvider(std::function<bool()> can_undo,
187 std::function<bool()> can_redo,
188 std::function<void()> on_undo,
189 std::function<void()> on_redo,
190 std::function<std::string()> undo_desc,
191 std::function<std::string()> redo_desc,
192 std::function<int()> undo_depth) {
193 can_undo_ = std::move(can_undo);
194 can_redo_ = std::move(can_redo);
195 on_undo_ = std::move(on_undo);
196 on_redo_ = std::move(on_redo);
197 undo_desc_ = std::move(undo_desc);
198 redo_desc_ = std::move(redo_desc);
199 undo_depth_ = std::move(undo_depth);
200 }
201
202 void Draw(bool* p_open) override;
203
204 private:
205 enum class WorkbenchTool : uint8_t {
206 None,
207 RoomTags,
209 WaterFill,
216 Palette,
217 };
218
219 void DrawSidebarPane(float width, float height, float button_size,
220 bool compact);
221 void DrawSidebarHeader(float button_size, bool compact);
222 void DrawSidebarModeTabs(bool stacked, float segment_height);
223 void DrawSidebarContent();
224 void DrawCanvasPane(float width, float height,
225 DungeonCanvasViewer* primary_viewer);
226 void DrawSplitView(DungeonCanvasViewer& primary_viewer);
227 void DrawInspectorPane(float width, float height, float button_size,
228 bool compact, DungeonCanvasViewer* viewer);
229 void DrawInspectorHeader(float button_size, bool compact);
230 void DrawInspector(DungeonCanvasViewer& viewer, bool compact);
231 void DrawInspectorPrimarySelector(float segment_height);
233 void DrawInspectorShelf(DungeonCanvasViewer& viewer, bool compact);
239 void OpenTool(WorkbenchTool tool);
240 void CloseToolInspector();
242 bool IsStandaloneToolOpen(WorkbenchTool tool) const;
244 const char* GetWorkbenchToolId(WorkbenchTool tool) const;
245 const char* GetWorkbenchToolShortLabel(WorkbenchTool tool) const;
247 void DrawApplyScopeControls(int room_id);
248 void DrawPitDamageControls(int room_id);
249 void DrawLayerCompositingControls(DungeonCanvasViewer& viewer, int room_id);
252 void SetAllSaveFlags(bool value);
253
254 // Lazily build a room_id → dungeon_name cache from ROM entrance tables so the
255 // room badge can show accurate group context for custom Oracle dungeons.
257
259 int* current_room_id_ = nullptr;
260
261 // Workbench-owned UI state (was in DungeonEditorV2, moved here Phase 6.2).
264 bool inspector_on_left_ = false;
267 std::function<void(int)> on_room_selected_;
269 std::function<void(int)> on_save_room_;
270 std::function<void()> on_save_all_rooms_;
273 std::function<const std::deque<int>&()> get_recent_rooms_;
274 std::function<void(int)> forget_recent_room_;
275 std::function<void(bool)> set_workflow_mode_;
276 std::function<bool(const std::string&)> is_standalone_tool_open_;
277 std::function<bool(const std::string&)> open_and_focus_standalone_tool_;
278 std::function<void()> open_keyboard_shortcuts_;
279 std::function<void(bool)> on_inspector_side_changed_;
282 Rom* rom_ = nullptr;
283
284 enum class SidebarMode : uint8_t { Rooms, Entrances };
286 enum class InspectorMode : uint8_t { Room, Selection, Tools };
292
293 char compare_search_buf_[64] = {};
294
295 // ROM-based room→dungeon group label cache (lazy-built on first room render).
296 std::unordered_map<int, std::string> room_dungeon_cache_;
298
299 // Undo/redo providers (set via SetUndoRedoProvider).
300 std::function<bool()> can_undo_;
301 std::function<bool()> can_redo_;
302 std::function<void()> on_undo_;
303 std::function<void()> on_redo_;
304 std::function<std::string()> undo_desc_;
305 std::function<std::string()> redo_desc_;
306 std::function<int()> undo_depth_;
307
314 std::unique_ptr<DungeonMapPanel> embedded_dungeon_map_;
325};
326
327} // namespace yaze::editor
328
329#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)
bool IsStandaloneToolOpen(WorkbenchTool tool) const
void SetOpenKeyboardShortcutsCallback(std::function< void()> callback)
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)
std::function< bool(const std::string &) is_standalone_tool_open_)
int GetPriority() const override
Get display priority for menu ordering.
DungeonWorkbenchPitDamageControlRects pit_damage_control_rects_
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 SetPrimaryCanvasDrawnCallback(std::function< void(DungeonCanvasViewer &)> cb)
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)
void DrawInspectorShelfRoom(DungeonCanvasViewer &viewer)
void SetOnInspectorSideChanged(std::function< void(bool)> cb)
WindowContent * GetWorkbenchToolContent(WorkbenchTool tool) const
std::string GetEditorCategory() const override
Editor category this panel belongs to.
const DungeonWorkbenchPitDamageControlRects & GetPitDamageControlRectsForTesting() const
void DrawWorkbenchTool(DungeonCanvasViewer &viewer, WorkbenchTool tool)
void DrawSidebarHeader(float button_size, bool compact)
const char * GetWorkbenchToolShortLabel(WorkbenchTool tool) const
void DrawDungeonMapPopup(DungeonCanvasViewer &viewer)
std::unique_ptr< DungeonMapPanel > embedded_dungeon_map_
void SetStandaloneToolCallbacks(std::function< bool(const std::string &)> is_window_open, std::function< bool(const std::string &)> open_and_focus_window)
void DrawInspectorToolPanel(DungeonCanvasViewer &viewer)
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)
void DrawCanvasPane(float width, float height, DungeonCanvasViewer *primary_viewer)
std::function< void(DungeonCanvasViewer &) on_primary_canvas_drawn_)
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 GetWorkflowGroup() const override
Optional workflow group for hack-centric actions.
std::string GetId() const override
Unique identifier for this panel.
void DrawSplitView(DungeonCanvasViewer &primary_viewer)
std::function< zelda3::PitDamageTable *()> get_pit_damage_table_
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< bool(const std::string &) open_and_focus_standalone_tool_)
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)
bool ResolveCompactInspectorDetailRequest(bool compact, bool detail_requested)
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)
DungeonWorkbenchToolRequestTarget ResolveDungeonWorkbenchToolRequestTarget(bool standalone_window_open)
Zelda 3 specific classes and functions.