summaryrefslogtreecommitdiff
path: root/src/editor.cpp
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-02-02 03:59:16 +0500
committerilotterytea <iltsu@alright.party>2025-02-02 03:59:16 +0500
commitd8d3cfb04e7801ca726fead4eeb34365b4e20082 (patch)
tree3f75c9bda634eac11a671c9b4783eceaaa6a3499 /src/editor.cpp
parente7536175164e8ba816041971d9f2ab88082b0a6f (diff)
feat: header bar
Diffstat (limited to 'src/editor.cpp')
-rw-r--r--src/editor.cpp121
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; }