diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp index 87761c92f570addceb9d6512f2e866919775e55f..1a6497239bf26f08b505447704c5c2242e08f967 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 dfcf874066bc86a7a180e7833c47184c4dcb0c5d..9329a0929c18c1ff790d78a42208c07df85e4bb7 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 667c9078aebdb2586481d97976a0b240e82e32bc..89908735ced880dfaf1927b060e16ddf53a56c81 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 b262a6a1cc3d8102ab7e9d3632f51438a5e449be..1cc8ceac23dc0963f03981c8a08d8b68ca71fb3b 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