diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp index 97625d4266da5f9cb13c021edc10c7d2749b0b6c..8ba031568aa24186dc4d92a8290e7c5807c48afc 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 60efe2b5de6cf3a920d594e07a112d72eac9d72f..5f5078ee16f5a3ad20ee8d962a22f5a3a331a111 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 3869d76266f3c03a02270260b0165b9d6a6eac82..b1d20b7ab4c41d4df45dc5e58ac5bb2870c44a2e 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; } }