diff --git a/assets/layouts/overworld.zeml b/assets/layouts/overworld.zeml new file mode 100644 index 00000000..4946cb5f --- /dev/null +++ b/assets/layouts/overworld.zeml @@ -0,0 +1,19 @@ +BeginTabBar title="##OwEditorTabBar" { + BeginTabItem title="Map Editor" { + Function id="owToolset", + + Table id="##owEditTable" count="2" flags="Resizable|Reorderable|Hideable|BordersOuter|BordersV" { + TableSetupColumn title="Canvas" flags="WidthStretch", + TableSetupColumn title="Tile Selector" flags="WidthFixed" width="256", + TableHeadersRow + TableNextRow, + TableNextColumn, + Function id="OverworldCanvas", + TableNextColumn, + Function id="OverworldTileSelector", + } + } + BeginTabItem title="Usage Statistics" { + Function id="OwUsageStats" + } +} \ No newline at end of file diff --git a/src/app/editor/overworld_editor.cc b/src/app/editor/overworld_editor.cc index dc88caa3..6a595638 100644 --- a/src/app/editor/overworld_editor.cc +++ b/src/app/editor/overworld_editor.cc @@ -43,6 +43,25 @@ using ImGui::TableNextRow; using ImGui::TableSetupColumn; using ImGui::Text; +void OverworldEditor::InitializeZeml() { + // 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]() { status_ = DrawToolset(); }); +} + absl::Status OverworldEditor::Update() { if (rom()->is_loaded() && !all_gfx_loaded_) { tile16_editor_.InitBlockset(tile16_blockset_bmp_, current_gfx_bmp_, @@ -57,38 +76,12 @@ absl::Status OverworldEditor::Update() { RETURN_IF_ERROR(UpdateFullscreenCanvas()); - TAB_BAR("##OWEditorTabBar") - TAB_ITEM("Map Editor") - status_ = UpdateOverworldEdit(); - END_TAB_ITEM() - TAB_ITEM("Usage Statistics") - if (rom()->is_loaded()) { - status_ = UpdateUsageStats(); - } - END_TAB_ITEM() - END_TAB_BAR() + gui::zeml::Render(layout_node_); CLEAR_AND_RETURN_STATUS(status_); return absl::OkStatus(); } -absl::Status OverworldEditor::UpdateOverworldEdit() { - RETURN_IF_ERROR(DrawToolset()) - if (BeginTable(kOWEditTable.data(), 2, kOWEditFlags, ImVec2(0, 0))) { - TableSetupColumn("Canvas", ImGuiTableColumnFlags_WidthStretch, - ImGui::GetContentRegionAvail().x); - TableSetupColumn("Tile Selector", ImGuiTableColumnFlags_WidthFixed, 256); - TableHeadersRow(); - TableNextRow(); - TableNextColumn(); - DrawOverworldCanvas(); - TableNextColumn(); - RETURN_IF_ERROR(DrawTileSelector()); - ImGui::EndTable(); - } - return absl::OkStatus(); -} - absl::Status OverworldEditor::UpdateFullscreenCanvas() { if (overworld_canvas_fullscreen_) { static bool use_work_area = true; diff --git a/src/app/editor/overworld_editor.h b/src/app/editor/overworld_editor.h index 9008486f..d2772982 100644 --- a/src/app/editor/overworld_editor.h +++ b/src/app/editor/overworld_editor.h @@ -24,6 +24,7 @@ #include "app/gui/canvas.h" #include "app/gui/icons.h" #include "app/gui/pipeline.h" +#include "app/gui/zeml.h" #include "app/rom.h" #include "app/zelda3/overworld/overworld.h" @@ -84,6 +85,8 @@ class OverworldEditor : public Editor, public context::EntranceContext, public core::ExperimentFlags { public: + void InitializeZeml(); + absl::Status Update() final; absl::Status Undo() { return absl::UnimplementedError("Undo"); } absl::Status Redo() { return absl::UnimplementedError("Redo"); } @@ -128,7 +131,6 @@ class OverworldEditor : public Editor, absl::Status LoadGraphics(); private: - absl::Status UpdateOverworldEdit(); absl::Status UpdateFullscreenCanvas(); absl::Status DrawToolset(); @@ -283,6 +285,7 @@ class OverworldEditor : public Editor, gfx::BitmapTable animated_maps_; + gui::zeml::Node layout_node_; absl::Status status_; }; } // namespace editor