yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
editor.h
Go to the documentation of this file.
1#ifndef YAZE_APP_CORE_EDITOR_H
2#define YAZE_APP_CORE_EDITOR_H
3
4#include <array>
5#include <cstddef>
6#include <functional>
7#include <vector>
8
9#include "absl/status/status.h"
10#include "absl/status/statusor.h"
11#include "absl/strings/str_format.h"
16
17// Forward declaration in yaze::core namespace
18namespace yaze {
19namespace core {
20class VersionManager;
21}
22} // namespace yaze
23
24namespace yaze {
25
26// Forward declarations
27class Rom;
28namespace gfx {
29class IRenderer;
30}
31namespace emu {
32class Emulator;
33}
34namespace project {
35struct YazeProject;
36} // namespace project
37namespace zelda3 {
38struct GameData;
39} // namespace zelda3
40
45namespace editor {
46
47// Forward declarations
48struct GfxGroupWorkspaceState;
49class GlobalEditorContext;
50class WorkspaceWindowManager;
51class ToastManager;
52class UserSettings;
53class StatusBar;
54
73 Rom* rom = nullptr;
75
76 // Check if context is valid for operations
77 bool IsValid() const { return rom != nullptr && game_data != nullptr; }
78 bool HasRom() const { return rom != nullptr; }
79 bool HasGameData() const { return game_data != nullptr; }
80
81 // Implicit conversion to bool for quick validity checks
82 explicit operator bool() const { return IsValid(); }
83};
84
116// Shared clipboard for cross-editor copy/paste operations.
134
135// Data-layer dependencies: ROM, game data, project, session identity.
137 Rom* rom = nullptr;
142 size_t session_id = 0;
143
144 EditorContext context() const { return {rom, game_data}; }
145 bool HasContext() const { return rom != nullptr && game_data != nullptr; }
146};
147
148// UI-layer dependencies: panel/popup/toast/shortcut managers.
159
170 // --- Core (data-layer) dependencies ---
171 Rom* rom = nullptr;
176 size_t session_id = 0;
179
180 // --- UI-layer dependencies ---
189
190 // --- Specialized dependencies ---
193 void* custom_data = nullptr;
194
195 // Extract sub-structs for passing to components that only need a subset.
204
205 EditorContext context() const { return {rom, game_data}; }
206 bool HasContext() const { return rom != nullptr && game_data != nullptr; }
207};
208
209enum class EditorType {
210 kUnknown,
211 kAssembly,
212 kDungeon,
213 kEmulator,
214 kGraphics,
215 kMusic,
217 kPalette,
218 kScreen,
219 kSprite,
220 kMessage,
221 kHex,
222 kAgent,
223 kSettings,
224};
225
226constexpr std::array<const char*, 14> kEditorNames = {
227 "Unknown", "Assembly", "Dungeon", "Emulator", "Graphics",
228 "Music", "Overworld", "Palette", "Screen", "Sprite",
229 "Message", "Hex", "Agent", "Settings",
230};
231
232constexpr size_t kEditorTypeCount =
233 static_cast<size_t>(EditorType::kSettings) + 1;
234
235inline size_t EditorTypeIndex(EditorType type) {
236 return static_cast<size_t>(type);
237}
238
245class Editor {
246 public:
247 Editor() = default;
248 virtual ~Editor() = default;
249
250 virtual void SetDependencies(const EditorDependencies& deps) {
251 dependencies_ = deps;
252 }
253
254 // Set GameData for Zelda3-specific data access
258
259 // Initialization of the editor, no ROM assets.
260 virtual void Initialize() = 0;
261
262 // Initialization of ROM assets.
263 virtual absl::Status Load() = 0;
264
265 // Save the editor state.
266 virtual absl::Status Save() = 0;
267
268 // Coordinated-save lifecycle. Editors that clear model-level dirty state
269 // during Save() can override these hooks to checkpoint and restore it when a
270 // later serializer, validation gate, backup, or disk write fails. Default
271 // implementations keep existing editors source-compatible.
272 virtual absl::Status BeginSaveTransaction() { return absl::OkStatus(); }
273 virtual void RollbackSaveTransaction() {}
274 virtual void CommitSaveTransaction() {}
275
276 // Release callbacks and raw references to session-owned workspace panels
277 // before WorkspaceWindowManager destroys those panels. Session teardown is
278 // terminal, and implementations must tolerate repeated calls.
280
281 // Update the editor state, ran every frame.
282 virtual absl::Status Update() = 0;
283
284 virtual absl::Status Cut() = 0;
285 virtual absl::Status Copy() = 0;
286 virtual absl::Status Paste() = 0;
287
288 virtual absl::Status Undo() = 0;
289 virtual absl::Status Redo() = 0;
290
291 // Undo description for toast feedback (queries editor's UndoManager)
292 virtual std::string GetUndoDescription() const {
294 }
295 virtual std::string GetRedoDescription() const {
297 }
298
299 const UndoManager& undo_manager() const { return undo_manager_; }
300
301 virtual absl::Status Find() = 0;
302
303 virtual absl::Status Clear() { return absl::OkStatus(); }
304
305 // Push editor-specific context into the shared status bar.
306 // Called each frame on the currently active editor by EditorManager.
307 // Default no-op; override to surface cursor/selection/zoom/mode/custom
308 // segments via StatusBar's Set* setters.
309 virtual void ContributeStatus(StatusBar* /*status_bar*/) {}
310
311 EditorType type() const { return type_; }
312
313 bool* active() { return &active_; }
314 void set_active(bool active) { active_ = active; }
316
317 // ROM loading state helpers (default implementations)
318 virtual bool IsRomLoaded() const { return false; }
319 virtual std::string GetRomStatus() const {
320 return "ROM state not implemented";
321 }
322
323 // Accessors for common dependencies
324 Rom* rom() const { return dependencies_.rom; }
330
331 // Get bundled context for sub-components
333 bool HasContext() const { return dependencies_.HasContext(); }
334
335 protected:
336 bool active_ = false;
340
341 // Helper method to create session-aware card titles for multi-session support
342 std::string MakePanelTitle(const std::string& base_title) const {
343 if (dependencies_.session_id > 0) {
344 return absl::StrFormat("%s [S%zu]", base_title, dependencies_.session_id);
345 }
346 return base_title;
347 }
348
349 // Helper method to create session-aware card IDs for multi-session support
350 std::string MakeWindowId(const std::string& base_id) const {
351 if (dependencies_.session_id > 0) {
352 return absl::StrFormat("s%zu.%s", dependencies_.session_id, base_id);
353 }
354 return base_id;
355 }
356
357 // Helper method for ROM access with safety check
358 template <typename T>
359 absl::StatusOr<T> SafeRomAccess(std::function<T()> accessor,
360 const std::string& operation = "") const {
361 if (!IsRomLoaded()) {
362 return absl::FailedPreconditionError(
363 operation.empty() ? "ROM not loaded"
364 : absl::StrFormat("%s: ROM not loaded", operation));
365 }
366 try {
367 return accessor();
368 } catch (const std::exception& e) {
369 return absl::InternalError(absl::StrFormat(
370 "%s: %s", operation.empty() ? "ROM access failed" : operation,
371 e.what()));
372 }
373 }
374};
375
376} // namespace editor
377} // namespace yaze
378
379#endif // YAZE_APP_CORE_EDITOR_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
Manages project versioning (Git) and ROM artifact snapshots.
Interface for editor classes.
Definition editor.h:245
virtual void SetGameData(zelda3::GameData *game_data)
Definition editor.h:255
bool HasContext() const
Definition editor.h:333
virtual absl::Status BeginSaveTransaction()
Definition editor.h:272
virtual absl::Status Cut()=0
virtual absl::Status Copy()=0
virtual void ContributeStatus(StatusBar *)
Definition editor.h:309
virtual absl::Status Redo()=0
EditorContext context() const
Definition editor.h:332
UndoManager undo_manager_
Definition editor.h:339
virtual std::string GetRedoDescription() const
Definition editor.h:295
project::YazeProject * project() const
Definition editor.h:326
virtual void RollbackSaveTransaction()
Definition editor.h:273
const UndoManager & undo_manager() const
Definition editor.h:299
virtual void SetDependencies(const EditorDependencies &deps)
Definition editor.h:250
std::string MakeWindowId(const std::string &base_id) const
Definition editor.h:350
virtual void Initialize()=0
Rom * rom() const
Definition editor.h:324
zelda3::GameData * game_data() const
Definition editor.h:325
EditorDependencies dependencies_
Definition editor.h:338
virtual absl::Status Clear()
Definition editor.h:303
EditorType type() const
Definition editor.h:311
void set_active(bool active)
Definition editor.h:314
virtual ~Editor()=default
virtual void CommitSaveTransaction()
Definition editor.h:274
virtual std::string GetRomStatus() const
Definition editor.h:319
EditorType type_
Definition editor.h:337
virtual absl::Status Save()=0
virtual bool IsRomLoaded() const
Definition editor.h:318
std::string MakePanelTitle(const std::string &base_title) const
Definition editor.h:342
absl::StatusOr< T > SafeRomAccess(std::function< T()> accessor, const std::string &operation="") const
Definition editor.h:359
virtual absl::Status Find()=0
core::VersionManager * version_manager() const
Definition editor.h:327
virtual void PrepareForSessionTeardown()
Definition editor.h:279
virtual absl::Status Paste()=0
virtual absl::Status Load()=0
virtual absl::Status Update()=0
virtual absl::Status Undo()=0
virtual std::string GetUndoDescription() const
Definition editor.h:292
Instance-based runtime context replacing ContentRegistry::Context.
A session-aware status bar displayed at the bottom of the application.
Definition status_bar.h:57
Manages undo/redo stacks for a single editor.
std::string GetRedoDescription() const
Description of the action that would be redone (for UI)
std::string GetUndoDescription() const
Description of the action that would be undone (for UI)
Manages user preferences and settings persistence.
Central registry for all editor cards with session awareness and dependency injection.
A class for emulating and debugging SNES games.
Definition emulator.h:41
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
constexpr std::array< const char *, 14 > kEditorNames
Definition editor.h:226
size_t EditorTypeIndex(EditorType type)
Definition editor.h:235
constexpr size_t kEditorTypeCount
Definition editor.h:232
zelda3::GameData * game_data
Definition editor.h:138
EditorContext context() const
Definition editor.h:144
GlobalEditorContext * global_context
Definition editor.h:141
project::YazeProject * project
Definition editor.h:139
core::VersionManager * version_manager
Definition editor.h:140
Lightweight view into the essential runtime context (Rom + GameData)
Definition editor.h:72
bool HasGameData() const
Definition editor.h:79
zelda3::GameData * game_data
Definition editor.h:74
Unified dependency container for all editor types.
Definition editor.h:169
project::YazeProject * project
Definition editor.h:173
GlobalEditorContext * global_context
Definition editor.h:175
SharedClipboard * shared_clipboard
Definition editor.h:186
gfx::IRenderer * renderer
Definition editor.h:191
ShortcutManager * shortcut_manager
Definition editor.h:185
core::VersionManager * version_manager
Definition editor.h:174
zelda3::GameData * game_data
Definition editor.h:172
EditorContext context() const
Definition editor.h:205
CoreDependencies GetCoreDeps() const
Definition editor.h:196
UIDependencies GetUIDeps() const
Definition editor.h:200
WorkspaceWindowManager * window_manager
Definition editor.h:181
GfxGroupWorkspaceState * gfx_group_workspace
Definition editor.h:178
Per-ROM-session UI state shared by all GfxGroupEditor surfaces.
std::vector< int > overworld_tile16_ids
Definition editor.h:119
OverworldMapMetadataClipboard overworld_map_metadata
Definition editor.h:123
UndoManager * undo_manager
Definition editor.h:152
ToastManager * toast_manager
Definition editor.h:151
ShortcutManager * shortcut_manager
Definition editor.h:154
UserSettings * user_settings
Definition editor.h:156
WorkspaceWindowManager * window_manager
Definition editor.h:150
SharedClipboard * shared_clipboard
Definition editor.h:155
PopupManager * popup_manager
Definition editor.h:153
Modern project structure with comprehensive settings consolidation.
Definition project.h:172