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
This commit is contained in:
2026-03-25 16:41:21 +08:00
parent 605d086bcc
commit 621a135ef7
2 changed files with 20 additions and 1 deletions

View File

@@ -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 <XCEngine/Core/Math/Vector3.h>
#include <XCEngine/Core/Math/Quaternion.h>
#include <imgui.h>
@@ -13,11 +16,24 @@ HierarchyPanel::HierarchyPanel() : Panel("Hierarchy") {
}
HierarchyPanel::~HierarchyPanel() {
if (m_context) {
m_context->GetEventBus().Unsubscribe<SelectionChangedEvent>(m_selectionHandlerId);
}
}
void HierarchyPanel::OnAttach() {
auto& sceneManager = m_context->GetSceneManager();
sceneManager.CreateDemoScene();
m_selectionHandlerId = m_context->GetEventBus().Subscribe<SelectionChangedEvent>(
[this](const SelectionChangedEvent& event) {
OnSelectionChanged(event);
}
);
}
void HierarchyPanel::OnSelectionChanged(const SelectionChangedEvent& event) {
m_needsRefresh = true;
}
void HierarchyPanel::Render() {

View File

@@ -2,7 +2,7 @@
#include "Panel.h"
#include <XCEngine/Components/GameObject.h>
#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;
};
}