yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
session_types.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_SESSION_TYPES_H_
2#define YAZE_APP_EDITOR_SESSION_TYPES_H_
3
4#include <array>
5#include <cstdint>
6#include <functional>
7#include <map>
8#include <memory>
9#include <optional>
10#include <string>
11#include <string_view>
12#include <unordered_map>
13#include <utility>
14#include <vector>
15
17#include "app/editor/editor.h"
19#include "core/asar_wrapper.h" // For AsarSymbol (backend-agnostic symbol shape)
20#include "core/features.h"
21#include "core/project.h"
22#include "rom/rom.h"
23#include "zelda3/game_data.h"
24
25namespace yaze::core {
26class AsarWrapper;
27class VersionManager;
28} // namespace yaze::core
29
30namespace yaze::zelda3 {
31class Overworld;
32}
33
34namespace yaze::editor {
35
36class EditorDependencies;
37class EditorRegistry;
38class UserSettings;
39
40// Forward declarations for legacy accessors
41class AssemblyEditor;
42class MemoryEditor;
43class DungeonEditorV2;
44class GraphicsEditor;
45class ScreenEditor;
46class MessageEditor;
47class MusicEditor;
48class OverworldEditor;
49class PaletteEditor;
50class SpriteEditor;
51class SettingsPanel;
52
57class EditorSet {
58 public:
59 explicit EditorSet(Rom* rom = nullptr, zelda3::GameData* game_data = nullptr,
60 UserSettings* user_settings = nullptr,
61 size_t session_id = 0,
62 EditorRegistry* editor_registry = nullptr);
64
65 void set_user_settings(UserSettings* settings);
66 void SetGameData(zelda3::GameData* game_data);
67
68 void ApplyDependencies(const EditorDependencies& dependencies);
69
70 // Give materialized editors one terminal detach pass while their external
71 // WorkspaceWindowManager panels are still alive.
73
74 size_t session_id() const { return session_id_; }
75
76 // Generic accessors
77 Editor* GetEditor(EditorType type) const;
78 // Returns an already-created editor without materializing a lazy editor.
79 Editor* GetExistingEditor(EditorType type) const { return FindEditor(type); }
80
81 template <typename T>
82 T* GetEditorAs(EditorType type) const {
83 return static_cast<T*>(GetEditor(type));
84 }
85
86 // Convenience helpers that avoid requiring concrete editor headers.
87 // Prefer these from higher-level systems (EditorManager, UI) to keep compile
88 // dependencies minimal.
89 void OpenAssemblyFolder(const std::string& folder_path) const;
90 void ChangeActiveAssemblyFile(std::string_view path) const;
92
93 // Backend-agnostic accessor for assembly symbols (works for both Asar
94 // and z3dk backends). Returns the assembly editor's last-known symbol
95 // table. Empty if no editor / no assemble has happened yet.
96 const std::map<std::string, core::AsarSymbol>& GetAssemblySymbols() const;
97 int LoadedDungeonRoomCount() const;
98 int TotalDungeonRoomCount() const;
99 std::vector<std::pair<uint32_t, uint32_t>> CollectDungeonWriteRanges() const;
100 bool HasPendingGraphicsChanges() const;
101 bool HasPendingScreenChanges() const;
102 // Reset cached Screen Editor models only when that lazy editor already
103 // exists. ROM replacement must not materialize an otherwise-unused editor.
106 absl::Status PrepareProjectSave();
108
109 // Deprecated named accessors (legacy compatibility)
110 [[deprecated("Use GetEditorAs<AssemblyEditor>(EditorType::kAssembly)")]]
112 [[deprecated("Use GetEditorAs<DungeonEditorV2>(EditorType::kDungeon)")]]
114 [[deprecated("Use GetEditorAs<GraphicsEditor>(EditorType::kGraphics)")]]
116 [[deprecated("Use GetEditorAs<MusicEditor>(EditorType::kMusic)")]]
118 [[deprecated("Use GetEditorAs<OverworldEditor>(EditorType::kOverworld)")]]
120 [[deprecated("Use GetEditorAs<PaletteEditor>(EditorType::kPalette)")]]
122 [[deprecated("Use GetEditorAs<ScreenEditor>(EditorType::kScreen)")]]
124 [[deprecated("Use GetEditorAs<SpriteEditor>(EditorType::kSprite)")]]
126 [[deprecated("Use GetEditorAs<SettingsPanel>(EditorType::kSettings)")]]
128 [[deprecated("Use GetEditorAs<MessageEditor>(EditorType::kMessage)")]]
130 [[deprecated("Use GetEditorAs<MemoryEditor>(EditorType::kHex)")]]
132
138 return gfx_group_workspace_.get();
139 }
140
141 std::vector<Editor*> active_editors_;
142
143 private:
144 using EditorFactory = std::function<std::unique_ptr<Editor>()>;
145
146 Editor* FindEditor(EditorType type) const;
148 bool ShouldTrackAsActiveEditor(EditorType type) const;
149 void TrackActiveEditor(Editor* editor);
150
151 size_t session_id_ = 0;
152 Rom* rom_ = nullptr;
156
157 std::optional<EditorDependencies> dependencies_;
158 mutable std::unordered_map<EditorType, std::unique_ptr<Editor>> editors_;
159 std::unordered_map<EditorType, EditorFactory> editor_factories_;
161
162 std::unique_ptr<GfxGroupWorkspaceState> gfx_group_workspace_;
163};
164
174 std::string custom_name; // User-defined session name
175 std::string filepath; // ROM filepath for duplicate detection
176 core::FeatureFlags::Flags feature_flags; // Per-session feature flags
177 // Full project/save policy snapshot for this ROM. An empty optional means
178 // the session has not yet been bound to a project context and must not save.
179 std::optional<project::YazeProject> project_context;
180 bool project_dirty = false;
181 // A restored backup is staged for inspection and must never be committed by
182 // the periodic autosave path. Explicit Save ROM / Save As clears this flag.
185 // VersionManager keeps a raw project pointer internally, so its lifetime
186 // must be tied to the stable, session-owned project_context above. Editors
187 // cache this pointer for their entire lifetime.
188 std::unique_ptr<core::VersionManager> version_manager;
189 bool game_data_loaded = false;
190 std::array<bool, kEditorTypeCount> editor_initialized{};
191 std::array<bool, kEditorTypeCount> editor_assets_loaded{};
192
193 RomSession() = default;
194 RomSession(UserSettings* user_settings, size_t session_id,
195 EditorRegistry* editor_registry = nullptr);
196 explicit RomSession(Rom&& r, UserSettings* user_settings = nullptr,
197 size_t session_id = 0,
198 EditorRegistry* editor_registry = nullptr);
199 ~RomSession();
200
201 size_t session_id() const { return editors.session_id(); }
202
203 // Get display name (custom name or ROM title)
204 std::string GetDisplayName() const;
205};
206
207} // namespace yaze::editor
208
209#endif // YAZE_APP_EDITOR_SESSION_TYPES_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
Modern C++ wrapper for Asar 65816 assembler integration.
Text editor for modifying assembly code.
DungeonEditorV2 - Simplified dungeon editor using component delegation.
Manages editor types, categories, and lifecycle.
Contains a complete set of editors for a single ROM instance.
std::optional< EditorDependencies > dependencies_
MemoryEditor * GetMemoryEditor() const
T * GetEditorAs(EditorType type) const
std::unordered_map< EditorType, std::unique_ptr< Editor > > editors_
DungeonEditorV2 * GetDungeonEditor() const
void OpenAssemblyFolder(const std::string &folder_path) const
MusicEditor * GetMusicEditor() const
ScreenEditor * GetScreenEditor() const
void SetGameData(zelda3::GameData *game_data)
bool HasPendingProjectDraftChanges() const
Editor * GetExistingEditor(EditorType type) const
bool ShouldTrackAsActiveEditor(EditorType type) const
core::AsarWrapper * GetAsarWrapper() const
std::unique_ptr< GfxGroupWorkspaceState > gfx_group_workspace_
absl::Status PrepareProjectSave()
void TrackActiveEditor(Editor *editor)
void ChangeActiveAssemblyFile(std::string_view path) const
size_t session_id() const
void ApplyDependencies(const EditorDependencies &dependencies)
const std::map< std::string, core::AsarSymbol > & GetAssemblySymbols() const
EditorSet(Rom *rom=nullptr, zelda3::GameData *game_data=nullptr, UserSettings *user_settings=nullptr, size_t session_id=0, EditorRegistry *editor_registry=nullptr)
Editor * EnsureEditorCreated(EditorType type) const
SpriteEditor * GetSpriteEditor() const
UserSettings * user_settings_
Editor * GetEditor(EditorType type) const
GraphicsEditor * GetGraphicsEditor() const
int LoadedDungeonRoomCount() const
Editor * FindEditor(EditorType type) const
PaletteEditor * GetPaletteEditor() const
bool HasPendingGraphicsChanges() const
bool HasPendingScreenChanges() const
std::unordered_map< EditorType, EditorFactory > editor_factories_
const GfxGroupWorkspaceState * gfx_group_workspace() const
EditorRegistry * editor_registry_
void set_user_settings(UserSettings *settings)
zelda3::Overworld * GetOverworldData() const
GfxGroupWorkspaceState * gfx_group_workspace()
MessageEditor * GetMessageEditor() const
std::function< std::unique_ptr< Editor >()> EditorFactory
int TotalDungeonRoomCount() const
SettingsPanel * GetSettingsPanel() const
std::vector< Editor * > active_editors_
zelda3::GameData * game_data_
OverworldEditor * GetOverworldEditor() const
AssemblyEditor * GetAssemblyEditor() const
std::vector< std::pair< uint32_t, uint32_t > > CollectDungeonWriteRanges() const
Interface for editor classes.
Definition editor.h:245
Allows the user to edit graphics sheets from the game or view prototype graphics.
A class for editing music data in a Rom.
Main UI class for editing overworld maps in A Link to the Past.
Allows the user to view and edit in game palettes.
The ScreenEditor class allows the user to edit a variety of screens in the game or create a custom me...
Manages the settings UI displayed in the right sidebar.
Allows the user to edit sprites.
Manages user preferences and settings persistence.
Represents the full Overworld data, light and dark world.
Definition overworld.h:389
Editors are the view controllers for the application.
Zelda 3 specific classes and functions.
Unified dependency container for all editor types.
Definition editor.h:169
Per-ROM-session UI state shared by all GfxGroupEditor surfaces.
Represents a single session, containing a ROM and its associated editors.
core::FeatureFlags::Flags feature_flags
ProjectFileEditorState project_file_editor_state
std::array< bool, kEditorTypeCount > editor_initialized
zelda3::GameData game_data
std::unique_ptr< core::VersionManager > version_manager
std::array< bool, kEditorTypeCount > editor_assets_loaded
std::string GetDisplayName() const
std::optional< project::YazeProject > project_context