From 621a135ef785a17eed4900553081586ace57472d Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 25 Mar 2026 16:41:21 +0800 Subject: [PATCH] Make HierarchyPanel use EventBus for selection changes - Subscribe to SelectionChangedEvent via EventBus in OnAttach - Unsubscribe in destructor - Added m_selectionHandlerId and m_needsRefresh members - HierarchyPanel now properly receives selection change notifications --- editor/src/panels/HierarchyPanel.cpp | 16 ++++++++++++++++ editor/src/panels/HierarchyPanel.h | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/editor/src/panels/HierarchyPanel.cpp b/editor/src/panels/HierarchyPanel.cpp index 20a53fee..80218e93 100644 --- a/editor/src/panels/HierarchyPanel.cpp +++ b/editor/src/panels/HierarchyPanel.cpp @@ -1,6 +1,9 @@ #include "HierarchyPanel.h" #include "Core/IEditorContext.h" #include "Core/ISceneManager.h" +#include "Core/ISelectionManager.h" +#include "Core/EditorEvents.h" +#include "Core/EventBus.h" #include #include #include @@ -13,11 +16,24 @@ HierarchyPanel::HierarchyPanel() : Panel("Hierarchy") { } HierarchyPanel::~HierarchyPanel() { + if (m_context) { + m_context->GetEventBus().Unsubscribe(m_selectionHandlerId); + } } void HierarchyPanel::OnAttach() { auto& sceneManager = m_context->GetSceneManager(); sceneManager.CreateDemoScene(); + + m_selectionHandlerId = m_context->GetEventBus().Subscribe( + [this](const SelectionChangedEvent& event) { + OnSelectionChanged(event); + } + ); +} + +void HierarchyPanel::OnSelectionChanged(const SelectionChangedEvent& event) { + m_needsRefresh = true; } void HierarchyPanel::Render() { diff --git a/editor/src/panels/HierarchyPanel.h b/editor/src/panels/HierarchyPanel.h index 77592096..90460abb 100644 --- a/editor/src/panels/HierarchyPanel.h +++ b/editor/src/panels/HierarchyPanel.h @@ -2,7 +2,7 @@ #include "Panel.h" #include -#include "Managers/SceneManager.h" +#include "Core/ISceneManager.h" namespace XCEngine { namespace Editor { @@ -18,6 +18,7 @@ public: void Render() override; private: + void OnSelectionChanged(const struct SelectionChangedEvent& event); void RenderSearchBar(); void RenderEntity(::XCEngine::Components::GameObject* gameObject, const std::string& filter); void RenderContextMenu(::XCEngine::Components::GameObject* gameObject); @@ -33,6 +34,8 @@ private: char m_renameBuffer[256] = ""; bool m_renameJustStarted = false; SortMode m_sortMode = SortMode::Name; + uint64_t m_selectionHandlerId = 0; + bool m_needsRefresh = false; }; }