diff options
| author | ilotterytea <iltsu@alright.party> | 2025-02-02 02:54:34 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-02-02 02:54:34 +0500 |
| commit | e7536175164e8ba816041971d9f2ab88082b0a6f (patch) | |
| tree | 3a4baa1fdb2c6b6a593e15f79926c354acac5211 /src/editor.cpp | |
| parent | 0ae2d10bdfd3d4fe7483829fb9c9257973e644c7 (diff) | |
feat: windows for creating a new level and floor
Diffstat (limited to 'src/editor.cpp')
| -rw-r--r-- | src/editor.cpp | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/src/editor.cpp b/src/editor.cpp index 74632b7..2ac2f95 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -7,6 +7,7 @@ #include <SFML/Window/Event.hpp> #include <SFML/Window/Keyboard.hpp> #include <SFML/Window/Mouse.hpp> +#include <algorithm> #include <memory> #include <optional> #include <string> @@ -71,7 +72,8 @@ namespace silly::editor { // tile placement if ((sf::Mouse::isButtonPressed(sf::Mouse::Button::Left) || sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) && - !this->package.get_levels().empty()) { + !this->package.get_levels().empty() && + !this->package.get_current_level().get_floors().empty()) { sf::Vector2f mousePosition = window.mapPixelToCoords(sf::Mouse::getPosition(window)); @@ -115,6 +117,64 @@ namespace silly::editor { } } + void Editor::createNewFloor(const sf::RenderWindow &window) { + sf::Vector2u windowSize = window.getSize(); + + NewFloorState &state = this->newFloorState.value(); + + ImGui::SetNextWindowPos( + ImVec2(windowSize.x / 2.0f - 100, windowSize.y / 2.0f - 50)); + ImGui::SetNextWindowSize(ImVec2(200, 100)); + ImGui::Begin("New floor", NULL, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); + + ImGui::InputInt("Width", &state.width); + ImGui::InputInt("Height", &state.height); + + state.width = std::min(std::max(state.width, 1), 100); + state.height = std::min(std::max(state.height, 1), 100); + + if (ImGui::Button("Create")) { + TileFloor floor(state.width, state.height); + this->package.get_current_level().add_floor(floor); + ImGui::SetWindowCollapsed(true); + } + + if (ImGui::IsWindowCollapsed()) { + ImGui::SetWindowCollapsed(false); + this->newFloorState = std::nullopt; + } + + ImGui::End(); + } + + void Editor::createNewLevel(const sf::RenderWindow &window) { + sf::Vector2u windowSize = window.getSize(); + + NewLevelState &state = this->newLevelState.value(); + + ImGui::SetNextWindowPos( + ImVec2(windowSize.x / 2.0f - 100, windowSize.y / 2.0f - 40)); + ImGui::SetNextWindowSize(ImVec2(200, 80)); + ImGui::Begin("New level", NULL, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); + + ImGui::InputText("Name", (char *)state.name.c_str(), sizeof(state.name)); + + if (ImGui::Button("Create")) { + TileLevel level(state.name); + this->package.add_level(level); + ImGui::SetWindowCollapsed(true); + } + + if (ImGui::IsWindowCollapsed()) { + ImGui::SetWindowCollapsed(false); + this->newLevelState = std::nullopt; + } + + ImGui::End(); + } + void Editor::render(const sf::RenderWindow &window) { sf::Vector2u windowSize = window.getSize(); @@ -124,6 +184,24 @@ namespace silly::editor { int x = windowSize.x - width; int y = 0; + if (package.get_levels().empty()) { + if (!this->newLevelState.has_value()) { + this->newLevelState = std::make_optional((NewLevelState){}); + } + + this->createNewLevel(window); + return; + } + + if (package.get_current_level().get_floors().empty()) { + if (!this->newFloorState.has_value()) { + this->newFloorState = std::make_optional((NewFloorState){}); + } + + this->createNewFloor(window); + return; + } + ImGui::SetNextWindowPos(ImVec2(x, y)); ImGui::SetNextWindowSize(ImVec2(width, height)); ImGui::Begin("Editor", NULL, |
