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 // Resolve the descriptor that normal Project Save actually writes. Editors
196 // with detached assets must not mutate only the session's captured snapshot.
198
199 // Extract sub-structs for passing to components that only need a subset.
208
209 EditorContext context() const { return {rom, game_data}; }
210 bool HasContext() const { return rom != nullptr && game_data != nullptr; }
211};
212
213enum class EditorType {
214 kUnknown,
215 kAssembly,
216 kDungeon,
217 kEmulator,
218 kGraphics,
219 kMusic,
221 kPalette,
222 kScreen,
223 kSprite,
224 kMessage,
225 kHex,
226 kAgent,
227 kSettings,
228 // Values are persisted (recent editors, "switch.<n>" shortcuts): append only.
229 kPlanning,
230};
231
232constexpr std::array<const char*, 15> kEditorNames = {
233 "Unknown", "Assembly", "Dungeon", "Emulator", "Graphics",
234 "Music", "Overworld", "Palette", "Screen", "Sprite",
235 "Message", "Hex", "Agent", "Settings", "Planning",
236};
237
239constexpr size_t kEditorTypeCount = static_cast<size_t>(kLastEditorType) + 1;
240static_assert(kEditorNames.size() == kEditorTypeCount);
241
242inline size_t EditorTypeIndex(EditorType type) {
243 return static_cast<size_t>(type);
244}
245
252class Editor {
253 public:
254 Editor() = default;
255 virtual ~Editor() = default;
256
257 virtual void SetDependencies(const EditorDependencies& deps) {
258 dependencies_ = deps;
259 }
260
261 // Set GameData for Zelda3-specific data access
265
266 // Initialization of the editor, no ROM assets.
267 virtual void Initialize() = 0;
268
269 // Initialization of ROM assets.
270 virtual absl::Status Load() = 0;
271
272 // Save the editor state.
273 virtual absl::Status Save() = 0;
274
275 // Coordinated-save lifecycle. Editors that clear model-level dirty state
276 // during Save() can override these hooks to checkpoint and restore it when a
277 // later serializer, validation gate, backup, or disk write fails. Default
278 // implementations keep existing editors source-compatible.
279 virtual absl::Status BeginSaveTransaction() { return absl::OkStatus(); }
280 virtual void RollbackSaveTransaction() {}
281 virtual void CommitSaveTransaction() {}
282
283 // Release callbacks and raw references to session-owned workspace panels
284 // before WorkspaceWindowManager destroys those panels. Session teardown is
285 // terminal, and implementations must tolerate repeated calls.
287
288 // Update the editor state, ran every frame.
289 virtual absl::Status Update() = 0;
290
291 virtual absl::Status Cut() = 0;
292 virtual absl::Status Copy() = 0;
293 virtual absl::Status Paste() = 0;
294
295 virtual absl::Status Undo() = 0;
296 virtual absl::Status Redo() = 0;
297
298 // Undo description for toast feedback (queries editor's UndoManager)
299 virtual std::string GetUndoDescription() const {
301 }
302 virtual std::string GetRedoDescription() const {
304 }
305
306 const UndoManager& undo_manager() const { return undo_manager_; }
307
308 virtual absl::Status Find() = 0;
309
310 virtual absl::Status Clear() { return absl::OkStatus(); }
311
312 // Edit-menu availability. The menu bar uses these to enable or disable
313 // Undo/Redo/Cut/Copy/Paste/Find for the active editor, so an action that
314 // cannot run is greyed out instead of producing a failure toast.
315 //
316 // Undo/Redo default to the base UndoManager state; editors that keep undo
317 // history elsewhere (text widgets, PaletteManager, pending gestures) must
318 // override. Clipboard defaults to true so editors with real clipboard
319 // support keep working without an override; editors whose clipboard calls
320 // are no-ops should return false. Find defaults to false because almost no
321 // editor implements it.
322 virtual bool CanUndo() const { return undo_manager_.CanUndo(); }
323 virtual bool CanRedo() const { return undo_manager_.CanRedo(); }
324 virtual bool CanCut() const { return true; }
325 virtual bool CanCopy() const { return true; }
326 virtual bool CanPaste() const { return true; }
327 virtual bool CanFind() const { return false; }
328
329 // Push editor-specific context into the shared status bar.
330 // Called each frame on the currently active editor by EditorManager.
331 // Default no-op; override to surface cursor/selection/zoom/mode/custom
332 // segments via StatusBar's Set* setters.
333 virtual void ContributeStatus(StatusBar* /*status_bar*/) {}
334
335 // Push editor-specific top menu items into the main menu bar.
336 // Called when this editor is active. Runs inside an open BeginMenu scope.
337 virtual void DrawEditorMenu() {}
338
339 // Push editor-specific items into the main Edit menu, after the shared
340 // items. Called when this editor is active, inside the open Edit menu.
341 // Draw a leading separator when adding anything.
342 virtual void DrawEditMenuItems() {}
343
345 EditorContextSnapshot snapshot;
346 const size_t index = EditorTypeIndex(type_);
347 if (index < kEditorNames.size()) {
348 snapshot.category = kEditorNames[index];
349 snapshot.title = snapshot.category;
350 snapshot.semantic_owner = snapshot.category;
351 }
352 return snapshot;
353 }
354
355 EditorType type() const { return type_; }
356
357 bool* active() { return &active_; }
358 void set_active(bool active) { active_ = active; }
360
361 // ROM loading state helpers (default implementations)
362 virtual bool IsRomLoaded() const { return false; }
363 virtual std::string GetRomStatus() const {
364 return "ROM state not implemented";
365 }
366
367 // Accessors for common dependencies
368 Rom* rom() const { return dependencies_.rom; }
374
375 // Get bundled context for sub-components
377 bool HasContext() const { return dependencies_.HasContext(); }
378
379 protected:
380 bool active_ = false;
384
385 // Helper method to create session-aware card titles for multi-session support
386 std::string MakePanelTitle(const std::string& base_title) const {
387 if (dependencies_.session_id > 0) {
388 return absl::StrFormat("%s [S%zu]", base_title, dependencies_.session_id);
389 }
390 return base_title;
391 }
392
393 // Helper method to create session-aware card IDs for multi-session support
394 std::string MakeWindowId(const std::string& base_id) const {
395 if (dependencies_.session_id > 0) {
396 return absl::StrFormat("s%zu.%s", dependencies_.session_id, base_id);
397 }
398 return base_id;
399 }
400
401 // Helper method for ROM access with safety check
402 template <typename T>
403 absl::StatusOr<T> SafeRomAccess(std::function<T()> accessor,
404 const std::string& operation = "") const {
405 if (!IsRomLoaded()) {
406 return absl::FailedPreconditionError(
407 operation.empty() ? "ROM not loaded"
408 : absl::StrFormat("%s: ROM not loaded", operation));
409 }
410 try {
411 return accessor();
412 } catch (const std::exception& e) {
413 return absl::InternalError(absl::StrFormat(
414 "%s: %s", operation.empty() ? "ROM access failed" : operation,
415 e.what()));
416 }
417 }
418};
419
420} // namespace editor
421} // namespace yaze
422
423#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:52
Manages project versioning (Git) and ROM artifact snapshots.
Interface for editor classes.
Definition editor.h:252
virtual void SetGameData(zelda3::GameData *game_data)
Definition editor.h:262
bool HasContext() const
Definition editor.h:377
virtual absl::Status BeginSaveTransaction()
Definition editor.h:279
virtual absl::Status Cut()=0
virtual absl::Status Copy()=0
virtual void ContributeStatus(StatusBar *)
Definition editor.h:333
virtual absl::Status Redo()=0
EditorContext context() const
Definition editor.h:376
UndoManager undo_manager_
Definition editor.h:383
virtual void DrawEditMenuItems()
Definition editor.h:342
virtual std::string GetRedoDescription() const
Definition editor.h:302
project::YazeProject * project() const
Definition editor.h:370
virtual void RollbackSaveTransaction()
Definition editor.h:280
const UndoManager & undo_manager() const
Definition editor.h:306
virtual void SetDependencies(const EditorDependencies &deps)
Definition editor.h:257
std::string MakeWindowId(const std::string &base_id) const
Definition editor.h:394
virtual void Initialize()=0
virtual bool CanFind() const
Definition editor.h:327
Rom * rom() const
Definition editor.h:368
zelda3::GameData * game_data() const
Definition editor.h:369
EditorDependencies dependencies_
Definition editor.h:382
virtual absl::Status Clear()
Definition editor.h:310
EditorType type() const
Definition editor.h:355
void set_active(bool active)
Definition editor.h:358
virtual ~Editor()=default
virtual void CommitSaveTransaction()
Definition editor.h:281
virtual EditorContextSnapshot BuildContextSnapshot() const
Definition editor.h:344
virtual std::string GetRomStatus() const
Definition editor.h:363
EditorType type_
Definition editor.h:381
virtual absl::Status Save()=0
virtual bool CanRedo() const
Definition editor.h:323
virtual bool IsRomLoaded() const
Definition editor.h:362
virtual void DrawEditorMenu()
Definition editor.h:337
std::string MakePanelTitle(const std::string &base_title) const
Definition editor.h:386
absl::StatusOr< T > SafeRomAccess(std::function< T()> accessor, const std::string &operation="") const
Definition editor.h:403
virtual bool CanCut() const
Definition editor.h:324
virtual absl::Status Find()=0
virtual bool CanUndo() const
Definition editor.h:322
virtual bool CanPaste() const
Definition editor.h:326
core::VersionManager * version_manager() const
Definition editor.h:371
virtual void PrepareForSessionTeardown()
Definition editor.h:286
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:325
virtual std::string GetUndoDescription() const
Definition editor.h:299
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:232
size_t EditorTypeIndex(EditorType type)
Definition editor.h:242
constexpr EditorType kLastEditorType
Definition editor.h:238
constexpr size_t kEditorTypeCount
Definition editor.h:239
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
std::function< project::YazeProject *()> project_context_provider
Definition editor.h:197
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:209
CoreDependencies GetCoreDeps() const
Definition editor.h:200
UIDependencies GetUIDeps() const
Definition editor.h:204
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:290