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 <optional>
9#include <string>
10#include <unordered_map>
11#include <utility>
12#include <vector>
13
14#include "absl/status/status.h"
18
19namespace yaze {
20class Rom;
21} // namespace yaze
22
23namespace yaze::zelda3 {
24class PitDamageTable;
25} // namespace yaze::zelda3
26
27namespace yaze::editor {
28
29class DungeonCanvasViewer;
30class DungeonMapPanel;
31class DungeonEntrancesPanel;
32class DungeonRoomSelector;
33class RoomMatrixContent;
34class CustomCollisionPanel;
35class MinecartTrackEditorPanel;
36class RoomTagEditorPanel;
37class WaterFillPanel;
38enum class RoomSelectionIntent;
39
41 bool show_left = false;
42 bool show_right = false;
43 bool compact_left = false;
44 bool compact_right = false;
45};
46
55
57 bool visible = false;
58 float min_x = 0.0f;
59 float min_y = 0.0f;
60 float max_x = 0.0f;
61 float max_y = 0.0f;
62};
63
68
73
74DungeonWorkbenchResponsiveLayout ResolveDungeonWorkbenchResponsiveLayout(
75 float total_width, float min_canvas_width, float min_sidebar_width,
76 float splitter_width, bool want_left, bool want_right);
77
78DungeonWorkbenchPaneLayout ResolveDungeonWorkbenchPaneLayout(
79 float total_width, float min_canvas_width, float min_sidebar_width,
80 float splitter_width, float stored_left_width, float stored_right_width,
81 bool want_left, bool want_right);
82
83// An already-open standalone tool owns its WindowContent for that frame. Route
84// repeated Workbench requests back to that window instead of drawing the same
85// instance in both presentations.
87 bool standalone_window_open);
88
89// Single stable window for dungeon editing. This is step 2 in the Workbench plan.
91 public:
93 DungeonRoomSelector* room_selector, int* current_room_id,
94 std::function<void(int)> on_room_selected,
95 std::function<void(int, RoomSelectionIntent)>
96 on_room_selected_with_intent,
97 std::function<void(int)> on_save_room,
98 std::function<void()> on_save_all_rooms,
99 std::function<DungeonCanvasViewer*()> get_viewer,
100 std::function<DungeonCanvasViewer*(int)> get_compare_viewer,
101 std::function<const std::deque<int>&()> get_recent_rooms,
102 std::function<void(int)> forget_recent_room,
103 std::function<void(bool)> set_workflow_mode, Rom* rom = nullptr);
105
106 std::string GetId() const override;
107 std::string GetDisplayName() const override;
108 std::string GetIcon() const override;
109 std::string GetEditorCategory() const override;
110 int GetPriority() const override;
111 std::string GetWorkflowGroup() const override { return "Core"; }
112
113 void SetRom(Rom* rom);
115 CustomCollisionPanel* custom_collision,
116 WaterFillPanel* water_fill,
117 MinecartTrackEditorPanel* minecart_tracks);
119 object_coverage_content_ = object_coverage;
120 }
121 void SetEmbeddedEditorPanels(WindowContent* object_selector,
122 WindowContent* door_editor,
123 WindowContent* sprite_editor,
124 WindowContent* item_editor,
125 WindowContent* room_graphics,
126 WindowContent* palette_editor);
128 DungeonEntrancesPanel* entrances) {
129 room_matrix_content_ = room_matrix;
130 entrance_navigator_content_ = entrances;
131 }
132 void SetRoomRenderContextCallback(std::function<void(int)> callback) {
133 prepare_room_render_context_ = std::move(callback);
134 }
135 // Rename (label set) or reset (nullopt) a room's project name. The owner
136 // writes the authoritative project and marks it dirty; without a callback
137 // the rename control is hidden.
139 std::function<absl::Status(int, std::optional<std::string>)>;
141 room_label_edit_callback_ = std::move(callback);
142 }
144 std::function<bool(const std::string&)> is_window_open,
145 std::function<bool(const std::string&)> open_and_focus_window) {
146 is_standalone_tool_open_ = std::move(is_window_open);
147 open_and_focus_standalone_tool_ = std::move(open_and_focus_window);
148 }
149 void SetOpenKeyboardShortcutsCallback(std::function<void()> callback) {
150 open_keyboard_shortcuts_ = std::move(callback);
151 }
153 std::function<zelda3::PitDamageTable*()> provider,
154 std::function<void()> on_change = {}) {
155 get_pit_damage_table_ = std::move(provider);
156 on_pit_damage_changed_ = std::move(on_change);
157 }
158 void FocusRoomInspector();
160 void FocusRoomMatrix();
162 void ShowConnectedGraph();
164 // Opens the read-only Proposal Preview window (room renders + overlay).
166 // Loads an overlay file; returns false and records the error on failure.
167 bool LoadProposalOverlay(const std::string& path);
168 const std::string& loaded_proposal_path() const {
170 }
171 const std::optional<DungeonProposalOverlay>& proposal_overlay() const {
172 return proposal_overlay_;
173 }
174 const std::string& proposal_error() const { return proposal_error_; }
176 void OpenDoorTool();
177 void OpenSpriteTool();
178 void OpenItemTool();
180 void OpenPaletteTool();
181 void OpenRoomTagsTool();
183 void OpenWaterFillTool();
184 void OpenMinecartTool();
186 bool PopOutActiveTool();
187
189 std::function<void(DungeonCanvasViewer&)> cb) {
190 on_primary_canvas_drawn_ = std::move(cb);
191 }
192
200
201 // Lightweight state probes for unit tests; production rendering remains
202 // driven by the Workbench inspector.
204 const char* GetInspectorModeIdForTesting() const;
205 const char* GetActiveToolIdForTesting() const;
206 const char* GetSidebarModeIdForTesting() const;
208 DrawPitDamageControls(room_id);
209 }
214 void SetAllSaveFlagsForTesting(bool value) { SetAllSaveFlags(value); }
215
217 void NotifyRoomChanged(int previous_room_id) {
218 previous_room_id_ = previous_room_id;
219 }
220
221 // Wire undo/redo state from the editor's UndoManager.
222 void SetUndoRedoProvider(std::function<bool()> can_undo,
223 std::function<bool()> can_redo,
224 std::function<void()> on_undo,
225 std::function<void()> on_redo,
226 std::function<std::string()> undo_desc,
227 std::function<std::string()> redo_desc,
228 std::function<int()> undo_depth) {
229 can_undo_ = std::move(can_undo);
230 can_redo_ = std::move(can_redo);
231 on_undo_ = std::move(on_undo);
232 on_redo_ = std::move(on_redo);
233 undo_desc_ = std::move(undo_desc);
234 redo_desc_ = std::move(redo_desc);
235 undo_depth_ = std::move(undo_depth);
236 }
237
238 void Draw(bool* p_open) override;
239
240 private:
242 enum class WorkbenchTool : uint8_t {
243 None,
244 RoomTags,
246 WaterFill,
254 Palette,
255 };
256
257 void DrawSidebarPane(float width, float height, float button_size,
258 bool compact);
259 void DrawSidebarHeader(float button_size, bool compact);
260 void DrawSidebarModeTabs();
261 void DrawSidebarContent();
262 void DrawCanvasPane(float width, float height,
263 DungeonCanvasViewer* primary_viewer);
264 void DrawSplitView(DungeonCanvasViewer& primary_viewer);
265 void DrawInspectorPane(float width, float height, float button_size,
266 bool compact, DungeonCanvasViewer* viewer);
267 void DrawInspectorHeader(float button_size, bool compact);
268 void DrawInspector(DungeonCanvasViewer& viewer, bool compact);
269 void DrawInspectorShelf(DungeonCanvasViewer& viewer, bool compact);
273 void DrawLayoutOptions();
276 void DrawSelectedObjectActions(DungeonCanvasViewer& viewer, size_t index);
280 void OpenTool(WorkbenchTool tool);
281 void CloseToolInspector();
283 bool IsStandaloneToolOpen(WorkbenchTool tool) const;
285 const char* GetWorkbenchToolId(WorkbenchTool tool) const;
286 const char* GetWorkbenchToolShortLabel(WorkbenchTool tool) const;
288 void DrawApplyScopeControls(int room_id);
289 void DrawPitDamageControls(int room_id, bool compact = false);
293 void SetAllSaveFlags(bool value);
294
295 // Lazily build a room_id → dungeon_name cache from ROM entrance tables so the
296 // room badge can show accurate group context for custom Oracle dungeons.
298
300 int* current_room_id_ = nullptr;
301
302 // Workbench-owned UI state (was in DungeonEditorV2, moved here Phase 6.2).
307 std::function<void(int)> on_room_selected_;
309 std::function<void(int)> on_save_room_;
310 std::function<void()> on_save_all_rooms_;
313 std::function<const std::deque<int>&()> get_recent_rooms_;
314 std::function<void(int)> forget_recent_room_;
315 std::function<void(bool)> set_workflow_mode_;
316 std::function<bool(const std::string&)> is_standalone_tool_open_;
317 std::function<bool(const std::string&)> open_and_focus_standalone_tool_;
318 std::function<void()> open_keyboard_shortcuts_;
320 std::function<void(int)> prepare_room_render_context_;
322 char room_rename_buffer_[128] = {};
325 std::function<void()> on_pit_damage_changed_;
326 Rom* rom_ = nullptr;
327
328 enum class SidebarMode : uint8_t {
329 Room,
330 Objects,
331 Sprites,
332 Doors,
333 Items,
334 Entrance,
335 Tools
336 };
339 bool show_room_matrix_ = true;
340
342
343 enum class InspectorMode : uint8_t { Inspect, Tools };
346
347 char compare_search_buf_[64] = {};
348
349 // ROM-based room→dungeon group label cache (lazy-built on first room render).
350 std::unordered_map<int, std::string> room_dungeon_cache_;
352
353 // Undo/redo providers (set via SetUndoRedoProvider).
354 std::function<bool()> can_undo_;
355 std::function<bool()> can_redo_;
356 std::function<void()> on_undo_;
357 std::function<void()> on_redo_;
358 std::function<std::string()> undo_desc_;
359 std::function<std::string()> redo_desc_;
360 std::function<int()> undo_depth_;
361
363
364 // Proposal Preview window state (read-only review of layout proposals).
366 char proposal_path_[1024] = {};
367 std::optional<DungeonProposalOverlay> proposal_overlay_;
368 std::string proposal_error_;
370 std::vector<char> proposal_layer_visible_;
372 float proposal_scale_ = 1.0f;
379 std::unique_ptr<DungeonMapPanel> embedded_dungeon_map_;
393};
394
395} // namespace yaze::editor
396
397#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:52
WindowContent for displaying and editing dungeon entrances.
WindowContent for displaying multiple rooms in a spatial dungeon layout.
Handles room and entrance selection UI.
void DrawInspector(DungeonCanvasViewer &viewer, bool compact)
void DrawPitDamageControls(int room_id, bool compact=false)
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)
void DrawProposalPreviewWindow(DungeonCanvasViewer &viewer)
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_
void SetRoomInspectorSubTab(RoomInspectorSubTab tab)
void DrawSelectedObjectActions(DungeonCanvasViewer &viewer, size_t index)
void SetRoomLabelEditCallback(RoomLabelEditCallback callback)
bool IsWorkbenchToolAvailable(WorkbenchTool tool) const
void DrawInspectorHeader(float button_size, bool compact)
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 SetRoomRenderContextCallback(std::function< void(int)> callback)
void DrawInspectorPane(float width, float height, float button_size, bool compact, DungeonCanvasViewer *viewer)
void SetObjectCoverageContent(WindowContent *object_coverage)
void DrawInspectorShelfRoom(DungeonCanvasViewer &viewer)
std::function< absl::Status(int, std::optional< std::string >)> RoomLabelEditCallback
WindowContent * GetWorkbenchToolContent(WorkbenchTool tool) const
void SetPitDamageTableProvider(std::function< zelda3::PitDamageTable *()> provider, std::function< void()> on_change={})
std::string GetEditorCategory() const override
Editor category this panel belongs to.
const DungeonWorkbenchPitDamageControlRects & GetPitDamageControlRectsForTesting() const
std::optional< DungeonProposalOverlay > proposal_overlay_
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 DrawRoomContextHeader(DungeonCanvasViewer &viewer)
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.
bool DrawObjectPlacementInspector(DungeonCanvasViewer &viewer)
std::string GetId() const override
Unique identifier for this panel.
bool LoadProposalOverlay(const std::string &path)
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.
void Draw(bool *p_open) override
Draw the panel content.
std::function< bool(const std::string &) open_and_focus_standalone_tool_)
std::function< const std::deque< int > &()> get_recent_rooms_
const std::optional< DungeonProposalOverlay > & proposal_overlay() const
void SetNavigationPanels(RoomMatrixContent *room_matrix, DungeonEntrancesPanel *entrances)
void DrawInspectorShelf(DungeonCanvasViewer &viewer, bool compact)
std::function< DungeonCanvasViewer *()> get_viewer_
WindowContent for displaying a visual 16x19 grid of all dungeon rooms.
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)
DungeonWorkbenchToolRequestTarget ResolveDungeonWorkbenchToolRequestTarget(bool standalone_window_open)
Zelda 3 specific classes and functions.