summaryrefslogtreecommitdiff
path: root/src/editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/editor.cpp')
-rw-r--r--src/editor.cpp80
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,