From b56323de31223ce0fcd4c57f260c16c460968a39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Sun, 19 May 2024 19:53:18 +0200
Subject: [PATCH] add separate var for added modules, moved removeModule to
 addModule

---
 src/edit/include/edit/editor.hpp |  9 ++++--
 src/edit/src/editor.cpp          | 53 +++++++++++++++++++-------------
 src/gui/src/ui.cpp               |  6 ++--
 3 files changed, 41 insertions(+), 27 deletions(-)

diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp
index 97625d4..8ba0315 100644
--- a/src/edit/include/edit/editor.hpp
+++ b/src/edit/include/edit/editor.hpp
@@ -78,6 +78,7 @@ public:
     rofi::connector_type &chosen_con_type;
     std::vector<rofi::component> &allowed_components;
     std::vector<module_ptr> &modules;
+    module_ptr &selected_add_module;
     module_ptr &selected_module;
     bool &voxel_selected;
     bool &connector_selected;
@@ -106,7 +107,7 @@ public:
 
     UIData(phase &_editor_phase, mode_I &_editor_mode_I, mode_II &_editor_mode_II, build_mode_I &_editor_build_mode_I, build_mode_II &_editor_build_mode_II, 
            state &_control_state, bool &_ui_visible, rofi::component &_chosen_component, rofi::connector_type &_chosen_con_type, 
-           std::vector<rofi::component> &_allowed_components, std::vector<module_ptr> &_modules, module_ptr &_selected_module, 
+           std::vector<rofi::component> &_allowed_components, std::vector<module_ptr> &_modules, module_ptr &_selected_add_module, module_ptr &_selected_module, 
            bool &_is_connecting_modules, bool &_can_connect_modules,
            rofi::cardinal &_selected_cardinality, std::pair<connector_ptr, connector_ptr> &_selected_connectors, std::pair<module_ptr, module_ptr> &_selected_modules_connect, 
            bool &_connector_selected, bool &_voxel_selected, 
@@ -126,6 +127,7 @@ public:
     chosen_con_type{_chosen_con_type},
     allowed_components{_allowed_components},
     modules{_modules},
+    selected_add_module{_selected_add_module},
     selected_module{_selected_module},
     is_connecting_modules{_is_connecting_modules},
     can_connect_modules{_can_connect_modules},
@@ -196,7 +198,7 @@ class Editor
     char module_type_buffer[256] = {0};
 
     UIData ui = UIData{editor_phase, editor_mode_I, editor_mode_II, editor_build_mode_I, editor_build_mode_II, control_state, ui_visible, 
-                       chosen_component, chosen_con_type, allowed_components, modules, selected_module, is_connecting_modules, can_connect_modules, 
+                       chosen_component, chosen_con_type, allowed_components, modules, selected_add_module, selected_module, is_connecting_modules, can_connect_modules, 
                        selected_cardinality, selected_connectors, selected_modules_connect, 
                        connector_selected, voxel_selected, is_moving_module, module_position, coordinate_space_selection, 
                        is_rotating_module, is_resetting_module_rotation, module_rotation_angles, is_rotating_component, component_rotation_angle, 
@@ -224,8 +226,9 @@ class Editor
 
     rofiworld_ptr rofiworld = std::make_shared<rofi::RofiWorld>();
 
+    module_ptr selected_add_module;
+    module_ptr prev_selected_add_module;
     module_ptr selected_module;
-    module_ptr prev_selected_module;
 
     node_ptr prev_rebuild_node;
     bool can_rotate_component = true;
diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp
index 60efe2b..5f5078e 100644
--- a/src/edit/src/editor.cpp
+++ b/src/edit/src/editor.cpp
@@ -2203,7 +2203,7 @@ void Editor::doAddModuleAction()
     controlAddModule();
     updateSelectedModule();
     addModule();
-    detectCollision(is_placing_module, rofiworld);
+    detectCollision(is_placing_module|| is_removing_module, rofiworld);
 }
 
 void Editor::doConnectModuleAction()
@@ -2224,7 +2224,7 @@ void Editor::doManipulateModuleAction()
     selection_previous_frame = scene->getSelection();
     selectModule();
     manipulateModule();
-    detectCollision(is_moving_module || is_rotating_module || is_removing_module,  rofiworld);
+    detectCollision(is_moving_module || is_rotating_module,  rofiworld);
 }
 
 void Editor::doRotateComponentAction()
@@ -2255,10 +2255,12 @@ void Editor::exitBuildModeII(const build_mode_II previous_build_mode)
 
 void Editor::exitAddModule()
 {
-    removeModuleFromScene(selected_module);
+    removeModuleFromScene(selected_add_module);
     is_placing_module = false;
+    selected_add_module = nullptr;
+    prev_selected_add_module = nullptr;
+    scene->manageSelection(nullptr);
     selected_module = nullptr;
-    prev_selected_module = nullptr;
 }
 
 void Editor::exitConnectModule()
