diff options
| author | ilotterytea <iltsu@alright.party> | 2025-02-02 03:59:16 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-02-02 03:59:16 +0500 |
| commit | d8d3cfb04e7801ca726fead4eeb34365b4e20082 (patch) | |
| tree | 3f75c9bda634eac11a671c9b4783eceaaa6a3499 /src/editor.cpp | |
| parent | e7536175164e8ba816041971d9f2ab88082b0a6f (diff) | |
feat: header bar
Diffstat (limited to 'src/editor.cpp')
| -rw-r--r-- | src/editor.cpp | 121 |
1 files changed, 102 insertions, 19 deletions
diff --git a/src/editor.cpp b/src/editor.cpp index 2ac2f95..3b36285 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -10,6 +10,7 @@ #include <algorithm> #include <memory> #include <optional> +#include <sstream> #include <string> #include "imgui-SFML.h" @@ -17,6 +18,7 @@ #include "level.hpp" #include "nfd.h" #include "nfd.hpp" +#include "package.hpp" #include "tileset.hpp" namespace silly::editor { @@ -118,6 +120,10 @@ namespace silly::editor { } void Editor::createNewFloor(const sf::RenderWindow &window) { + if (!this->newFloorState.has_value()) { + this->newFloorState = std::make_optional((NewFloorState){}); + } + sf::Vector2u windowSize = window.getSize(); NewFloorState &state = this->newFloorState.value(); @@ -137,6 +143,8 @@ namespace silly::editor { if (ImGui::Button("Create")) { TileFloor floor(state.width, state.height); this->package.get_current_level().add_floor(floor); + this->package.get_current_level().move_to_floor( + this->package.get_current_level().get_floors().size() - 1); ImGui::SetWindowCollapsed(true); } @@ -149,6 +157,10 @@ namespace silly::editor { } void Editor::createNewLevel(const sf::RenderWindow &window) { + if (!this->newLevelState.has_value()) { + this->newLevelState = std::make_optional((NewLevelState){}); + } + sf::Vector2u windowSize = window.getSize(); NewLevelState &state = this->newLevelState.value(); @@ -159,11 +171,12 @@ namespace silly::editor { ImGui::Begin("New level", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); - ImGui::InputText("Name", (char *)state.name.c_str(), sizeof(state.name)); + ImGui::InputText("Name", state.name, sizeof(state.name)); if (ImGui::Button("Create")) { TileLevel level(state.name); this->package.add_level(level); + this->package.move_to_level_index(this->package.get_levels().size() - 1); ImGui::SetWindowCollapsed(true); } @@ -175,33 +188,89 @@ namespace silly::editor { ImGui::End(); } - void Editor::render(const sf::RenderWindow &window) { - sf::Vector2u windowSize = window.getSize(); - - int width = 400; - int height = windowSize.y; + void Editor::drawHeaderBar(sf::RenderWindow &window) { + LevelPackage &pkg = this->package; - int x = windowSize.x - width; - int y = 0; + if (ImGui::BeginMainMenuBar()) { + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Quit")) { + window.close(); + } - if (package.get_levels().empty()) { - if (!this->newLevelState.has_value()) { - this->newLevelState = std::make_optional((NewLevelState){}); + ImGui::EndMenu(); } - this->createNewLevel(window); - return; - } + if (!pkg.get_levels().empty() && + !pkg.get_current_level().get_floors().empty()) { + if (ImGui::BeginMenu("Edit")) { + if (ImGui::MenuItem("New level")) { + createNewLevel(window); + } + if (ImGui::MenuItem("New floor")) { + createNewFloor(window); + } + + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Levels")) { + if (ImGui::BeginMenu("Move to level...")) { + for (int i = 0; i < this->package.get_levels().size(); i++) { + std::ostringstream ss; + ss << this->package.get_levels().at(i).get_name(); + ss << " (Level "; + if (i < 10) { + ss << "0"; + } + ss << i; + ss << ")"; + + if (ImGui::MenuItem(ss.str().c_str())) { + this->package.move_to_level_index(i); + } + } + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Move to floor...")) { + TileLevel &level = this->package.get_current_level(); + for (int i = 0; i < level.get_floors().size(); i++) { + std::ostringstream ss; + ss << "Floor "; + if (i < 10) { + ss << "0"; + } + ss << i; - if (package.get_current_level().get_floors().empty()) { - if (!this->newFloorState.has_value()) { - this->newFloorState = std::make_optional((NewFloorState){}); + if (ImGui::MenuItem(ss.str().c_str())) { + level.move_to_floor(i); + } + } + + ImGui::EndMenu(); + } + + ImGui::EndMenu(); + } } - this->createNewFloor(window); - return; + ImGui::EndMainMenuBar(); } + } + + void Editor::render(sf::RenderWindow &window) { + sf::Vector2u windowSize = window.getSize(); + + int width = 400; + int height = windowSize.y - 20.0f; + + int x = windowSize.x - width; + int y = windowSize.y - height; + // --- HEADER BAR --- + this->drawHeaderBar(window); + + // --- EDITOR WINDOW --- ImGui::SetNextWindowPos(ImVec2(x, y)); ImGui::SetNextWindowSize(ImVec2(width, height)); ImGui::Begin("Editor", NULL, @@ -235,6 +304,8 @@ namespace silly::editor { ImGui::Text("Rotation is %.0f degrees", this->rotation); ImGui::EndChild(); + ImGui::BeginDisabled(this->newLevelState.has_value() || + this->newFloorState.has_value()); // --- TILE SELECTION --- ImGui::BeginChild("TileSelectionRegion", ImVec2(0, 400), ImGuiChildFlags_Border, @@ -267,6 +338,7 @@ namespace silly::editor { this->newTileState = std::make_optional((NewTileState){"", {}, TILE_FLOOR}); } + ImGui::EndDisabled(); if (this->newTileState.has_value()) { NewTileState &state = this->newTileState.value(); @@ -340,6 +412,17 @@ namespace silly::editor { } ImGui::End(); + + if (package.get_levels().empty() || this->newLevelState.has_value()) { + this->createNewLevel(window); + return; + } + + if (package.get_current_level().get_floors().empty() || + this->newFloorState.has_value()) { + this->createNewFloor(window); + return; + } } const float Editor::get_zoom() const { return this->zoom; } |
