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 // Update the editor state, ran every frame.
277 virtual absl::Status Update() = 0;
278
279 virtual absl::Status Cut() = 0;
280 virtual absl::Status Copy() = 0;
281 virtual absl::Status Paste() = 0;
282
283 virtual absl::Status Undo() = 0;
284 virtual absl::Status Redo() = 0;
285
286 // Undo description for toast feedback (queries editor's UndoManager)
287 virtual std::string GetUndoDescription() const {
289 }
290 virtual std::string GetRedoDescription() const {
292 }
293
294 const UndoManager& undo_manager() const { return undo_manager_; }
295
296 virtual absl::Status Find() = 0;
297
298 virtual absl::Status Clear() { return absl::OkStatus(); }
299
300 // Push editor-specific context into the shared status bar.
301 // Called each frame on the currently active editor by EditorManager.
302 // Default no-op; override to surface cursor/selection/zoom/mode/custom
303 // segments via StatusBar's Set* setters.
304 virtual void ContributeStatus(StatusBar* /*status_bar*/) {}
305
306 EditorType type() const { return type_; }
307
308 bool* active() { return &active_; }
309 void set_active(bool active) { active_ = active; }
311
312 // ROM loading state helpers (default implementations)
313 virtual bool IsRomLoaded() const { return false; }
314 virtual std::string GetRomStatus() const {
315 return "ROM state not implemented";
316 }
317
318 // Accessors for common dependencies
319 Rom* rom() const { return dependencies_.rom; }
325
326 // Get bundled context for sub-components
328 bool HasContext() const { return dependencies_.HasContext(); }
329
330 protected:
331 bool active_ = false;
335
336 // Helper method to create session-aware card titles for multi-session support
337 std::string MakePanelTitle(const std::string& base_title) const {
338 if (dependencies_.session_id > 0) {
339 return absl::StrFormat("%s [S%zu]", base_title, dependencies_.session_id);
340 }
341 return base_title;
342 }
343
344 // Helper method to create session-aware card IDs for multi-session support
345 std::string MakeWindowId(const std::string& base_id) const {
346 if (dependencies_.session_id > 0) {
347 return absl::StrFormat("s%zu.%s", dependencies_.session_id, base_id);
348 }
349 return base_id;
350 }
351
352 // Helper method for ROM access with safety check
353 template <typename T>
354 absl::StatusOr<T> SafeRomAccess(std::function<T()> accessor,
355 const std::string& operation = "") const {
356 if (!IsRomLoaded()) {
357 return absl::FailedPreconditionError(
358 operation.empty() ? "ROM not loaded"
359 : absl::StrFormat("%s: ROM not loaded", operation));
360 }
361 try {
362 return accessor();
363 } catch (const std::exception& e) {
364 return absl::InternalError(absl::StrFormat(
365 "%s: %s", operation.empty() ? "ROM access failed" : operation,
366 e.what()));
367 }
368 }
369};
370
371} // namespace editor
372} // namespace yaze
373
374#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:328
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:304
virtual absl::Status Redo()=0
EditorContext context() const
Definition editor.h:327
UndoManager undo_manager_
Definition editor.h:334
virtual std::string GetRedoDescription() const
Definition editor.h:290
project::YazeProject * project() const
Definition editor.h:321
virtual void RollbackSaveTransaction()
Definition editor.h:273
const UndoManager & undo_manager() const
Definition editor.h:294
virtual void SetDependencies(const EditorDependencies &deps)
Definition editor.h:250
std::string MakeWindowId(const std::string &base_id) const
Definition editor.h:345
virtual void Initialize()=0
Rom * rom() const
Definition editor.h:319
zelda3::GameData * game_data() const
Definition editor.h:320
EditorDependencies dependencies_
Definition editor.h:333
virtual absl::Status Clear()
Definition editor.h:298
EditorType type() const
Definition editor.h:306
void set_active(bool active)
Definition editor.h:309
virtual ~Editor()=default
virtual void CommitSaveTransaction()
Definition editor.h:274
virtual std::string GetRomStatus() const
Definition editor.h:314
EditorType type_
Definition editor.h:332
virtual absl::Status Save()=0
virtual bool IsRomLoaded() const
Definition editor.h:313
std::string MakePanelTitle(const std::string &base_title) const
Definition editor.h:337
absl::StatusOr< T > SafeRomAccess(std::function< T()> accessor, const std::string &operation="") const
Definition editor.h:354
virtual absl::Status Find()=0
core::VersionManager * version_manager() const
Definition editor.h:322
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:287
Instance-based runtime context replacing ContentRegistry::Context.
A session-aware status bar displayed at the bottom of the application.
Definition status_bar.h:54
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