diff --git a/src/app/editor/code/assembly_editor.cc b/src/app/editor/code/assembly_editor.cc index 49f9473f..199850d3 100644 --- a/src/app/editor/code/assembly_editor.cc +++ b/src/app/editor/code/assembly_editor.cc @@ -101,6 +101,10 @@ void AssemblyEditor::Initialize() { // Set the language definition } +absl::Status AssemblyEditor::Load() { + return absl::OkStatus(); +} + void AssemblyEditor::OpenFolder(const std::string& folder_path) { current_folder_ = LoadFolder(folder_path); } diff --git a/src/app/editor/code/assembly_editor.h b/src/app/editor/code/assembly_editor.h index 85e3730d..88486af7 100644 --- a/src/app/editor/code/assembly_editor.h +++ b/src/app/editor/code/assembly_editor.h @@ -34,6 +34,7 @@ class AssemblyEditor : public Editor { } void Initialize() override; + absl::Status Load() override; void Update(bool &is_loaded); void InlineUpdate(); diff --git a/src/app/editor/dungeon/dungeon_editor.cc b/src/app/editor/dungeon/dungeon_editor.cc index 0be2d836..b245d5c4 100644 --- a/src/app/editor/dungeon/dungeon_editor.cc +++ b/src/app/editor/dungeon/dungeon_editor.cc @@ -41,6 +41,10 @@ constexpr ImGuiTableFlags kDungeonObjectTableFlags = ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; +absl::Status DungeonEditor::Load() { + return absl::OkStatus(); +} + absl::Status DungeonEditor::Update() { if (!is_loaded_ && rom()->is_loaded()) { Initialize(); diff --git a/src/app/editor/dungeon/dungeon_editor.h b/src/app/editor/dungeon/dungeon_editor.h index 60c8084d..93fbc1c7 100644 --- a/src/app/editor/dungeon/dungeon_editor.h +++ b/src/app/editor/dungeon/dungeon_editor.h @@ -43,6 +43,7 @@ class DungeonEditor : public Editor, public SharedRom { DungeonEditor() { type_ = EditorType::kDungeon; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } diff --git a/src/app/editor/editor.h b/src/app/editor/editor.h index 3e4375c8..94577f61 100644 --- a/src/app/editor/editor.h +++ b/src/app/editor/editor.h @@ -53,8 +53,15 @@ class Editor { Editor() = default; virtual ~Editor() = default; + // Initialization of the editor, no ROM assets. virtual void Initialize() = 0; + // Initialization of ROM assets. + virtual absl::Status Load() = 0; + + // Update the editor state, ran every frame. + virtual absl::Status Update() = 0; + virtual absl::Status Cut() = 0; virtual absl::Status Copy() = 0; virtual absl::Status Paste() = 0; @@ -62,8 +69,6 @@ class Editor { virtual absl::Status Undo() = 0; virtual absl::Status Redo() = 0; - virtual absl::Status Update() = 0; - virtual absl::Status Find() = 0; EditorType type() const { return type_; } diff --git a/src/app/editor/editor_manager.cc b/src/app/editor/editor_manager.cc index 204f8ffc..b21e1f3d 100644 --- a/src/app/editor/editor_manager.cc +++ b/src/app/editor/editor_manager.cc @@ -450,7 +450,8 @@ void EditorManager::DrawHomepage() { } Separator(); - settings_editor_.Update(); + auto settings = settings_editor_.Update(); + if (!settings.ok()) status_ = settings; } void EditorManager::DrawMenuBar() { diff --git a/src/app/editor/graphics/graphics_editor.cc b/src/app/editor/graphics/graphics_editor.cc index bf55f674..91d23e49 100644 --- a/src/app/editor/graphics/graphics_editor.cc +++ b/src/app/editor/graphics/graphics_editor.cc @@ -42,6 +42,11 @@ constexpr ImGuiTableFlags kGfxEditTableFlags = void GraphicsEditor::Initialize() {} +absl::Status GraphicsEditor::Load() { + + return absl::OkStatus(); +} + absl::Status GraphicsEditor::Update() { if (ImGui::BeginTabBar("##TabBar")) { status_ = UpdateGfxEdit(); diff --git a/src/app/editor/graphics/graphics_editor.h b/src/app/editor/graphics/graphics_editor.h index a8b1f14a..705d67b4 100644 --- a/src/app/editor/graphics/graphics_editor.h +++ b/src/app/editor/graphics/graphics_editor.h @@ -59,6 +59,7 @@ class GraphicsEditor : public SharedRom, public Editor { GraphicsEditor() { type_ = EditorType::kGraphics; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } diff --git a/src/app/editor/graphics/palette_editor.cc b/src/app/editor/graphics/palette_editor.cc index 27889685..211dc2a1 100644 --- a/src/app/editor/graphics/palette_editor.cc +++ b/src/app/editor/graphics/palette_editor.cc @@ -172,7 +172,7 @@ absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded) { void PaletteEditor::Initialize() {} -absl::Status PaletteEditor::Update() { +absl::Status PaletteEditor::Load() { if (rom()->is_loaded()) { // Initialize the labels for (int i = 0; i < kNumPalettes; i++) { @@ -183,7 +183,10 @@ absl::Status PaletteEditor::Update() { } else { return absl::NotFoundError("ROM not open, no palettes to display"); } + return absl::OkStatus(); +} +absl::Status PaletteEditor::Update() { if (BeginTable("paletteEditorTable", 2, kPaletteTableFlags, ImVec2(0, 0))) { TableSetupColumn("Palette Groups", ImGuiTableColumnFlags_WidthStretch, GetContentRegionAvail().x); diff --git a/src/app/editor/graphics/palette_editor.h b/src/app/editor/graphics/palette_editor.h index d238abc5..4ff5264e 100644 --- a/src/app/editor/graphics/palette_editor.h +++ b/src/app/editor/graphics/palette_editor.h @@ -85,9 +85,8 @@ class PaletteEditor : public SharedRom, public Editor { } void Initialize() override; - + absl::Status Load() override; absl::Status Update() override; - absl::Status Cut() override { return absl::OkStatus(); } absl::Status Copy() override { return absl::OkStatus(); } absl::Status Paste() override { return absl::OkStatus(); } diff --git a/src/app/editor/graphics/screen_editor.cc b/src/app/editor/graphics/screen_editor.cc index 768bf9a6..508afe6a 100644 --- a/src/app/editor/graphics/screen_editor.cc +++ b/src/app/editor/graphics/screen_editor.cc @@ -28,6 +28,8 @@ constexpr uint32_t kRedPen = 0xFF0000FF; void ScreenEditor::Initialize() {} +absl::Status ScreenEditor::Load() { return absl::OkStatus(); } + absl::Status ScreenEditor::Update() { if (ImGui::BeginTabBar("##ScreenEditorTabBar")) { if (ImGui::BeginTabItem("Dungeon Maps")) { diff --git a/src/app/editor/graphics/screen_editor.h b/src/app/editor/graphics/screen_editor.h index 93f6fb08..5fce5189 100644 --- a/src/app/editor/graphics/screen_editor.h +++ b/src/app/editor/graphics/screen_editor.h @@ -39,9 +39,8 @@ class ScreenEditor : public SharedRom, public Editor { } void Initialize() override; - + absl::Status Load() override; absl::Status Update() override; - absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } absl::Status Cut() override { return absl::UnimplementedError("Cut"); } diff --git a/src/app/editor/message/message_editor.cc b/src/app/editor/message/message_editor.cc index 2559d77b..3a2722b7 100644 --- a/src/app/editor/message/message_editor.cc +++ b/src/app/editor/message/message_editor.cc @@ -85,6 +85,10 @@ void MessageEditor::Initialize() { DrawMessagePreview(); } +absl::Status MessageEditor::Load() { + return absl::OkStatus(); +} + absl::Status MessageEditor::Update() { if (rom()->is_loaded() && !data_loaded_) { Initialize(); diff --git a/src/app/editor/message/message_editor.h b/src/app/editor/message/message_editor.h index cf69144f..834bb7c4 100644 --- a/src/app/editor/message/message_editor.h +++ b/src/app/editor/message/message_editor.h @@ -38,6 +38,7 @@ class MessageEditor : public Editor, public SharedRom { MessageEditor() { type_ = EditorType::kMessage; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; void DrawMessageList(); void DrawCurrentMessage(); diff --git a/src/app/editor/music/music_editor.cc b/src/app/editor/music/music_editor.cc index e305b781..be04ba9e 100644 --- a/src/app/editor/music/music_editor.cc +++ b/src/app/editor/music/music_editor.cc @@ -11,6 +11,10 @@ namespace editor { void MusicEditor::Initialize() {} +absl::Status MusicEditor::Load() { + return absl::OkStatus(); +} + absl::Status MusicEditor::Update() { if (ImGui::BeginTable("MusicEditorColumns", 2, music_editor_flags_, ImVec2(0, 0))) { diff --git a/src/app/editor/music/music_editor.h b/src/app/editor/music/music_editor.h index 5ce6fb4e..38d66eae 100644 --- a/src/app/editor/music/music_editor.h +++ b/src/app/editor/music/music_editor.h @@ -48,8 +48,8 @@ static constexpr absl::string_view kSongNotes[] = { const ImGuiTableFlags toolset_table_flags_ = ImGuiTableFlags_SizingFixedFit; const ImGuiTableFlags music_editor_flags_ = ImGuiTableFlags_SizingFixedFit | - ImGuiTableFlags_Resizable | - ImGuiTableFlags_Reorderable; + ImGuiTableFlags_Resizable | + ImGuiTableFlags_Reorderable; /** * @class MusicEditor * @brief A class for editing music data in a Rom. @@ -59,6 +59,7 @@ class MusicEditor : public SharedRom, public Editor { MusicEditor() { type_ = EditorType::kMusic; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } diff --git a/src/app/editor/overworld/overworld_editor.cc b/src/app/editor/overworld/overworld_editor.cc index f8c4a800..225be6cb 100644 --- a/src/app/editor/overworld/overworld_editor.cc +++ b/src/app/editor/overworld/overworld_editor.cc @@ -59,14 +59,48 @@ using ImGui::Text; constexpr int kTile16Size = 0x10; +void OverworldEditor::Initialize() { + // Load zeml string from layouts/overworld.zeml + std::string layout = gui::zeml::LoadFile("overworld.zeml"); + // Parse the zeml string into a Node object + layout_node_ = gui::zeml::Parse(layout); + + gui::zeml::Bind(&*layout_node_.GetNode("OverworldCanvas"), + [this]() { DrawOverworldCanvas(); }); + gui::zeml::Bind(&*layout_node_.GetNode("OverworldTileSelector"), + [this]() { status_ = DrawTileSelector(); }); + gui::zeml::Bind(&*layout_node_.GetNode("OwUsageStats"), [this]() { + if (rom_.is_loaded()) { + status_ = UpdateUsageStats(); + } + }); + gui::zeml::Bind(&*layout_node_.GetNode("owToolset"), + [this]() { DrawToolset(); }); + gui::zeml::Bind(&*layout_node_.GetNode("OwTile16Editor"), [this]() { + if (rom_.is_loaded()) { + status_ = tile16_editor_.Update(); + } + }); + gui::zeml::Bind(&*layout_node_.GetNode("OwGfxGroupEditor"), [this]() { + if (rom_.is_loaded()) { + status_ = gfx_group_editor_.Update(); + } + }); +} + +absl::Status OverworldEditor::Load() { + RETURN_IF_ERROR( + tile16_editor_.Initialize(tile16_blockset_bmp_, current_gfx_bmp_, + *overworld_.mutable_all_tiles_types())); + ASSIGN_OR_RETURN(entrance_tiletypes_, zelda3::LoadEntranceTileTypes(rom_)); + all_gfx_loaded_ = true; + return absl::OkStatus(); +} + absl::Status OverworldEditor::Update() { status_ = absl::OkStatus(); if (rom_.is_loaded() && !all_gfx_loaded_) { - RETURN_IF_ERROR( - tile16_editor_.Initialize(tile16_blockset_bmp_, current_gfx_bmp_, - *overworld_.mutable_all_tiles_types())); - ASSIGN_OR_RETURN(entrance_tiletypes_, zelda3::LoadEntranceTileTypes(rom_)); - all_gfx_loaded_ = true; + RETURN_IF_ERROR(Load()); } if (overworld_canvas_fullscreen_) { @@ -1484,34 +1518,5 @@ void OverworldEditor::DrawDebugWindow() { } } -void OverworldEditor::Initialize() { - // Load zeml string from layouts/overworld.zeml - std::string layout = gui::zeml::LoadFile("overworld.zeml"); - // Parse the zeml string into a Node object - layout_node_ = gui::zeml::Parse(layout); - - gui::zeml::Bind(&*layout_node_.GetNode("OverworldCanvas"), - [this]() { DrawOverworldCanvas(); }); - gui::zeml::Bind(&*layout_node_.GetNode("OverworldTileSelector"), - [this]() { status_ = DrawTileSelector(); }); - gui::zeml::Bind(&*layout_node_.GetNode("OwUsageStats"), [this]() { - if (rom_.is_loaded()) { - status_ = UpdateUsageStats(); - } - }); - gui::zeml::Bind(&*layout_node_.GetNode("owToolset"), - [this]() { DrawToolset(); }); - gui::zeml::Bind(&*layout_node_.GetNode("OwTile16Editor"), [this]() { - if (rom_.is_loaded()) { - status_ = tile16_editor_.Update(); - } - }); - gui::zeml::Bind(&*layout_node_.GetNode("OwGfxGroupEditor"), [this]() { - if (rom_.is_loaded()) { - status_ = gfx_group_editor_.Update(); - } - }); -} - } // namespace editor } // namespace yaze diff --git a/src/app/editor/overworld/overworld_editor.h b/src/app/editor/overworld/overworld_editor.h index 20876339..44935f7d 100644 --- a/src/app/editor/overworld/overworld_editor.h +++ b/src/app/editor/overworld/overworld_editor.h @@ -77,7 +77,7 @@ class OverworldEditor : public Editor, public gfx::GfxContext { OverworldEditor(Rom& rom) : rom_(rom) { type_ = EditorType::kOverworld; } void Initialize() override; - + absl::Status Load() override; absl::Status Update() final; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } diff --git a/src/app/editor/sprite/sprite_editor.cc b/src/app/editor/sprite/sprite_editor.cc index 0b4e38ce..071303d1 100644 --- a/src/app/editor/sprite/sprite_editor.cc +++ b/src/app/editor/sprite/sprite_editor.cc @@ -23,6 +23,10 @@ using ImGui::Text; void SpriteEditor::Initialize() {} +absl::Status SpriteEditor::Load() { + return absl::OkStatus(); +} + absl::Status SpriteEditor::Update() { if (rom()->is_loaded() && !sheets_loaded_) { // Load the values for current_sheets_ array diff --git a/src/app/editor/sprite/sprite_editor.h b/src/app/editor/sprite/sprite_editor.h index 2e1f8170..2c07ddea 100644 --- a/src/app/editor/sprite/sprite_editor.h +++ b/src/app/editor/sprite/sprite_editor.h @@ -38,6 +38,7 @@ class SpriteEditor : public SharedRom, public Editor { SpriteEditor() { type_ = EditorType::kSprite; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); } diff --git a/src/app/editor/system/settings_editor.cc b/src/app/editor/system/settings_editor.cc index 359ea31a..62e1c415 100644 --- a/src/app/editor/system/settings_editor.cc +++ b/src/app/editor/system/settings_editor.cc @@ -23,6 +23,10 @@ using ImGui::TableSetupColumn; void SettingsEditor::Initialize() {} +absl::Status SettingsEditor::Load() { + return absl::OkStatus(); +} + absl::Status SettingsEditor::Update() { if (BeginTabBar("Settings", ImGuiTabBarFlags_None)) { if (BeginTabItem("General")) { diff --git a/src/app/editor/system/settings_editor.h b/src/app/editor/system/settings_editor.h index 556ee421..8986213b 100644 --- a/src/app/editor/system/settings_editor.h +++ b/src/app/editor/system/settings_editor.h @@ -209,6 +209,7 @@ class SettingsEditor : public Editor { public: SettingsEditor() : Editor() { type_ = EditorType::kSettings; } void Initialize() override; + absl::Status Load() override; absl::Status Update() override; absl::Status Undo() override { return absl::UnimplementedError("Undo"); } absl::Status Redo() override { return absl::UnimplementedError("Redo"); }