From d8d3cfb04e7801ca726fead4eeb34365b4e20082 Mon Sep 17 00:00:00 2001 From: ilotterytea Date: Sun, 2 Feb 2025 03:59:16 +0500 Subject: feat: header bar --- src/editor.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++++++++--------- src/editor.hpp | 5 ++- 2 files changed, 105 insertions(+), 21 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 #include #include +#include #include #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; } diff --git a/src/editor.hpp b/src/editor.hpp index 0851e5c..02e7d22 100644 --- a/src/editor.hpp +++ b/src/editor.hpp @@ -19,7 +19,7 @@ namespace silly::editor { }; struct NewLevelState { - std::string name; + char name[256]; }; struct NewFloorState { @@ -32,12 +32,13 @@ namespace silly::editor { void update(sf::RenderWindow &window); void update(const sf::Event &event, sf::RenderWindow &window); - void render(const sf::RenderWindow &window); + void render(sf::RenderWindow &window); const float get_zoom() const; private: void createNewLevel(const sf::RenderWindow &window); void createNewFloor(const sf::RenderWindow &window); + void drawHeaderBar(sf::RenderWindow &window); LevelPackage &package; float rotation; -- cgit v1.2.3