summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-02-02 23:07:04 +0500
committerilotterytea <iltsu@alright.party>2025-02-02 23:07:04 +0500
commitb345c36cafa8cddbc27d03c01ee851b0e0947db1 (patch)
tree0947066310c2d6d48696b00e1852c0c6ed2061cf
parent58fdbd8edfbb85a06c6c4bc0edafa46faf0709ef (diff)
feat: "create a new package" window
-rw-r--r--src/editor.cpp50
-rw-r--r--src/editor.hpp6
-rw-r--r--src/main.cpp2
-rw-r--r--src/package.cpp9
-rw-r--r--src/package.hpp7
-rw-r--r--src/sets/tileset.hpp2
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;