From d4ca5dd33864e2de024267d699046b6534a2c80b Mon Sep 17 00:00:00 2001 From: JoshuaMKW Date: Thu, 7 Mar 2024 00:06:27 -0600 Subject: [PATCH] Add insert options --- include/gui/scene/objdialog.hpp | 25 ++++++++---- src/gui/scene/objdialog.cpp | 4 +- src/gui/scene/window.cpp | 67 +++++++++++++++++++++++++++------ 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/include/gui/scene/objdialog.hpp b/include/gui/scene/objdialog.hpp index 0c621825..66ccd37e 100644 --- a/include/gui/scene/objdialog.hpp +++ b/include/gui/scene/objdialog.hpp @@ -2,11 +2,11 @@ #include #include -#include #include +#include -#include "core/memory.hpp" #include "core/error.hpp" +#include "core/memory.hpp" #include "gui/scene/nodeinfo.hpp" #include "objlib/template.hpp" @@ -14,13 +14,21 @@ namespace Toolbox::UI { class CreateObjDialog { public: - using action_t = std::function)>; + enum class InsertPolicy { + INSERT_BEFORE, + INSERT_AFTER, + INSERT_CHILD, + }; + + using action_t = + std::function)>; using cancel_t = std::function)>; CreateObjDialog() = default; ~CreateObjDialog() = default; + void setInsertPolicy(InsertPolicy policy) { m_insert_policy = policy; } void setActionOnAccept(action_t on_accept) { m_on_accept = on_accept; } void setActionOnReject(cancel_t on_reject) { m_on_reject = on_reject; } @@ -33,7 +41,7 @@ namespace Toolbox::UI { void render(SelectionNodeInfo node_info); private: - bool m_open = false; + bool m_open = false; bool m_opening = false; int m_template_index = -1; @@ -44,6 +52,8 @@ namespace Toolbox::UI { std::array m_object_name = {}; + InsertPolicy m_insert_policy = InsertPolicy::INSERT_BEFORE; + action_t m_on_accept; cancel_t m_on_reject; @@ -52,7 +62,8 @@ namespace Toolbox::UI { class RenameObjDialog { public: - using action_t = std::function)>; + using action_t = + std::function)>; using cancel_t = std::function)>; RenameObjDialog() = default; @@ -67,7 +78,7 @@ namespace Toolbox::UI { std::copy(cropped_name.begin(), cropped_name.end(), m_original_name.begin()); std::copy(cropped_name.begin(), cropped_name.end(), m_object_name.begin()); m_original_name.at(end_pos) = '\0'; - m_object_name.at(end_pos) = '\0'; + m_object_name.at(end_pos) = '\0'; } void setup(); diff --git a/src/gui/scene/objdialog.cpp b/src/gui/scene/objdialog.cpp index 6f4710a3..848cf6e4 100644 --- a/src/gui/scene/objdialog.cpp +++ b/src/gui/scene/objdialog.cpp @@ -184,9 +184,9 @@ namespace Toolbox::UI { } if (ImGui::Button("Create")) { - m_on_accept(0, proposed_name, *m_templates.at(m_template_index), + m_on_accept(node_info.m_selection_index, proposed_name, *m_templates.at(m_template_index), m_templates.at(m_template_index)->wizards().at(m_wizard_index).m_name, - node_info); + m_insert_policy, node_info); m_open = false; } diff --git a/src/gui/scene/window.cpp b/src/gui/scene/window.cpp index 6c92fd07..daa69da8 100644 --- a/src/gui/scene/window.cpp +++ b/src/gui/scene/window.cpp @@ -1159,8 +1159,17 @@ namespace Toolbox::UI { m_hierarchy_virtual_node_menu = ContextMenu>(); m_hierarchy_virtual_node_menu.addOption( - "Insert Object Here...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_I}, + "Insert Object Before...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_BEFORE); + m_create_obj_dialog.open(); + return; + }); + + m_hierarchy_virtual_node_menu.addOption( + "Insert Object After...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_AFTER); m_create_obj_dialog.open(); return; }); @@ -1242,12 +1251,29 @@ namespace Toolbox::UI { void SceneWindow::buildContextMenuGroupObj() { m_hierarchy_group_node_menu = ContextMenu>(); - m_hierarchy_group_node_menu.addOption("Add Child Object...", - {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, - [this](SelectionNodeInfo info) { - m_create_obj_dialog.open(); - return; - }); + m_hierarchy_group_node_menu.addOption( + "Add Child Object...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_CHILD); + m_create_obj_dialog.open(); + return; + }); + + m_hierarchy_group_node_menu.addOption( + "Insert Object Before...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_BEFORE); + m_create_obj_dialog.open(); + return; + }); + + m_hierarchy_group_node_menu.addOption( + "Insert Object After...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_AFTER); + m_create_obj_dialog.open(); + return; + }); m_hierarchy_group_node_menu.addDivider(); @@ -1325,8 +1351,17 @@ namespace Toolbox::UI { m_hierarchy_physical_node_menu = ContextMenu>(); m_hierarchy_physical_node_menu.addOption( - "Insert Object Here...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + "Insert Object Before...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, + [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_BEFORE); + m_create_obj_dialog.open(); + return; + }); + + m_hierarchy_physical_node_menu.addOption( + "Insert Object After...", {GLFW_KEY_LEFT_CONTROL, GLFW_KEY_N}, [this](SelectionNodeInfo info) { + m_create_obj_dialog.setInsertPolicy(CreateObjDialog::InsertPolicy::INSERT_AFTER); m_create_obj_dialog.open(); return; }); @@ -1815,18 +1850,26 @@ namespace Toolbox::UI { m_create_obj_dialog.setup(); m_create_obj_dialog.setActionOnAccept( [this](size_t sibling_index, std::string_view name, const Object::Template &template_, - std::string_view wizard_name, SelectionNodeInfo info) { + std::string_view wizard_name, CreateObjDialog::InsertPolicy policy, + SelectionNodeInfo info) { auto new_object_result = Object::ObjectFactory::create(template_, wizard_name); if (!name.empty()) { new_object_result->setNameRef(name); } + size_t insert_index; + GroupSceneObject *this_parent; - if (info.m_selected->isGroupObject()) { - this_parent = reinterpret_cast(info.m_selected.get()); + if (info.m_selected->isGroupObject() && + policy == CreateObjDialog::InsertPolicy::INSERT_CHILD) { + this_parent = reinterpret_cast(info.m_selected.get()); + insert_index = this_parent->getChildren().size(); } else { this_parent = reinterpret_cast(info.m_selected->getParent()); + insert_index = policy == CreateObjDialog::InsertPolicy::INSERT_BEFORE + ? sibling_index + : sibling_index + 1; } if (!this_parent) { @@ -1836,7 +1879,7 @@ namespace Toolbox::UI { return; } - auto result = this_parent->insertChild(sibling_index, std::move(new_object_result)); + auto result = this_parent->insertChild(insert_index, std::move(new_object_result)); if (!result) { logObjectGroupError(result.error()); return;