Refactor new editor state ownership model
This commit is contained in:
@@ -30,7 +30,12 @@ EditorWindowManager::~EditorWindowManager() = default;
|
||||
EditorWindow* EditorWindowManager::CreateEditorWindow(
|
||||
UIEditorWorkspaceController workspaceController,
|
||||
const CreateParams& params) {
|
||||
return m_hostRuntime->CreateEditorWindow(std::move(workspaceController), params);
|
||||
EditorWindow* const window =
|
||||
m_hostRuntime->CreateEditorWindow(std::move(workspaceController), params);
|
||||
if (window != nullptr) {
|
||||
m_workspaceCoordinator->RegisterExistingWindow(*window);
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
void EditorWindowManager::HandlePendingNativeWindowCreated(HWND hwnd) {
|
||||
@@ -93,6 +98,9 @@ void EditorWindowManager::EndGlobalTabDragSession() {
|
||||
}
|
||||
|
||||
void EditorWindowManager::HandleDestroyedWindow(HWND hwnd) {
|
||||
if (EditorWindow* window = m_hostRuntime->FindWindow(hwnd); window != nullptr) {
|
||||
m_workspaceCoordinator->HandleWindowDestroyed(*window);
|
||||
}
|
||||
m_hostRuntime->HandleDestroyedWindow(hwnd);
|
||||
}
|
||||
|
||||
@@ -284,6 +292,7 @@ void EditorWindowHostRuntime::RenderAllWindows(
|
||||
|
||||
EditorWindowFrameTransferRequests transferRequests =
|
||||
window->RenderFrame(m_editorContext, globalTabDragActive);
|
||||
workspaceCoordinator.CommitWindowProjection(*window);
|
||||
if (!transferRequests.HasPendingRequests()) {
|
||||
continue;
|
||||
}
|
||||
@@ -382,64 +391,86 @@ void EditorWindowHostRuntime::LogRuntimeTrace(
|
||||
|
||||
EditorWindowWorkspaceCoordinator::EditorWindowWorkspaceCoordinator(
|
||||
EditorWindowHostRuntime& hostRuntime)
|
||||
: m_hostRuntime(hostRuntime) {}
|
||||
: m_hostRuntime(hostRuntime),
|
||||
m_workspaceStore(hostRuntime.GetEditorContext().GetShellAsset().panelRegistry) {}
|
||||
|
||||
EditorWindowWorkspaceCoordinator::~EditorWindowWorkspaceCoordinator() = default;
|
||||
|
||||
UIEditorWindowWorkspaceSet EditorWindowWorkspaceCoordinator::BuildWindowWorkspaceSet(
|
||||
std::string_view activeWindowId) const {
|
||||
UIEditorWindowWorkspaceSet windowSet = {};
|
||||
if (const EditorWindow* primaryWindow = m_hostRuntime.FindPrimaryWindow();
|
||||
primaryWindow != nullptr &&
|
||||
primaryWindow->GetHwnd() != nullptr &&
|
||||
!primaryWindow->IsClosing()) {
|
||||
windowSet.primaryWindowId = std::string(primaryWindow->GetWindowId());
|
||||
void EditorWindowWorkspaceCoordinator::RegisterExistingWindow(EditorWindow& window) {
|
||||
std::string error = {};
|
||||
if (!m_workspaceStore.RegisterWindowProjection(
|
||||
window.GetWindowId(),
|
||||
window.IsPrimary(),
|
||||
window.GetWorkspaceController(),
|
||||
error)) {
|
||||
LogRuntimeTrace(
|
||||
"window",
|
||||
"failed to register window '" + std::string(window.GetWindowId()) +
|
||||
"' in workspace store: " + error);
|
||||
return;
|
||||
}
|
||||
|
||||
for (const std::unique_ptr<EditorWindow>& window : m_hostRuntime.GetWindows()) {
|
||||
if (window == nullptr ||
|
||||
window->GetHwnd() == nullptr ||
|
||||
window->IsClosing()) {
|
||||
continue;
|
||||
RefreshWindowTitle(window);
|
||||
}
|
||||
|
||||
void EditorWindowWorkspaceCoordinator::CommitWindowProjection(EditorWindow& window) {
|
||||
std::string error = {};
|
||||
if (!m_workspaceStore.CommitWindowProjection(
|
||||
window.GetWindowId(),
|
||||
window.GetWorkspaceController(),
|
||||
error)) {
|
||||
if (m_workspaceStore.RegisterWindowProjection(
|
||||
window.GetWindowId(),
|
||||
window.IsPrimary(),
|
||||
window.GetWorkspaceController(),
|
||||
error)) {
|
||||
RefreshWindowTitle(window);
|
||||
return;
|
||||
}
|
||||
|
||||
UIEditorWindowWorkspaceState entry = {};
|
||||
entry.windowId = std::string(window->GetWindowId());
|
||||
entry.workspace = window->GetWorkspaceController().GetWorkspace();
|
||||
entry.session = window->GetWorkspaceController().GetSession();
|
||||
windowSet.windows.push_back(std::move(entry));
|
||||
LogRuntimeTrace(
|
||||
"window",
|
||||
"failed to commit window projection for '" + std::string(window.GetWindowId()) +
|
||||
"': " + error);
|
||||
return;
|
||||
}
|
||||
|
||||
windowSet.activeWindowId =
|
||||
!activeWindowId.empty() &&
|
||||
([this, activeWindowId]() {
|
||||
const EditorWindow* activeWindow = m_hostRuntime.FindWindow(activeWindowId);
|
||||
return activeWindow != nullptr &&
|
||||
activeWindow->GetHwnd() != nullptr &&
|
||||
!activeWindow->IsClosing();
|
||||
})()
|
||||
? std::string(activeWindowId)
|
||||
: windowSet.primaryWindowId;
|
||||
RefreshWindowTitle(window);
|
||||
}
|
||||
|
||||
return windowSet;
|
||||
void EditorWindowWorkspaceCoordinator::HandleWindowDestroyed(const EditorWindow& window) {
|
||||
m_workspaceStore.RemoveWindow(window.GetWindowId(), window.IsPrimary());
|
||||
}
|
||||
|
||||
UIEditorWindowWorkspaceController
|
||||
EditorWindowWorkspaceCoordinator::BuildLiveWindowWorkspaceController(
|
||||
std::string_view activeWindowId) const {
|
||||
return UIEditorWindowWorkspaceController(
|
||||
m_hostRuntime.GetEditorContext().GetShellAsset().panelRegistry,
|
||||
BuildWindowWorkspaceSet(activeWindowId));
|
||||
EditorWindowWorkspaceCoordinator::BuildWorkspaceMutationController() const {
|
||||
return m_workspaceStore.BuildMutationController();
|
||||
}
|
||||
|
||||
UIEditorWorkspaceController EditorWindowWorkspaceCoordinator::BuildWorkspaceControllerForWindow(
|
||||
const UIEditorWindowWorkspaceState& windowState) const {
|
||||
return UIEditorWorkspaceController(
|
||||
m_hostRuntime.GetEditorContext().GetShellAsset().panelRegistry,
|
||||
m_workspaceStore.GetPanelRegistry(),
|
||||
windowState.workspace,
|
||||
windowState.session);
|
||||
}
|
||||
|
||||
void EditorWindowWorkspaceCoordinator::RefreshWindowTitle(EditorWindow& window) const {
|
||||
if (window.IsPrimary()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const std::wstring title = BuildWindowTitle(window.GetWorkspaceController());
|
||||
if (title == window.GetTitle()) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.SetTitle(title);
|
||||
if (window.GetHwnd() != nullptr) {
|
||||
SetWindowTextW(window.GetHwnd(), window.GetTitle().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void EditorWindowWorkspaceCoordinator::HandleWindowFrameTransferRequests(
|
||||
EditorWindow& sourceWindow,
|
||||
EditorWindowFrameTransferRequests&& transferRequests) {
|
||||
|
||||
Reference in New Issue
Block a user