diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp index d625c4928..ede67a179 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/AssetBrowser.cpp @@ -89,7 +89,7 @@ class TexturePreview : public OvUI::Plugins::IPlugin texture = OvCore::Global::ServiceLocator::Get()[p_path]; } - virtual void Execute() override + virtual void Execute(OvUI::Plugins::EPluginExecutionContext p_context) override { if (ImGui::IsItemHovered()) { @@ -158,10 +158,10 @@ class BrowserItemContextualMenu : public OvUI::Plugins::ContextualMenu } } - virtual void Execute() override + virtual void Execute(OvUI::Plugins::EPluginExecutionContext p_context) override { if (m_widgets.size() > 0) - OvUI::Plugins::ContextualMenu::Execute(); + OvUI::Plugins::ContextualMenu::Execute(p_context); } virtual void DeleteItem() = 0; diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp index ad9774bfc..e72ca2f5a 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/Hierarchy.cpp @@ -85,10 +85,10 @@ class ActorContextualMenu : public OvUI::Plugins::ContextualMenu OvEditor::Utils::ActorCreationMenu::GenerateActorCreationMenu(createActor, m_target, std::bind(&OvUI::Widgets::Layout::TreeNode::Open, &m_treeNode)); } - virtual void Execute() override + virtual void Execute(OvUI::Plugins::EPluginExecutionContext p_context) override { if (m_widgets.size() > 0) - OvUI::Plugins::ContextualMenu::Execute(); + OvUI::Plugins::ContextualMenu::Execute(p_context); } private: @@ -191,7 +191,9 @@ OvEditor::Panels::Hierarchy::Hierarchy p_element.first->DetachFromParent(); }; - m_sceneRoot->AddPlugin(nullptr, *m_sceneRoot); + m_sceneRoot->AddPlugin(nullptr, *m_sceneRoot); + + AddPlugin(nullptr, *m_sceneRoot); // TODO: This code is unsafe, if the hierarchy gets deleted before the last actor gets deleted, this might crash EDITOR_EVENT(ActorUnselectedEvent) += std::bind(&Hierarchy::UnselectActorsWidgets, this); diff --git a/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h b/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h index dcdd6c68a..25cd15628 100644 --- a/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h +++ b/Sources/Overload/OvUI/include/OvUI/Panels/APanel.h @@ -9,14 +9,15 @@ #include #include -#include "OvUI/Internal/WidgetContainer.h" +#include +#include namespace OvUI::Panels { /** * A Panel is a component of a canvas. It is a sort of window in the UI */ - class APanel : public API::IDrawable, public Internal::WidgetContainer + class APanel : public API::IDrawable, public Plugins::Pluginable, public Internal::WidgetContainer { public: /** diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/ContextualMenu.h b/Sources/Overload/OvUI/include/OvUI/Plugins/ContextualMenu.h index 48df2c159..ca6ccba99 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/ContextualMenu.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/ContextualMenu.h @@ -22,8 +22,9 @@ namespace OvUI::Plugins public: /** * Execute the plugin + * @param p_context */ - void Execute(); + void Execute(EPluginExecutionContext p_context); /** * Force close the contextual menu diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/DDSource.h b/Sources/Overload/OvUI/include/OvUI/Plugins/DDSource.h index f5327633f..5f9cd7f3b 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/DDSource.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/DDSource.h @@ -39,8 +39,9 @@ namespace OvUI::Plugins /** * Execute the behaviour of the drag and drop source + * @param p_context */ - virtual void Execute() override + virtual void Execute(EPluginExecutionContext p_context) override { ImGuiDragDropFlags src_flags = 0; src_flags |= ImGuiDragDropFlags_SourceNoDisableHover; // Keep the source displayed as hovered diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/DDTarget.h b/Sources/Overload/OvUI/include/OvUI/Plugins/DDTarget.h index dfa18012e..e7ae19a3f 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/DDTarget.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/DDTarget.h @@ -32,9 +32,9 @@ namespace OvUI::Plugins /** * Execute the drag and drop target behaviour - * @param p_identifier + * @param p_context */ - virtual void Execute() override + virtual void Execute(EPluginExecutionContext p_context) override { if (ImGui::BeginDragDropTarget()) { diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/DataDispatcher.h b/Sources/Overload/OvUI/include/OvUI/Plugins/DataDispatcher.h index 2420c9a43..858cf98dc 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/DataDispatcher.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/DataDispatcher.h @@ -85,8 +85,9 @@ namespace OvUI::Plugins /** * Execute the data dispatcher behaviour (No effect) + * @param p_context */ - virtual void Execute() override {} + virtual void Execute(EPluginExecutionContext p_context) override {} private: bool m_valueChanged = false; diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/IPlugin.h b/Sources/Overload/OvUI/include/OvUI/Plugins/IPlugin.h index d00d2afe7..55075ead7 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/IPlugin.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/IPlugin.h @@ -6,9 +6,17 @@ #pragma once - namespace OvUI::Plugins { + /** + * Context of execution for a plugin + */ + enum class EPluginExecutionContext + { + WIDGET, + PANEL + }; + /** * Interface to any plugin of OvUI. * A plugin is basically a behaviour that you can plug to a widget @@ -18,8 +26,9 @@ namespace OvUI::Plugins public: /** * Execute the plugin behaviour + * @param p_context */ - virtual void Execute() = 0; + virtual void Execute(EPluginExecutionContext p_context) = 0; /* Feel free to store any data you want here */ void* userData = nullptr; diff --git a/Sources/Overload/OvUI/include/OvUI/Plugins/Pluginable.h b/Sources/Overload/OvUI/include/OvUI/Plugins/Pluginable.h index eed47f3f2..af0fc02d0 100644 --- a/Sources/Overload/OvUI/include/OvUI/Plugins/Pluginable.h +++ b/Sources/Overload/OvUI/include/OvUI/Plugins/Pluginable.h @@ -21,7 +21,7 @@ namespace OvUI::Plugins /** * Destructor (Destroys every plugins) */ - ~Pluginable() + virtual ~Pluginable() { RemoveAllPlugins(); } @@ -61,10 +61,10 @@ namespace OvUI::Plugins /** * Execute every plugins */ - void ExecutePlugins() + void ExecutePlugins(EPluginExecutionContext p_context) { for (auto& plugin : m_plugins) - plugin->Execute(); + plugin->Execute(p_context); } /** diff --git a/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp b/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp index d845fc3a4..fe91f95b3 100644 --- a/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Panels/APanel.cpp @@ -18,7 +18,9 @@ OvUI::Panels::APanel::APanel() void OvUI::Panels::APanel::Draw() { if (enabled) + { _Draw_Impl(); + } } const std::string & OvUI::Panels::APanel::GetPanelID() const diff --git a/Sources/Overload/OvUI/src/OvUI/Panels/PanelWindow.cpp b/Sources/Overload/OvUI/src/OvUI/Panels/PanelWindow.cpp index dd48269a8..b058b97d0 100644 --- a/Sources/Overload/OvUI/src/OvUI/Panels/PanelWindow.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Panels/PanelWindow.cpp @@ -173,6 +173,7 @@ void OvUI::Panels::PanelWindow::_Draw_Impl() m_mustScrollToTop = false; } + ExecutePlugins(Plugins::EPluginExecutionContext::PANEL); DrawWidgets(); } diff --git a/Sources/Overload/OvUI/src/OvUI/Plugins/ContextualMenu.cpp b/Sources/Overload/OvUI/src/OvUI/Plugins/ContextualMenu.cpp index f9d4732bf..e6111cbfc 100644 --- a/Sources/Overload/OvUI/src/OvUI/Plugins/ContextualMenu.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Plugins/ContextualMenu.cpp @@ -4,11 +4,12 @@ * @licence: MIT */ -#include "OvUI/Plugins/ContextualMenu.h" +#include +#include -void OvUI::Plugins::ContextualMenu::Execute() +void OvUI::Plugins::ContextualMenu::Execute(EPluginExecutionContext p_context) { - if (ImGui::BeginPopupContextItem()) + if (p_context == EPluginExecutionContext::PANEL ? ImGui::BeginPopupContextWindow() : ImGui::BeginPopupContextItem()) { DrawWidgets(); ImGui::EndPopup(); diff --git a/Sources/Overload/OvUI/src/OvUI/Widgets/AWidget.cpp b/Sources/Overload/OvUI/src/OvUI/Widgets/AWidget.cpp index 601aca1ac..ca1c2ebb7 100644 --- a/Sources/Overload/OvUI/src/OvUI/Widgets/AWidget.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Widgets/AWidget.cpp @@ -50,7 +50,7 @@ void OvUI::Widgets::AWidget::Draw() _Draw_Impl(); if (m_autoExecutePlugins) - ExecutePlugins(); + ExecutePlugins(Plugins::EPluginExecutionContext::WIDGET); if (!lineBreak) ImGui::SameLine(); diff --git a/Sources/Overload/OvUI/src/OvUI/Widgets/Layout/TreeNode.cpp b/Sources/Overload/OvUI/src/OvUI/Widgets/Layout/TreeNode.cpp index 0546a3c5e..67ed84ab5 100644 --- a/Sources/Overload/OvUI/src/OvUI/Widgets/Layout/TreeNode.cpp +++ b/Sources/Overload/OvUI/src/OvUI/Widgets/Layout/TreeNode.cpp @@ -70,7 +70,7 @@ void OvUI::Widgets::Layout::TreeNode::_Draw_Impl() m_opened = true; - ExecutePlugins(); // Manually execute plugins to make plugins considering the TreeNode and no childs + ExecutePlugins(Plugins::EPluginExecutionContext::WIDGET); // Manually execute plugins to make plugins considering the TreeNode and no childs DrawWidgets(); @@ -83,6 +83,6 @@ void OvUI::Widgets::Layout::TreeNode::_Draw_Impl() m_opened = false; - ExecutePlugins(); // Manually execute plugins to make plugins considering the TreeNode and no childs + ExecutePlugins(Plugins::EPluginExecutionContext::WIDGET); // Manually execute plugins to make plugins considering the TreeNode and no childs } }