Refactor workspace panel runtime ownership
This commit is contained in:
@@ -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>());
|
||||
|
||||
Reference in New Issue
Block a user