From 0a3406350163271a0364bbab8cf1db9ece9a979c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Wed, 22 May 2024 09:33:18 +0200
Subject: [PATCH] add start new rofiworld to ui

---
 src/edit/include/edit/editor.hpp |  3 +++
 src/edit/src/editor.cpp          | 18 ++++++++++++++
 src/gui/include/gui/ui.hpp       |  1 +
 src/gui/src/ui.cpp               | 42 +++++++++++++++++++++++++++++---
 4 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp
index 87761c9..1a64972 100644
--- a/src/edit/include/edit/editor.hpp
+++ b/src/edit/include/edit/editor.hpp
@@ -59,6 +59,8 @@ public:
     bool save_rofiworld_visible = false;
     bool save_rofiworld_error = false;
     bool save_rofiworld_use_current_name = true;
+    bool start_new_rofiworld_visible = false;
+    bool start_new_rofiworld_prompt = false;
     bool select_rofiworld_prompt = false;
     bool export_rofiworld_use_selected_space_joint = false;
     char name_buffer[256] = {0};
@@ -362,6 +364,7 @@ public:
     void manageUISaveModule();
     void manageUISaveRofiWorld();
     void manageUIImportRofiWorld();
+    void manageUIClearRofiWorld();
     void manageUISelectRofiWorld();
 
     bool checkModuleExport(const voxel_graph_ptr &voxel_graph, const build_mode_I build_mode);
diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp
index dfcf874..9329a09 100644
--- a/src/edit/src/editor.cpp
+++ b/src/edit/src/editor.cpp
@@ -53,6 +53,7 @@ void Editor::manageUI()
     manageUISaveRofiWorld();
 
     manageUIImportRofiWorld();
+    manageUIClearRofiWorld();
     manageUISelectRofiWorld();
 }
 
@@ -186,13 +187,30 @@ void Editor::manageUIImportRofiWorld()
     ui.import_file_prompt = false;
 }
 
+void Editor::manageUIClearRofiWorld()
+{
+    if (!ui.start_new_rofiworld_prompt)
+        return;
+
+    resetBuildModeIIVariables();
+    removeRofiWorldNodeTreeFromScene(rofiworld->getNodeTree());
+
+    rofiworld = std::make_shared<rofi::RofiWorld>();
+    voxel_graph = rofiworld->getVoxelGraph();
+
+    ui.start_new_rofiworld_prompt = false;
+}
+
 void Editor::manageUISelectRofiWorld()
 {
     if (editor_phase != phase::two)
         return;
 
     if (!ui.select_rofiworld_prompt || ui.selected_rofiworld == rofiworld)
+    {
+        ui.select_rofiworld_prompt = false;
         return;
+    }
 
     resetBuildModeIIVariables();
 
diff --git a/src/gui/include/gui/ui.hpp b/src/gui/include/gui/ui.hpp
index 667c907..8990873 100644
--- a/src/gui/include/gui/ui.hpp
+++ b/src/gui/include/gui/ui.hpp
@@ -61,6 +61,7 @@ void export_module_file_ui(const osi::Window &window, edit::UIData &data);
 void export_rofiworld_file_ui(const osi::Window &window, edit::UIData &data);
 void import_file_ui(const osi::Window &window, edit::UIData &data);
 void import_rofiworld_file_ui(const osi::Window &window, edit::UIData &data);
+void start_new_rofiworld_ui(const osi::Window &window, edit::UIData &data);
 void rotation_settings(const osi::Window &window, edit::UIData &data);
 void experimental_warning(const osi::Window &window, edit::UIData &data);
 
diff --git a/src/gui/src/ui.cpp b/src/gui/src/ui.cpp
index b262a6a..1cc8cea 100644
--- a/src/gui/src/ui.cpp
+++ b/src/gui/src/ui.cpp
@@ -163,7 +163,7 @@ void mode_II_menu_ui(const osi::Window &window, edit::UIData &data)
 
 void module_menu_ui(const osi::Window &window, edit::UIData &data)
 {
-    if (ImGui::MenuItem("Save Module")) 
+    if (ImGui::MenuItem("Save##SaveModuleMenuItem")) 
     {
         data.save_module_visible = true;
     }
@@ -174,11 +174,16 @@ void rofiworld_menu_ui(const osi::Window &window, edit::UIData &data)
     bool enabled = data.editor_mode_II == edit::mode_II::build 
                    && std::find(data.rofiworld_selection.begin(), data.rofiworld_selection.end(), data.rofiworld) == data.rofiworld_selection.end();
                    
-    if (ImGui::MenuItem("Save RofiWorld", NULL, false, enabled)) 
+    if (ImGui::MenuItem("Save##SaveRofiWorldMenuIteM", NULL, false, enabled)) 
     {
         data.save_rofiworld_visible = true;
     }
 
+    if (ImGui::MenuItem("Clear##ClearRofiWorldMenuIteM", NULL, false, data.editor_mode_II == edit::mode_II::build)) 
+    {
+        data.start_new_rofiworld_visible = true;
+    }
+
     rofiworld_selection_menu_ui(window, data);
 }
 
@@ -186,7 +191,7 @@ void rofiworld_selection_menu_ui(const osi::Window &window, edit::UIData &data)
 {
     
 
-    if (ImGui::BeginMenu("Select RofiWorld", data.editor_mode_II == edit::mode_II::build)) 
+    if (ImGui::BeginMenu("Select##SelectRofiWorldMenu", data.editor_mode_II == edit::mode_II::build)) 
     {
         for (int i = 0; i < data.rofiworld_selection.size(); ++i)
         {
@@ -291,6 +296,7 @@ void mode_II_build_ui(const osi::Window &window, edit::UIData &data)
     export_file_ui(window, data);
     import_file_ui(window, data);
     save_rofiworld_ui(window, data);
+    start_new_rofiworld_ui(window, data);
 }
 
 int build_mode_I_to_int(edit::build_mode_I mode)
@@ -1141,6 +1147,36 @@ void import_rofiworld_file_ui(const osi::Window &window, edit::UIData &data)
     ImGui::End();
 }
 
+void start_new_rofiworld_ui(const osi::Window &window, edit::UIData &data)
+{
+    if (!data.start_new_rofiworld_visible)
+        return;
+
+    float size_x = static_cast<float>(window.size().x);
+    float size_y = static_cast<float>(window.size().y);
+    ImGui::SetNextWindowPos(ImVec2(size_x * 0.5f, size_y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
+
+    ImGui::Begin("New RofiWorld##NewRofiWorldConfirm", &data.start_new_rofiworld_visible, 
+                 ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove);
+
+    ImGui::Text("Do you want to start a new RofiWorld?");
+    ImGui::Text("Any unsaved configuration will be lost.");
+
+    if (ImGui::Button("Confirm##NewRofiWorldConfirmButton"))
+    {
+        data.start_new_rofiworld_prompt = true;
+        data.start_new_rofiworld_visible = false;
+    }
+    ImGui::SameLine();
+
+    if (ImGui::Button("Cancel##NewRofiWorldConfirmButton"))
+    {
+        data.start_new_rofiworld_visible = false;
+    }
+
+    ImGui::End();
+}
+
 void rotation_settings(const osi::Window &window, edit::UIData &data)
 {
     if (!data.connector_selected 
-- 
GitLab