@@ -2304,9 +2306,11 @@ void Editor::exitRotateComponent()
 void Editor::controlAddModule()
 {
     if (keyboard.just_pressed().contains("Escape"))
-        selected_module = nullptr;
+        selected_add_module = nullptr;
 
-    is_placing_module = object_moving && mouse.just_pressed().contains("MouseLeft");
+    is_placing_module = selected_add_module && mouse.just_pressed().contains("MouseLeft");
+
+    is_removing_module = selected_module && keyboard.just_pressed().contains("Delete");
 }
 
 void Editor::controlConnectModule()
@@ -2329,7 +2333,6 @@ void Editor::controlConnectModule()
 
 void Editor::controlManipulateModule()
 {
-    is_removing_module = keyboard.just_pressed().contains("Delete");
     is_moving_module = (mouse.down().contains("MouseLeft") && 
                         (keyboard.down().contains("LeftCtrl")) || keyboard.down().contains("LeftShift"))
                        || is_moving_module;
@@ -2337,25 +2340,33 @@ void Editor::controlManipulateModule()
 
 void Editor::updateSelectedModule()
 {
-    if (prev_selected_module != selected_module)
+    if (!selected_add_module)
+        selectModule();
+    else if (selected_module && selected_add_module)
     {
-        setModuleToScene(prev_selected_module, selected_module);
+        selected_module = nullptr;
+        scene->manageSelection(nullptr);
+    }
+    
+    if (prev_selected_add_module != selected_add_module)
+    {
+        setModuleToScene(prev_selected_add_module, selected_add_module);
         setModuleToMouse();
     }
         
-    prev_selected_module = selected_module;
+    prev_selected_add_module = selected_add_module;
 }
 
 void Editor::setModuleToMouse()
 {
-    if (!selected_module)
+    if (!selected_add_module)
         return;
 
     auto [ ray_position, ray_direction ] = get_pick_ray(scene, mouse, window);
 
-    glm::vec3 plane_intersect = get_horizontal_plane_intersect(selected_module->getNode(), ray_position, ray_direction);
+    glm::vec3 plane_intersect = get_horizontal_plane_intersect(selected_add_module->getNode(), ray_position, ray_direction);
     plane_intersect.y = prev_plane_intersect.y;
-    selected_module->getNode()->setPosVec(plane_intersect);
+    selected_add_module->getNode()->setPosVec(plane_intersect);
     prev_plane_intersect = plane_intersect;
 }
 
@@ -2491,17 +2502,19 @@ void Editor::updateRotationHint()
 
 void Editor::addModule()
 {
-    if (!selected_module)
+    if (!selected_module && !selected_add_module)
         return;
 
-    if (is_placing_module)
+    if (selected_add_module && is_placing_module)
     {
         object_moving = false;
-        placeModule(selected_module);
+        placeModule(selected_add_module);
         return;
     }
-
-    useObjectController(selected_module->getNode(), controls->getActiveObjCtrl(), scene->getActiveCameras()[0].lock());
+    else if (selected_add_module)
+        useObjectController(selected_add_module->getNode(), controls->getActiveObjCtrl(), scene->getActiveCameras()[0].lock());
+    else if (selected_module && is_removing_module)
+        removeModule(selected_module);
 }
 
 void Editor::placeModule(module_ptr module)
@@ -2542,9 +2555,7 @@ void Editor::manipulateModule()
     if (mouse.just_released().contains("MouseLeft"))
         rebuildRofiWorldNodeTree(selected_module, selected_module->getNode(), rofiworld);
 
-    if (is_removing_module)
-        removeModule(selected_module);
-    else if (is_rotating_module)
+    if (is_rotating_module)
         rotateModule(selected_module, module_rotation_angles);
     else if (is_moving_module)
     {
diff --git a/src/gui/src/ui.cpp b/src/gui/src/ui.cpp
index 3869d76..b1d20b7 100644
--- a/src/gui/src/ui.cpp
+++ b/src/gui/src/ui.cpp
@@ -510,7 +510,7 @@ void module_selection_ui(const osi::Window &window, edit::UIData &data)
     // stored in the object itself, etc.)
     const std::vector<std::pair<const std::string&, const std::string&>> names_types = get_module_selection_names_types(data);
 
-    if (!data.selected_module)
+    if (!data.selected_add_module)
         data.add_module_list_index = -1;
 
     float size_x = static_cast<float>(window.size().x);
@@ -531,13 +531,13 @@ void module_selection_ui(const osi::Window &window, edit::UIData &data)
                 if (!is_selected)
                 {
                     data.add_module_list_index = n;
-                    data.selected_module = data.modules[n];
+                    data.selected_add_module = data.modules[n];
                 }
                 else
                 {
                     data.add_module_list_index = -1;
                     is_selected = false;
-                    data.selected_module = nullptr;
+                    data.selected_add_module = nullptr;
                 }
             }
 
-- 
GitLab