Refactor workspace panel runtime ownership

This commit is contained in:
2026-04-28 02:08:41 +08:00
parent 946c19f876
commit be0d244372
5 changed files with 168 additions and 142 deletions

View File

@@ -12,10 +12,8 @@
#include <XCEditor/Panels/UIEditorHostedPanelDispatch.h>
#include <algorithm>
#include <iterator>
#include <memory>
#include <sstream>
#include <utility>
namespace XCEngine::UI::Editor::App {
@@ -164,18 +162,6 @@ std::string DescribeHierarchyPanelEvent(const HierarchyPanel::Event& event) {
return stream.str();
}
template<typename AppendFn>
void AppendDrawPacket(
::XCEngine::UI::UIDrawData& drawData,
std::string debugName,
AppendFn&& appendFn) {
::XCEngine::UI::UIDrawList drawList(std::move(debugName));
appendFn(drawList);
if (!drawList.Empty()) {
drawData.AddDrawList(std::move(drawList));
}
}
class ConsoleWorkspacePanel final : public EditorWorkspacePanel {
public:
std::string_view GetPanelId() const override {
@@ -466,129 +452,6 @@ private:
} // namespace
void EditorWorkspacePanelRuntimeSet::AddPanel(
std::unique_ptr<EditorWorkspacePanel> panel) {
if (panel != nullptr) {
m_panels.push_back(std::move(panel));
}
}
void EditorWorkspacePanelRuntimeSet::Initialize(
const EditorWorkspacePanelInitializationContext& context) {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
panel->Initialize(context);
}
}
void EditorWorkspacePanelRuntimeSet::Shutdown(
const EditorWorkspacePanelShutdownContext& context) {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
panel->Shutdown(context);
}
}
void EditorWorkspacePanelRuntimeSet::ResetInteractionState() {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
panel->ResetInteractionState();
}
}
void EditorWorkspacePanelRuntimeSet::PrepareForShellDefinition(
EditorPanelServices& services,
UIEditorWorkspaceController& workspaceController) {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
panel->PrepareForShellDefinition(services, workspaceController);
}
}
void EditorWorkspacePanelRuntimeSet::UpdatePhase(
const EditorWorkspacePanelUpdateContext& context,
EditorWorkspacePanelUpdatePhase phase) {
const std::vector<EditorWorkspacePanel*> phasePanels =
BuildUpdateOrder(phase);
for (EditorWorkspacePanel* panel : phasePanels) {
panel->Update(context);
}
}
void EditorWorkspacePanelRuntimeSet::AppendDrawPackets(
::XCEngine::UI::UIDrawData& drawData) const {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
AppendDrawPacket(
drawData,
std::string(panel->GetDrawListId()),
[&](::XCEngine::UI::UIDrawList& drawList) {
panel->Append(drawList);
});
}
}
bool EditorWorkspacePanelRuntimeSet::HasActivePointerCapture() const {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
if (panel->HasActivePointerCapture()) {
return true;
}
}
return false;
}
EditorWorkspacePanelCursorKind
EditorWorkspacePanelRuntimeSet::GetHostedContentCursorKind() const {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
const EditorWorkspacePanelCursorKind cursorKind = panel->GetCursorKind();
if (cursorKind != EditorWorkspacePanelCursorKind::Arrow) {
return cursorKind;
}
}
return EditorWorkspacePanelCursorKind::Arrow;
}
EditorEditCommandRoute* EditorWorkspacePanelRuntimeSet::FindCommandRoute(
EditorActionRoute route) {
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
if (panel->GetActionRoute() == route) {
return panel->GetEditCommandRoute();
}
}
return nullptr;
}
std::vector<EditorWorkspacePanelFrameEvent>
EditorWorkspacePanelRuntimeSet::CollectFrameEvents() const {
std::vector<EditorWorkspacePanelFrameEvent> events = {};
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
std::vector<EditorWorkspacePanelFrameEvent> panelEvents =
panel->CollectFrameEvents();
events.insert(
events.end(),
std::make_move_iterator(panelEvents.begin()),
std::make_move_iterator(panelEvents.end()));
}
return events;
}
std::vector<EditorWorkspacePanel*> EditorWorkspacePanelRuntimeSet::BuildUpdateOrder(
EditorWorkspacePanelUpdatePhase phase) const {
std::vector<EditorWorkspacePanel*> panels = {};
panels.reserve(m_panels.size());
for (const std::unique_ptr<EditorWorkspacePanel>& panel : m_panels) {
if (panel->GetUpdatePhase() == phase) {
panels.push_back(panel.get());
}
}
std::sort(
panels.begin(),
panels.end(),
[](const EditorWorkspacePanel* left, const EditorWorkspacePanel* right) {
return left->GetUpdatePriority() < right->GetUpdatePriority();
});
return panels;
}
EditorWorkspacePanelRuntimeSet CreateEditorWorkspacePanelRuntimeSet() {
EditorWorkspacePanelRuntimeSet panels = {};
panels.AddPanel(std::make_unique<ConsoleWorkspacePanel>());