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"
17
18// Forward declaration in yaze::core namespace
19namespace yaze {
20namespace core {
21class VersionManager;
22}
23} // namespace yaze
24
25namespace yaze {
26
27// Forward declarations
28class Rom;
29namespace gfx {
30class IRenderer;
31}
32namespace emu {
33class Emulator;
34}
35namespace project {
36struct YazeProject;
37} // namespace project
38namespace zelda3 {
39struct GameData;
40} // namespace zelda3
41
46namespace editor {
47
48// Forward declarations
49struct GfxGroupWorkspaceState;
50class GlobalEditorContext;
51class WorkspaceWindowManager;
52class ToastManager;
53class UserSettings;
54class StatusBar;
55
74 Rom* rom = nullptr;
76
77 // Check if context is valid for operations
78 bool IsValid() const { return rom != nullptr && game_data != nullptr; }
79 bool HasRom() const { return rom != nullptr; }
80 bool HasGameData() const { return game_data != nullptr; }
81
82 // Implicit conversion to bool for quick validity checks
83 explicit operator bool() const { return IsValid(); }
84};
85
117// Shared clipboard for cross-editor copy/paste operations.
135
136// Data-layer dependencies: ROM, game data, project, session identity.
138 Rom* rom = nullptr;
143 size_t session_id = 0;
144
145 EditorContext context() const { return {rom, game_data}; }
146 bool HasContext() const { return rom != nullptr && game_data != nullptr; }
147};
148
149// UI-layer dependencies: panel/popup/toast/shortcut managers.
160
171 // --- Core (data-layer) dependencies ---
172 Rom* rom = nullptr;
177 size_t session_id = 0;
180
181 // --- UI-layer dependencies ---
190
191 // --- Specialized dependencies ---
194 void* custom_data = nullptr;
195
196 // Extract sub-structs for passing to components that only need a subset.
205
206 EditorContext context() const { return {rom, game_data}; }
207 bool HasContext() const { return rom != nullptr && game_data != nullptr; }
208};
209
210enum class EditorType {
211 kUnknown,
212 kAssembly,
213 kDungeon,
214 kEmulator,
215 kGraphics,
216 kMusic,
218 kPalette,
219 kScreen,
220 kSprite,
221 kMessage,
222 kHex,
223 kAgent,
224 kSettings,
225 // Values are persisted (recent editors, "switch.<n>" shortcuts): append only.
226 kPlanning,
227};
228
229constexpr std::array<const char*, 15> kEditorNames = {
230 "Unknown", "Assembly", "Dungeon", "Emulator", "Graphics",
231 "Music", "Overworld", "Palette", "Screen", "Sprite",
232 "Message", "Hex", "Agent", "Settings", "Planning",
233};
234
236constexpr size_t kEditorTypeCount = static_cast<size_t>(kLastEditorType) + 1;
237static_assert(kEditorNames.size() == kEditorTypeCount);
238
239inline size_t EditorTypeIndex(EditorType type) {
240 return static_cast<size_t>(type);
241}
242
249class Editor {
250 public:
251 Editor() = default;
252 virtual ~Editor() = default;
253
254 virtual void SetDependencies(const EditorDependencies& deps) {
255 dependencies_ = deps;
256 }
257
258 // Set GameData for Zelda3-specific data access
262
263 // Initialization of the editor, no ROM assets.
264 virtual void Initialize() = 0;
265
266 // Initialization of ROM assets.
267 virtual absl::Status Load() = 0;
268
269 // Save the editor state.
270 virtual absl::Status Save() = 0;
271
272 // Coordinated-save lifecycle. Editors that clear model-level dirty state
273 // during Save() can override these hooks to checkpoint and restore it when a
274 // later serializer, validation gate, backup, or disk write fails. Default
275 // implementations keep existing editors source-compatible.
276 virtual absl::Status BeginSaveTransaction() { return absl::OkStatus(); }
277 virtual void RollbackSaveTransaction() {}
278 virtual void CommitSaveTransaction() {}
279
280 // Release callbacks and raw references to session-owned workspace panels
281 // before WorkspaceWindowManager destroys those panels. Session teardown is
282 // terminal, and implementations must tolerate repeated calls.
284
285 // Update the editor state, ran every frame.
286 virtual absl::Status Update() = 0;
287
288 virtual absl::Status Cut() = 0;
289 virtual absl::Status Copy() = 0;
290 virtual absl::Status Paste() = 0;
291
292 virtual absl::Status Undo() = 0;
293 virtual absl::Status Redo() = 0;
294
295 // Undo description for toast feedback (queries editor's UndoManager)
296 virtual std::string GetUndoDescription() const {
298 }
299 virtual std::string GetRedoDescription() const {
301 }
302
303 const UndoManager& undo_manager() const { return undo_manager_; }
304
305 virtual absl::Status Find() = 0;
306
307 virtual absl::Status Clear() { return absl::OkStatus(); }
308
309 // Edit-menu availability. The menu bar uses these to enable or disable
310 // Undo/Redo/Cut/Copy/Paste/Find for the active editor, so an action that
311 // cannot run is greyed out instead of producing a failure toast.
312 //
313 // Undo/Redo default to the base UndoManager state; editors that keep undo
314 // history elsewhere (text widgets, PaletteManager, pending gestures) must
315 // override. Clipboard defaults to true so editors with real clipboard
316 // support keep working without an override; editors whose clipboard calls
317 // are no-ops should return false. Find defaults to false because almost no
318 // editor implements it.
319 virtual bool CanUndo() const { return undo_manager_.CanUndo(); }
320 virtual bool CanRedo() const { return undo_manager_.CanRedo(); }
321 virtual bool CanCut() const { return true; }
322 virtual bool CanCopy() const { return true; }
323 virtual bool CanPaste() const { return true; }
324 virtual bool CanFind() const { return false; }
325
326 // Push editor-specific context into the shared status bar.
327 // Called each frame on the currently active editor by EditorManager.
328 // Default no-op; override to surface cursor/selection/zoom/mode/custom
329 // segments via StatusBar's Set* setters.
330 virtual void ContributeStatus(StatusBar* /*status_bar*/) {}
331
333 EditorContextSnapshot snapshot;
334 const size_t index = EditorTypeIndex(type_);
335 if (index < kEditorNames.size()) {
336 snapshot.category = kEditorNames[index];
337 snapshot.title = snapshot.category;
338 snapshot.semantic_owner = snapshot.category;
339 }
340 return snapshot;
341 }
342
343 EditorType type() const { return type_; }
344
345 bool* active() { return &active_; }
346 void set_active(bool active) { active_ = active; }
348
349 // ROM loading state helpers (default implementations)
350 virtual bool IsRomLoaded() const { return false; }
351 virtual std::string GetRomStatus() const {
352 return "ROM state not implemented";
353 }
354
355 // Accessors for common dependencies
356 Rom* rom() const { return dependencies_.rom; }
362
363 // Get bundled context for sub-components
365 bool HasContext() const { return dependencies_.HasContext(); }
366
367 protected:
368 bool active_ = false;
372
373 // Helper method to create session-aware card titles for multi-session support
374 std::string MakePanelTitle(const std::string& base_title) const {
375 if (dependencies_.session_id > 0) {
376 return absl::StrFormat("%s [S%zu]", base_title, dependencies_.session_id);
377 }
378 return base_title;
379 }
380
381 // Helper method to create session-aware card IDs for multi-session support
382 std::string MakeWindowId(const std::string& base_id) const {
383 if (dependencies_.session_id > 0) {
384 return absl::StrFormat("s%zu.%s", dependencies_.session_id, base_id);
385 }
386 return base_id;
387 }
388
389 // Helper method for ROM access with safety check
390 template <typename T>
391 absl::StatusOr<T> SafeRomAccess(std::function<T()> accessor,
392 const std::string& operation = "") const {
393 if (!IsRomLoaded()) {
394 return absl::FailedPreconditionError(
395 operation.empty() ? "ROM not loaded"
396 : absl::StrFormat("%s: ROM not loaded", operation));
397 }
398 try {
399 return accessor();
400 } catch (const std::exception& e) {
401 return absl::InternalError(absl::StrFormat(
402 "%s: %s", operation.empty() ? "ROM access failed" : operation,
403 e.what()));
404 }
405 }
406};
407
408} // namespace editor
409} // namespace yaze
410
411#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:49
Manages project versioning (Git) and ROM artifact snapshots.
Interface for editor classes.
Definition editor.h:249
virtual void SetGameData(zelda3::GameData *game_data)
Definition editor.h:259
bool HasContext() const
Definition editor.h:365
virtual absl::Status BeginSaveTransaction()
Definition editor.h:276
virtual absl::Status Cut()=0
virtual absl::Status Copy()=0
virtual void ContributeStatus(StatusBar *)
Definition editor.h:330
virtual absl::Status Redo()=0
EditorContext context() const
Definition editor.h:364
UndoManager undo_manager_
Definition editor.h:371
virtual std::string GetRedoDescription() const
Definition editor.h:299
project::YazeProject * project() const
Definition editor.h:358
virtual void RollbackSaveTransaction()
Definition editor.h:277
const UndoManager & undo_manager() const
Definition editor.h:303
virtual void SetDependencies(const EditorDependencies &deps)
Definition editor.h:254
std::string MakeWindowId(const std::string &base_id) const
Definition editor.h:382
virtual void Initialize()=0
virtual bool CanFind() const
Definition editor.h:324
Rom * rom() const
Definition editor.h:356
zelda3::GameData * game_data() const
Definition editor.h:357
EditorDependencies dependencies_
Definition editor.h:370
virtual absl::Status Clear()
Definition editor.h:307
EditorType type() const
Definition editor.h:343
void set_active(bool active)
Definition editor.h:346
virtual ~Editor()=default
virtual void CommitSaveTransaction()
Definition editor.h:278
virtual EditorContextSnapshot BuildContextSnapshot() const
Definition editor.h:332
virtual std::string GetRomStatus() const
Definition editor.h:351
EditorType type_
Definition editor.h:369
virtual absl::Status Save()=0
virtual bool CanRedo() const
Definition editor.h:320
virtual bool IsRomLoaded() const
Definition editor.h:350
std::string MakePanelTitle(const std::string &base_title) const
Definition editor.h:374
absl::StatusOr< T > SafeRomAccess(std::function< T()> accessor, const std::string &operation="") const
Definition editor.h:391
virtual bool CanCut() const
Definition editor.h:321
virtual absl::Status Find()=0
virtual bool CanUndo() const
Definition editor.h:319
virtual bool CanPaste() const
Definition editor.h:323
core::VersionManager * version_manager() const
Definition editor.h:359
virtual void PrepareForSessionTeardown()
Definition editor.h:283
virtual absl::Status Paste()=0
virtual absl::Status Load()=0
virtual absl::Status Update()=0
virtual absl::Status Undo()=0
virtual bool CanCopy() const
Definition editor.h:322
virtual std::string GetUndoDescription() const
Definition editor.h:296
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 *, 15 > kEditorNames
Definition editor.h:229
size_t EditorTypeIndex(EditorType type)
Definition editor.h:239
constexpr EditorType kLastEditorType
Definition editor.h:235
constexpr size_t kEditorTypeCount
Definition editor.h:236
zelda3::GameData * game_data
Definition editor.h:139
EditorContext context() const
Definition editor.h:145
GlobalEditorContext * global_context
Definition editor.h:142
project::YazeProject * project
Definition editor.h:140
core::VersionManager * version_manager
Definition editor.h:141
Lightweight view into the essential runtime context (Rom + GameData)
Definition editor.h:73
bool HasGameData() const
Definition editor.h:80
zelda3::GameData * game_data
Definition editor.h:75
Unified dependency container for all editor types.
Definition editor.h:170
project::YazeProject * project
Definition editor.h:174
GlobalEditorContext * global_context
Definition editor.h:176
SharedClipboard * shared_clipboard
Definition editor.h:187
gfx::IRenderer * renderer
Definition editor.h:192
ShortcutManager * shortcut_manager
Definition editor.h:186
core::VersionManager * version_manager
Definition editor.h:175
zelda3::GameData * game_data
Definition editor.h:173
EditorContext context() const
Definition editor.h:206
CoreDependencies GetCoreDeps() const
Definition editor.h:197
UIDependencies GetUIDeps() const
Definition editor.h:201
WorkspaceWindowManager * window_manager
Definition editor.h:182
GfxGroupWorkspaceState * gfx_group_workspace
Definition editor.h:179
Per-ROM-session UI state shared by all GfxGroupEditor surfaces.
std::vector< int > overworld_tile16_ids
Definition editor.h:120
OverworldMapMetadataClipboard overworld_map_metadata
Definition editor.h:124
UndoManager * undo_manager
Definition editor.h:153
ToastManager * toast_manager
Definition editor.h:152
ShortcutManager * shortcut_manager
Definition editor.h:155
UserSettings * user_settings
Definition editor.h:157
WorkspaceWindowManager * window_manager
Definition editor.h:151
SharedClipboard * shared_clipboard
Definition editor.h:156
PopupManager * popup_manager
Definition editor.h:154
Modern project structure with comprehensive settings consolidation.
Definition project.h:287