diff --git a/Sources/Overload/OvCore/include/OvCore/ECS/Actor.h b/Sources/Overload/OvCore/include/OvCore/ECS/Actor.h index 6846a949e..77a0ecdb0 100644 --- a/Sources/Overload/OvCore/include/OvCore/ECS/Actor.h +++ b/Sources/Overload/OvCore/include/OvCore/ECS/Actor.h @@ -331,7 +331,7 @@ namespace OvCore::ECS static OvTools::Eventing::Event DestroyedEvent; static OvTools::Eventing::Event CreatedEvent; static OvTools::Eventing::Event AttachEvent; - static OvTools::Eventing::Event DettachEvent; + static OvTools::Eventing::Event DettachEvent; private: /* Settings */ diff --git a/Sources/Overload/OvCore/src/OvCore/ECS/Actor.cpp b/Sources/Overload/OvCore/src/OvCore/ECS/Actor.cpp index ef4d072fa..549be8e64 100644 --- a/Sources/Overload/OvCore/src/OvCore/ECS/Actor.cpp +++ b/Sources/Overload/OvCore/src/OvCore/ECS/Actor.cpp @@ -25,7 +25,7 @@ OvTools::Eventing::Event OvCore::ECS::Actor::DestroyedEvent; OvTools::Eventing::Event OvCore::ECS::Actor::CreatedEvent; OvTools::Eventing::Event OvCore::ECS::Actor::AttachEvent; -OvTools::Eventing::Event OvCore::ECS::Actor::DettachEvent; +OvTools::Eventing::Event OvCore::ECS::Actor::DettachEvent; OvCore::ECS::Actor::Actor(int64_t p_actorID, const std::string & p_name, const std::string & p_tag, bool& p_playing) : m_actorID(p_actorID), @@ -131,7 +131,7 @@ void OvCore::ECS::Actor::SetParent(Actor& p_parent) void OvCore::ECS::Actor::DetachFromParent() { - DettachEvent.Invoke(*this); + DettachEvent.Invoke(*this, m_parent); /* Remove the actor from the parent children list */ if (m_parent) diff --git a/Sources/Overload/OvCore/src/OvCore/ECS/Components/CCamera.cpp b/Sources/Overload/OvCore/src/OvCore/ECS/Components/CCamera.cpp index 9d3a25fb9..64a39461e 100644 --- a/Sources/Overload/OvCore/src/OvCore/ECS/Components/CCamera.cpp +++ b/Sources/Overload/OvCore/src/OvCore/ECS/Components/CCamera.cpp @@ -143,13 +143,13 @@ void OvCore::ECS::Components::CCamera::OnInspector(OvUI::Internal::WidgetContain auto currentProjectionMode = GetProjectionMode(); OvCore::Helpers::GUIDrawer::DrawScalar(p_root, "Field of view", std::bind(&CCamera::GetFov, this), std::bind(&CCamera::SetFov, this, std::placeholders::_1)); - auto& fovWidget = *p_root.GetWidgets()[p_root.GetWidgets().size() - 1].first; - auto& fovWidgetLabel = *p_root.GetWidgets()[p_root.GetWidgets().size() - 2].first; + auto& fovWidget = *p_root.GetWidgets()[p_root.GetWidgets().size() - 1]; + auto& fovWidgetLabel = *p_root.GetWidgets()[p_root.GetWidgets().size() - 2]; fovWidget.enabled = fovWidgetLabel.enabled = currentProjectionMode == OvRendering::Settings::EProjectionMode::PERSPECTIVE; OvCore::Helpers::GUIDrawer::DrawScalar(p_root, "Size", std::bind(&CCamera::GetSize, this), std::bind(&CCamera::SetSize, this, std::placeholders::_1)); - auto& sizeWidget = *p_root.GetWidgets()[p_root.GetWidgets().size() - 1].first; - auto& sizeWidgetLabel = *p_root.GetWidgets()[p_root.GetWidgets().size() - 2].first; + auto& sizeWidget = *p_root.GetWidgets()[p_root.GetWidgets().size() - 1]; + auto& sizeWidgetLabel = *p_root.GetWidgets()[p_root.GetWidgets().size() - 2]; sizeWidget.enabled = sizeWidgetLabel.enabled = currentProjectionMode == OvRendering::Settings::EProjectionMode::ORTHOGRAPHIC; OvCore::Helpers::GUIDrawer::DrawScalar(p_root, "Near", std::bind(&CCamera::GetNear, this), std::bind(&CCamera::SetNear, this, std::placeholders::_1)); diff --git a/Sources/Overload/OvEditor/include/OvEditor/Panels/Hierarchy.h b/Sources/Overload/OvEditor/include/OvEditor/Panels/Hierarchy.h index b7f5ea75c..bd533b699 100644 --- a/Sources/Overload/OvEditor/include/OvEditor/Panels/Hierarchy.h +++ b/Sources/Overload/OvEditor/include/OvEditor/Panels/Hierarchy.h @@ -65,7 +65,7 @@ namespace OvEditor::Panels * Detach the given actor linked widget from its parent widget * @param p_actor */ - void DetachFromParent(OvCore::ECS::Actor& p_actor); + void DetachFromParent(OvCore::ECS::Actor& p_actor, OvCore::ECS::Actor* p_parentActor); /** * Delete the widget referencing the given actor diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp index bab7fdd5a..4d32635d6 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp @@ -185,21 +185,37 @@ OvEditor::Panels::Hierarchy::Hierarchy m_sceneRoot->AddPlugin>>("Actor").DataReceivedEvent += [this](std::pair p_element) { if (p_element.second->HasParent()) - p_element.second->GetParent()->UnconsiderWidget(*p_element.second); - - m_sceneRoot->ConsiderWidget(*p_element.second); + p_element.second->GetParent()->TransferOwnership(*p_element.second, *m_sceneRoot); p_element.first->DetachFromParent(); }; m_sceneRoot->AddPlugin(nullptr, *m_sceneRoot); + EDITOR_EVENT(ActorSelectedEvent) += std::bind(&Hierarchy::SelectActorByInstance, this, std::placeholders::_1); EDITOR_EVENT(ActorUnselectedEvent) += std::bind(&Hierarchy::UnselectActorsWidgets, this); + EDITOR_CONTEXT(sceneManager).SceneUnloadEvent += std::bind(&Hierarchy::Clear, this); - OvCore::ECS::Actor::CreatedEvent += std::bind(&Hierarchy::AddActorByInstance, this, std::placeholders::_1); - OvCore::ECS::Actor::DestroyedEvent += std::bind(&Hierarchy::DeleteActorByInstance, this, std::placeholders::_1); - EDITOR_EVENT(ActorSelectedEvent) += std::bind(&Hierarchy::SelectActorByInstance, this, std::placeholders::_1); - OvCore::ECS::Actor::AttachEvent += std::bind(&Hierarchy::AttachActorToParent, this, std::placeholders::_1); - OvCore::ECS::Actor::DettachEvent += std::bind(&Hierarchy::DetachFromParent, this, std::placeholders::_1); + + OvCore::ECS::Actor::CreatedEvent += [this](OvCore::ECS::Actor& p_actor) + { + m_callbackQueue.push([this, &p_actor] { this->AddActorByInstance(p_actor); }); + }; + + OvCore::ECS::Actor::DestroyedEvent += [this](OvCore::ECS::Actor& p_actor) + { + m_callbackQueue.push([this, &p_actor] { this->DeleteActorByInstance(p_actor); }); + }; + + OvCore::ECS::Actor::AttachEvent += [this](OvCore::ECS::Actor& p_actor, OvCore::ECS::Actor& p_parentActor) + { + m_callbackQueue.push([this, &p_actor] { this->AttachActorToParent(p_actor); }); + }; + + OvCore::ECS::Actor::DettachEvent += [this](OvCore::ECS::Actor& p_actor, OvCore::ECS::Actor* p_parentActor) + { + m_callbackQueue.push([this, &p_actor, p_parentActor] { this->DetachFromParent(p_actor, p_parentActor); }); + }; + } void OvEditor::Panels::Hierarchy::Clear() @@ -223,7 +239,7 @@ void OvEditor::Panels::Hierarchy::SelectActorByInstance(OvCore::ECS::Actor& p_ac SelectActorByWidget(*result->second); } -void OvEditor::Panels::Hierarchy::SelectActorByWidget(OvUI::Widgets::Layout::TreeNode & p_widget) +void OvEditor::Panels::Hierarchy::SelectActorByWidget(OvUI::Widgets::Layout::TreeNode& p_widget) { UnselectActorsWidgets(); @@ -235,7 +251,7 @@ void OvEditor::Panels::Hierarchy::SelectActorByWidget(OvUI::Widgets::Layout::Tre } } -void OvEditor::Panels::Hierarchy::AttachActorToParent(OvCore::ECS::Actor & p_actor) +void OvEditor::Panels::Hierarchy::AttachActorToParent(OvCore::ECS::Actor& p_actor) { auto actorWidget = m_widgetActorLink.find(&p_actor); @@ -243,25 +259,20 @@ void OvEditor::Panels::Hierarchy::AttachActorToParent(OvCore::ECS::Actor & p_act { auto widget = actorWidget->second; - if (widget->HasParent()) - widget->GetParent()->UnconsiderWidget(*widget); + const auto parentWidget = m_widgetActorLink.at(p_actor.GetParent()); + parentWidget->leaf = false; - if (p_actor.HasParent()) - { - auto parentWidget = m_widgetActorLink.at(p_actor.GetParent()); - parentWidget->leaf = false; - parentWidget->ConsiderWidget(*widget); - } + widget->GetParent()->TransferOwnership(*widget, *parentWidget); } } -void OvEditor::Panels::Hierarchy::DetachFromParent(OvCore::ECS::Actor & p_actor) +void OvEditor::Panels::Hierarchy::DetachFromParent(OvCore::ECS::Actor & p_actor, OvCore::ECS::Actor* p_parentActor) { if (auto actorWidget = m_widgetActorLink.find(&p_actor); actorWidget != m_widgetActorLink.end()) { - if (p_actor.HasParent() && p_actor.GetParent()->GetChildren().size() == 1) + if (p_parentActor && p_parentActor->GetChildren().size() <= 1) { - if (auto parentWidget = m_widgetActorLink.find(p_actor.GetParent()); parentWidget != m_widgetActorLink.end()) + if (const auto parentWidget = m_widgetActorLink.find(p_parentActor); parentWidget != m_widgetActorLink.end()) { parentWidget->second->leaf = true; } @@ -269,10 +280,8 @@ void OvEditor::Panels::Hierarchy::DetachFromParent(OvCore::ECS::Actor & p_actor) auto widget = actorWidget->second; - if (widget->HasParent()) - widget->GetParent()->UnconsiderWidget(*widget); - - m_sceneRoot->ConsiderWidget(*widget); + if(widget->GetParent() != m_sceneRoot) + widget->GetParent()->TransferOwnership(*widget, *m_sceneRoot); } } diff --git a/Sources/Overload/OvGame/include/OvGame/Utils/FPSCounter.h b/Sources/Overload/OvGame/include/OvGame/Utils/FPSCounter.h index 831450fd5..276c56821 100644 --- a/Sources/Overload/OvGame/include/OvGame/Utils/FPSCounter.h +++ b/Sources/Overload/OvGame/include/OvGame/Utils/FPSCounter.h @@ -32,7 +32,7 @@ namespace OvGame::Utils void Update(float p_deltaTime); private: - OvUI::Widgets::Texts::TextColored m_text; + OvUI::Widgets::Texts::TextColored& m_text; OvWindowing::Window& m_window; float m_elapsed = 0.0f; diff --git a/Sources/Overload/OvGame/src/OvGame/Utils/FPSCounter.cpp b/Sources/Overload/OvGame/src/OvGame/Utils/FPSCounter.cpp index 44ef16aba..4fda97181 100644 --- a/Sources/Overload/OvGame/src/OvGame/Utils/FPSCounter.cpp +++ b/Sources/Overload/OvGame/src/OvGame/Utils/FPSCounter.cpp @@ -6,13 +6,12 @@ #include "OvGame/Utils/FPSCounter.h" -OvGame::Utils::FPSCounter::FPSCounter(OvWindowing::Window& p_window) : m_window(p_window) +OvGame::Utils::FPSCounter::FPSCounter(OvWindowing::Window& p_window) : m_text(CreateWidget()), m_window(p_window) { m_text.color = OvUI::Types::Color::Yellow; m_defaultHorizontalAlignment = OvUI::Settings::EHorizontalAlignment::RIGHT; m_defaultPosition = { static_cast(m_window.GetSize().first) - 10.0f , 10.0f }; m_text.content = "999 FPS"; - ConsiderWidget(m_text, false); } void OvGame::Utils::FPSCounter::Update(float p_deltaTime) diff --git a/Sources/Overload/OvTools/CallbackQueue.h b/Sources/Overload/OvTools/CallbackQueue.h new file mode 100644 index 000000000..19a3b1533 --- /dev/null +++ b/Sources/Overload/OvTools/CallbackQueue.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace OvTools::Utils +{ + class CallbackQueue : public std::queue> + { + public: + void Process() + { + while (!empty()) + { + auto& callback = front(); + callback(); + pop(); + } + } + }; +} diff --git a/Sources/Overload/OvUI/include/OvUI/Internal/WidgetContainer.h b/Sources/Overload/OvUI/include/OvUI/Internal/WidgetContainer.h index 6d419e586..6fbf09ae8 100644 --- a/Sources/Overload/OvUI/include/OvUI/Internal/WidgetContainer.h +++ b/Sources/Overload/OvUI/include/OvUI/Internal/WidgetContainer.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include "OvUI/Widgets/AWidget.h" @@ -40,17 +41,7 @@ namespace OvUI::Internal */ void RemoveAllWidgets(); - /** - * Consider a widget - * @param p_manageMemory - */ - void ConsiderWidget(Widgets::AWidget& p_widget, bool p_manageMemory = true); - - /** - * Unconsider a widget - * @param p_widget - */ - void UnconsiderWidget(Widgets::AWidget& p_widget); + void TransferOwnership(Widgets::AWidget& p_widget, WidgetContainer& p_widgetCoontainer); /** * Collect garbages by removing widgets marked as "Destroyed" @@ -74,8 +65,8 @@ namespace OvUI::Internal template T& CreateWidget(Args&&... p_args) { - m_widgets.emplace_back(new T(p_args...), Internal::EMemoryMode::INTERNAL_MANAGMENT); - T& instance = *reinterpret_cast(m_widgets.back().first); + m_widgets.emplace_back(std::make_unique(p_args...)); + T& instance = *static_cast(m_widgets.back().get()); instance.SetParent(this); return instance; } @@ -83,10 +74,10 @@ namespace OvUI::Internal /** * Returns the widgets and their memory management mode */ - std::vector>& GetWidgets(); + std::vector>& GetWidgets(); protected: - std::vector> m_widgets; + std::vector> m_widgets; bool m_reversedDrawOrder = false; }; } \ No newline at end of file diff --git a/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h b/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h index dcdd6c68a..110adbf34 100644 --- a/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h +++ b/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h @@ -9,6 +9,7 @@ #include #include +#include "../../../../OvTools/CallbackQueue.h" #include "OvUI/Internal/WidgetContainer.h" namespace OvUI::Panels @@ -42,8 +43,10 @@ namespace OvUI::Panels protected: std::string m_panelID; + OvTools::Utils::CallbackQueue m_callbackQueue; private: static uint64_t __PANEL_ID_INCREMENT; + }; } \ No newline at end of file diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/AButton.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/AButton.h index cff510736..e6188353c 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/AButton.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/AButton.h @@ -19,6 +19,9 @@ namespace OvUI::Widgets::Buttons */ class AButton : public AWidget { + public: + AButton() = default; + virtual ~AButton() override = default; protected: void _Draw_Impl() override = 0; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/Button.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/Button.h index 9ff169c73..363fea33f 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/Button.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/Button.h @@ -28,7 +28,7 @@ namespace OvUI::Widgets::Buttons * @param p_disabled */ Button(const std::string& p_label = "", const OvMaths::FVector2& p_size = OvMaths::FVector2(0.f, 0.f), bool p_disabled = false); - + virtual ~Button() override = default; protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonArrow.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonArrow.h index 573deacf2..3c5e713eb 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonArrow.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonArrow.h @@ -23,7 +23,7 @@ namespace OvUI::Widgets::Buttons * @param p_direction */ ButtonArrow(ImGuiDir p_direction = ImGuiDir_None); - + virtual ~ButtonArrow() override = default; protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonColored.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonColored.h index 9a5cdfd67..4ba2629e2 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonColored.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonColored.h @@ -29,7 +29,7 @@ namespace OvUI::Widgets::Buttons * @param p_enableAlpha */ ButtonColored(const std::string& p_label = "", const Types::Color& p_color = {}, const OvMaths::FVector2& p_size =OvMaths::FVector2(0.f, 0.f), bool p_enableAlpha = true); - + virtual ~ButtonColored() override = default; protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonImage.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonImage.h index 5d805aca2..447b0c2b2 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonImage.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonImage.h @@ -26,7 +26,7 @@ namespace OvUI::Widgets::Buttons * @param p_size */ ButtonImage(uint32_t p_textureID, const OvMaths::FVector2& p_size); - + virtual ~ButtonImage() override = default; protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonSmall.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonSmall.h index dd9a2fd2e..a7fe0581f 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonSmall.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Buttons/ButtonSmall.h @@ -24,7 +24,7 @@ namespace OvUI::Widgets::Buttons * @param p_label */ ButtonSmall(const std::string& p_label = ""); - + virtual ~ButtonSmall() override = default; protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragDouble.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragDouble.h index 99b96dfba..927d49792 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragDouble.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragDouble.h @@ -34,5 +34,7 @@ namespace OvUI::Widgets::Drags const std::string& p_label = "", const std::string& p_format = "%.6f" ); + + virtual ~DragDouble() override = default; }; } \ No newline at end of file diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragFloat.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragFloat.h index 6f60b193b..4a3db08a1 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragFloat.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragFloat.h @@ -34,5 +34,6 @@ namespace OvUI::Widgets::Drags const std::string& p_label = "", const std::string& p_format = "%.3f" ); + virtual ~DragFloat() override = default; }; } \ No newline at end of file diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragInt.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragInt.h index 9443685d6..07b995626 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragInt.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Drags/DragInt.h @@ -34,5 +34,6 @@ namespace OvUI::Widgets::Drags const std::string& p_label = "", const std::string& p_format = "%d" ); + virtual ~DragInt() override = default; }; } \ No newline at end of file diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Columns.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Columns.h index 2977a1b50..f50f14946 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Columns.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Columns.h @@ -38,7 +38,7 @@ namespace OvUI::Widgets::Layout for (auto it = m_widgets.begin(); it != m_widgets.end();) { - it->first->Draw(); + it->get()->Draw(); ++it; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/NewLine.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/NewLine.h index 7cee19418..67b225e7c 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/NewLine.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/NewLine.h @@ -15,6 +15,10 @@ namespace OvUI::Widgets::Layout */ class NewLine : public AWidget { + public: + NewLine() = default; + virtual ~NewLine() override = default; + protected: void _Draw_Impl() override; }; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Spacing.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Spacing.h index 89868bdb1..9b85a0af0 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Spacing.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/Spacing.h @@ -21,6 +21,8 @@ namespace OvUI::Widgets::Layout * @param p_spaces */ Spacing(uint16_t p_spaces = 1); + virtual ~Spacing() override = default; + protected: void _Draw_Impl() override; diff --git a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/TreeNode.h b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/TreeNode.h index fbd49bf37..3d8579569 100644 --- a/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/TreeNode.h +++ b/Sources/Overload/OvUI/include/OvUI/Widgets/Layout/TreeNode.h @@ -27,7 +27,7 @@ namespace OvUI::Widgets::Layout * @param p_arrowClickToOpen */ TreeNode(const std::string& p_name = "", bool p_arrowClickToOpen = false); - + virtual ~TreeNode() override = default; /** * Open the tree node */ diff --git a/Sources/Overload/OvUI/src/OvUI/Internal/WidgetContainer.cpp b/Sources/Overload/OvUI/src/OvUI/Internal/WidgetContainer.cpp index 6a1a186bb..93f66c20a 100644 --- a/Sources/Overload/OvUI/src/OvUI/Internal/WidgetContainer.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Internal/WidgetContainer.cpp @@ -15,15 +15,14 @@ OvUI::Internal::WidgetContainer::~WidgetContainer() void OvUI::Internal::WidgetContainer::RemoveWidget(Widgets::AWidget& p_widget) { - auto found = std::find_if(m_widgets.begin(), m_widgets.end(), [&p_widget](std::pair& p_pair) - { - return p_pair.first == &p_widget; - }); + auto found = std::find_if(m_widgets.begin(), m_widgets.end(), [&p_widget](std::unique_ptr& p_instance) + { + return p_instance.get() == &p_widget; + }); if (found != m_widgets.end()) { - if (found->second == Internal::EMemoryMode::INTERNAL_MANAGMENT) - delete found->first; + p_widget.SetParent(nullptr); m_widgets.erase(found); } @@ -31,43 +30,31 @@ void OvUI::Internal::WidgetContainer::RemoveWidget(Widgets::AWidget& p_widget) void OvUI::Internal::WidgetContainer::RemoveAllWidgets() { - std::for_each(m_widgets.begin(), m_widgets.end(), [](auto& pair) - { - if (pair.second == Internal::EMemoryMode::INTERNAL_MANAGMENT) - delete pair.first; - }); - m_widgets.clear(); } -void OvUI::Internal::WidgetContainer::ConsiderWidget(Widgets::AWidget & p_widget, bool p_manageMemory) +void OvUI::Internal::WidgetContainer::TransferOwnership(Widgets::AWidget& p_widget, WidgetContainer& p_widgetCoontainer) { - m_widgets.emplace_back(std::make_pair(&p_widget, p_manageMemory ? EMemoryMode::INTERNAL_MANAGMENT : EMemoryMode::EXTERNAL_MANAGMENT)); - p_widget.SetParent(this); -} - -void OvUI::Internal::WidgetContainer::UnconsiderWidget(Widgets::AWidget & p_widget) -{ - auto found = std::find_if(m_widgets.begin(), m_widgets.end(), [&p_widget](std::pair& p_pair) - { - return p_pair.first == &p_widget; - }); + auto found = std::find_if(m_widgets.begin(), m_widgets.end(), [&p_widget](std::unique_ptr& p_instance) + { + return p_instance.get() == &p_widget; + }); if (found != m_widgets.end()) { - p_widget.SetParent(nullptr); + p_widget.SetParent(&p_widgetCoontainer); + + p_widgetCoontainer.m_widgets.push_back(std::move(*found)); + m_widgets.erase(found); } } void OvUI::Internal::WidgetContainer::CollectGarbages() { - m_widgets.erase(std::remove_if(m_widgets.begin(), m_widgets.end(), [](std::pair& p_item) + m_widgets.erase(std::remove_if(m_widgets.begin(), m_widgets.end(), [](std::unique_ptr& p_item) { - bool toDestroy = p_item.first && p_item.first->IsDestroyed(); - - if (toDestroy && p_item.second == Internal::EMemoryMode::INTERNAL_MANAGMENT) - delete p_item.first; + bool toDestroy = p_item && p_item.get()->IsDestroyed(); return toDestroy; }), m_widgets.end()); @@ -77,16 +64,18 @@ void OvUI::Internal::WidgetContainer::DrawWidgets() { CollectGarbages(); - if (m_reversedDrawOrder) - { - for (auto it = m_widgets.crbegin(); it != m_widgets.crend(); ++it) - it->first->Draw(); - } - else - { - for (const auto& widget : m_widgets) - widget.first->Draw(); - } + if (m_reversedDrawOrder) + { + for (auto it = m_widgets.crbegin(); it != m_widgets.crend(); ++it) + it->get()->Draw(); + } + else + { + for (const auto& widget : m_widgets) + { + widget->Draw(); + } + } } void OvUI::Internal::WidgetContainer::ReverseDrawOrder(const bool reversed) @@ -94,7 +83,7 @@ void OvUI::Internal::WidgetContainer::ReverseDrawOrder(const bool reversed) m_reversedDrawOrder = reversed; } -std::vector>& OvUI::Internal::WidgetContainer::GetWidgets() +std::vector>& OvUI::Internal::WidgetContainer::GetWidgets() { return m_widgets; } diff --git a/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp b/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp index d845fc3a4..83bcfc661 100644 --- a/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp @@ -18,7 +18,10 @@ OvUI::Panels::APanel::APanel() void OvUI::Panels::APanel::Draw() { if (enabled) + { + m_callbackQueue.Process(); _Draw_Impl(); + } } const std::string & OvUI::Panels::APanel::GetPanelID() const