diff options
| author | ilotterytea <iltsu@alright.party> | 2025-02-02 23:07:04 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-02-02 23:07:04 +0500 |
| commit | b345c36cafa8cddbc27d03c01ee851b0e0947db1 (patch) | |
| tree | 0947066310c2d6d48696b00e1852c0c6ed2061cf | |
| parent | 58fdbd8edfbb85a06c6c4bc0edafa46faf0709ef (diff) | |
feat: "create a new package" window
| -rw-r--r-- | src/editor.cpp | 50 | ||||
| -rw-r--r-- | src/editor.hpp | 6 | ||||
| -rw-r--r-- | src/main.cpp | 2 | ||||
| -rw-r--r-- | src/package.cpp | 9 | ||||
| -rw-r--r-- | src/package.hpp | 7 | ||||
| -rw-r--r-- | src/sets/tileset.hpp | 2 |
6 files changed, 71 insertions, 5 deletions
diff --git a/src/editor.cpp b/src/editor.cpp index 985167a..5417a59 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -193,6 +193,39 @@ namespace silly::editor { ImGui::End(); } + void Editor::createNewPackage(const sf::RenderWindow &window) { + if (!this->newPackageState.has_value()) { + this->newPackageState = std::make_optional((NewPackageState){}); + } + + sf::Vector2u windowSize = window.getSize(); + + NewPackageState &state = this->newPackageState.value(); + + ImGui::SetNextWindowPos( + ImVec2(windowSize.x / 2.0f - 100, windowSize.y / 2.0f - 40)); + ImGui::SetNextWindowSize(ImVec2(200, 80)); + ImGui::Begin("New package", NULL, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); + + ImGui::InputText("Name", state.name, sizeof(state.name)); + std::string name(state.name); + utils::trim(name); + + if (ImGui::Button("Create") && !name.empty()) { + this->package.clear(); + this->package.set_name(name); + ImGui::SetWindowCollapsed(true); + } + + if (ImGui::IsWindowCollapsed()) { + ImGui::SetWindowCollapsed(false); + this->newPackageState = std::nullopt; + } + + ImGui::End(); + } + void Editor::createNewFloor(const sf::RenderWindow &window) { if (!this->newFloorState.has_value()) { this->newFloorState = std::make_optional((NewFloorState){}); @@ -246,9 +279,11 @@ namespace silly::editor { ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize); ImGui::InputText("Name", state.name, sizeof(state.name)); + std::string name(state.name); + utils::trim(name); - if (ImGui::Button("Create")) { - TileLevel level(state.name); + if (ImGui::Button("Create") && !name.empty()) { + TileLevel level(name); this->package.add_level(level); this->package.move_to_level_index(this->package.get_levels().size() - 1); ImGui::SetWindowCollapsed(true); @@ -267,6 +302,12 @@ namespace silly::editor { if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("New package")) { + createNewPackage(window); + } + + ImGui::Separator(); + if (!pkg.get_levels().empty() && !pkg.get_current_level().get_floors().empty()) { if (ImGui::MenuItem("Export")) { @@ -512,6 +553,11 @@ namespace silly::editor { ImGui::End(); + if (package.get_name().empty() || this->newPackageState.has_value()) { + this->createNewPackage(window); + return; + } + if (package.get_levels().empty() || this->newLevelState.has_value()) { this->createNewLevel(window); return; diff --git a/src/editor.hpp b/src/editor.hpp index 0bc55d1..aac6615 100644 --- a/src/editor.hpp +++ b/src/editor.hpp @@ -18,6 +18,10 @@ namespace silly::editor { TilesetTileType type; }; + struct NewPackageState { + char name[256]; + }; + struct NewLevelState { char name[256]; }; @@ -41,6 +45,7 @@ namespace silly::editor { const float get_zoom() const; private: + void createNewPackage(const sf::RenderWindow &window); void createNewLevel(const sf::RenderWindow &window); void createNewFloor(const sf::RenderWindow &window); void createSavePackageWindow(const sf::RenderWindow &window); @@ -59,5 +64,6 @@ namespace silly::editor { std::optional<NewLevelState> newLevelState; std::optional<NewFloorState> newFloorState; std::optional<SavePackageState> savePackageState; + std::optional<NewPackageState> newPackageState; }; }
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ea33831..74c14fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,7 +22,7 @@ int main() { window.setFramerateLimit(60); ImGui::SFML::Init(window); - silly::editor::LevelPackage package("test"); + silly::editor::LevelPackage package; silly::editor::Editor editor(package); sf::Clock deltaClock; diff --git a/src/package.cpp b/src/package.cpp index e958a19..0d860a6 100644 --- a/src/package.cpp +++ b/src/package.cpp @@ -30,6 +30,15 @@ namespace silly::editor { const std::string &LevelPackage::get_name() const { return this->name; } + void LevelPackage::set_name(const std::string &name) { this->name = name; } + + void LevelPackage::clear() { + this->name = ""; + this->currentLevelIndex = 0; + this->levels.clear(); + this->tileset.clear(); + } + std::string LevelPackage::export_to_string() const { std::ostringstream oss; diff --git a/src/package.hpp b/src/package.hpp index 4e8d9d3..9baa683 100644 --- a/src/package.hpp +++ b/src/package.hpp @@ -11,7 +11,7 @@ namespace silly::editor { class LevelPackage { public: - LevelPackage(const std::string &name) : name(name) {} + LevelPackage() {} ~LevelPackage() = default; TileSet &get_tileset(); @@ -25,12 +25,15 @@ namespace silly::editor { const std::vector<TileLevel> &get_levels() const; const std::string &get_name() const; + void set_name(const std::string &name); std::string export_to_string() const; void save(LevelPackageFormat format, std::string &file_path) const; + void clear(); + private: - const std::string name; + std::string name; TileSet tileset; std::vector<TileLevel> levels; diff --git a/src/sets/tileset.hpp b/src/sets/tileset.hpp index 8562e0f..0415969 100644 --- a/src/sets/tileset.hpp +++ b/src/sets/tileset.hpp @@ -57,6 +57,8 @@ namespace silly::editor { }))); } + void clear() { this->entries.clear(); } + std::string export_to_string() const { std::ostringstream oss; |
