diff --git a/editor/AGENTS.md b/editor/AGENTS.md index 47a4cbea..c0d4a319 100644 --- a/editor/AGENTS.md +++ b/editor/AGENTS.md @@ -8,7 +8,7 @@ The editor is a two-layer system. - The build shape of `editor/` is `XCUIEditorLib <- XCUIEditorApp`. - `editor/src/**` and `editor/include/XCEditor/**` belong to the framework layer. - `editor/app/**` belongs to the app layer and is compiled directly into `XCUIEditorApp`. -- Platform-neutral windowing authority, planner, projection, and synchronization code now live in `editor/src/Windowing` and `editor/include/XCEditor/Windowing`. +- App-internal windowing authority, planner, projection, and synchronization code now live in `editor/app/Windowing/System` and `editor/app/Windowing/Presentation`. - `app/Windowing` now owns app-side content controllers, coordinators, and frame transfer seams; `app/Platform/Win32` remains the concrete host. - Win32 hosting, utility windows, and editor-only rendering stay in `editor/app/**`. - `editor/include/XCEditor/**` exposes framework-level APIs only. @@ -308,8 +308,8 @@ Application::Run - `editor/app/Windowing/Content/EditorWindowContentController.h` - `editor/app/Windowing/Content/EditorWorkspaceWindowContentController.*` - `editor/app/Windowing/Frame/EditorWindowFrameOrchestrator.*` -- `editor/include/XCEditor/Windowing/EditorWindowSystem.h` -- `editor/src/Windowing/EditorWindowSystem.cpp` +- `editor/app/Windowing/System/EditorWindowSystem.h` +- `editor/app/Windowing/System/EditorWindowSystem.cpp` - `editor/app/Platform/Win32/Windowing/EditorWindow.*` - `editor/app/Platform/Win32/Windowing/EditorWindowHostRuntime.*` - `editor/app/Platform/Win32/Windowing/EditorWindowWorkspaceCoordinator.*` diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 2619374d..cbea546b 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -136,13 +136,6 @@ set(XCUI_EDITOR_WIDGET_SUPPORT_SOURCES src/Widgets/UIEditorFieldRowLayout.cpp ) -set(XCUI_EDITOR_WINDOWING_SOURCES - src/Windowing/EditorWindowPresentationPolicy.cpp - src/Windowing/EditorWindowSynchronizationPlanner.cpp - src/Windowing/EditorWindowSystem.cpp - src/Windowing/EditorWindowWorkspaceStore.cpp -) - set(XCUI_EDITOR_SHARED_SOURCES ${XCUI_EDITOR_FOUNDATION_SOURCES} ${XCUI_EDITOR_FIELD_SOURCES} @@ -154,7 +147,6 @@ set(XCUI_EDITOR_SHARED_SOURCES ${XCUI_EDITOR_VIEWPORT_SOURCES} ${XCUI_EDITOR_WORKSPACE_SOURCES} ${XCUI_EDITOR_WIDGET_SUPPORT_SOURCES} - ${XCUI_EDITOR_WINDOWING_SOURCES} ) add_library(XCUIEditorLib STATIC @@ -177,6 +169,27 @@ target_link_libraries(XCUIEditorLib PUBLIC xcui_editor_apply_common_target_settings(XCUIEditorLib PUBLIC) +set(XCUI_EDITOR_APP_WINDOWING_SOURCES + app/Windowing/Presentation/EditorWindowPresentationPolicy.cpp + app/Windowing/System/EditorWindowSynchronizationPlanner.cpp + app/Windowing/System/EditorWindowSystem.cpp + app/Windowing/System/EditorWindowWorkspaceStore.cpp +) + +add_library(XCUIEditorAppWindowing STATIC + ${XCUI_EDITOR_APP_WINDOWING_SOURCES} +) + +target_include_directories(XCUIEditorAppWindowing PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/app +) + +target_link_libraries(XCUIEditorAppWindowing PUBLIC + XCUIEditorLib +) + +xcui_editor_apply_common_target_settings(XCUIEditorAppWindowing PUBLIC) + set(XCUI_EDITOR_HOST_PLATFORM_SOURCES app/Platform/Win32/Chrome/BorderlessWindowChrome.cpp app/Platform/Win32/Chrome/BorderlessWindowFrame.cpp @@ -330,6 +343,7 @@ if(XCENGINE_BUILD_XCUI_EDITOR_APP) target_link_libraries(XCUIEditorApp PRIVATE XCEngine XCUIEditorLib + XCUIEditorAppWindowing XCEngineRenderingEditorSupport d3d12.lib d3dcompiler.lib diff --git a/editor/app/Bootstrap/Application.cpp b/editor/app/Bootstrap/Application.cpp index 1754a8b6..7e9b038d 100644 --- a/editor/app/Bootstrap/Application.cpp +++ b/editor/app/Bootstrap/Application.cpp @@ -13,7 +13,7 @@ #include "Support/ExecutablePath.h" #include -#include +#include "Windowing/System/EditorWindowSystem.h" #include #include diff --git a/editor/app/Windowing/Content/EditorWindowContentController.h b/editor/app/Windowing/Content/EditorWindowContentController.h index 4b7916a7..7b0ea12c 100644 --- a/editor/app/Windowing/Content/EditorWindowContentController.h +++ b/editor/app/Windowing/Content/EditorWindowContentController.h @@ -4,7 +4,7 @@ #include #include -#include +#include "Windowing/Presentation/EditorWorkspaceWindowProjection.h" #include #include diff --git a/editor/app/Windowing/Content/EditorWindowContentFactory.cpp b/editor/app/Windowing/Content/EditorWindowContentFactory.cpp index fe257536..5dad43fa 100644 --- a/editor/app/Windowing/Content/EditorWindowContentFactory.cpp +++ b/editor/app/Windowing/Content/EditorWindowContentFactory.cpp @@ -3,7 +3,7 @@ #include "Windowing/Content/EditorUtilityWindowContentController.h" #include "Windowing/Content/EditorWorkspaceWindowContentController.h" -#include +#include "Windowing/System/EditorWindowSystem.h" #include diff --git a/editor/app/Windowing/Content/EditorWorkspaceWindowContentController.cpp b/editor/app/Windowing/Content/EditorWorkspaceWindowContentController.cpp index 3386a55a..ba458c9e 100644 --- a/editor/app/Windowing/Content/EditorWorkspaceWindowContentController.cpp +++ b/editor/app/Windowing/Content/EditorWorkspaceWindowContentController.cpp @@ -1,8 +1,8 @@ #include "Windowing/Content/EditorWorkspaceWindowContentController.h" #include -#include -#include +#include "Windowing/Presentation/EditorWindowPresentationPolicy.h" +#include "Windowing/System/EditorWindowSystem.h" #include #include diff --git a/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.cpp b/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.cpp index 843e57fa..6afac72c 100644 --- a/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.cpp +++ b/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.cpp @@ -4,8 +4,8 @@ #include "Windowing/Coordinator/EditorWindowLifecycleCoordinator.h" #include -#include -#include +#include "Windowing/Presentation/EditorWindowPresentationPolicy.h" +#include "Windowing/System/EditorWindowSystem.h" #include #include #include diff --git a/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h b/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h index 8903e8bd..0cfaf43b 100644 --- a/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h +++ b/editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h @@ -7,8 +7,8 @@ #include "Windowing/Frame/EditorWindowTransferRequests.h" #include "Windowing/Host/EditorWindowHostInterfaces.h" -#include -#include +#include "Windowing/Presentation/EditorWorkspaceWindowProjection.h" +#include "Windowing/System/EditorWindowSynchronizationPlan.h" #include #include diff --git a/editor/app/Windowing/Frame/EditorWindowTransferRequests.h b/editor/app/Windowing/Frame/EditorWindowTransferRequests.h index 46afa5e0..f68b2742 100644 --- a/editor/app/Windowing/Frame/EditorWindowTransferRequests.h +++ b/editor/app/Windowing/Frame/EditorWindowTransferRequests.h @@ -7,7 +7,7 @@ #include "Windowing/EditorWindowShared.h" #include "UtilityWindows/EditorUtilityWindowKind.h" -#include +#include "Windowing/System/EditorWindowSynchronizationPlan.h" #include #include diff --git a/editor/app/Windowing/Host/EditorWindowHostInterfaces.h b/editor/app/Windowing/Host/EditorWindowHostInterfaces.h index 2db954ee..26037d67 100644 --- a/editor/app/Windowing/Host/EditorWindowHostInterfaces.h +++ b/editor/app/Windowing/Host/EditorWindowHostInterfaces.h @@ -5,7 +5,7 @@ #include "Windowing/Host/EditorWindowPointerCapture.h" #include "Windowing/Host/EditorWindowTypes.h" -#include +#include "Windowing/Presentation/EditorWorkspaceWindowProjection.h" #include #include diff --git a/editor/src/Windowing/EditorWindowPresentationPolicy.cpp b/editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.cpp similarity index 97% rename from editor/src/Windowing/EditorWindowPresentationPolicy.cpp rename to editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.cpp index 9e735bb6..7cd059fb 100644 --- a/editor/src/Windowing/EditorWindowPresentationPolicy.cpp +++ b/editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.cpp @@ -1,4 +1,4 @@ -#include +#include "Windowing/Presentation/EditorWindowPresentationPolicy.h" #include #include diff --git a/editor/include/XCEditor/Windowing/EditorWindowPresentationPolicy.h b/editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.h similarity index 90% rename from editor/include/XCEditor/Windowing/EditorWindowPresentationPolicy.h rename to editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.h index e65a0e00..1422eb52 100644 --- a/editor/include/XCEditor/Windowing/EditorWindowPresentationPolicy.h +++ b/editor/app/Windowing/Presentation/EditorWindowPresentationPolicy.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "Windowing/Presentation/EditorWorkspaceWindowProjection.h" #include #include diff --git a/editor/include/XCEditor/Windowing/EditorWorkspaceWindowProjection.h b/editor/app/Windowing/Presentation/EditorWorkspaceWindowProjection.h similarity index 100% rename from editor/include/XCEditor/Windowing/EditorWorkspaceWindowProjection.h rename to editor/app/Windowing/Presentation/EditorWorkspaceWindowProjection.h diff --git a/editor/include/XCEditor/Windowing/EditorWindowSynchronizationPlan.h b/editor/app/Windowing/System/EditorWindowSynchronizationPlan.h similarity index 100% rename from editor/include/XCEditor/Windowing/EditorWindowSynchronizationPlan.h rename to editor/app/Windowing/System/EditorWindowSynchronizationPlan.h diff --git a/editor/src/Windowing/EditorWindowSynchronizationPlanner.cpp b/editor/app/Windowing/System/EditorWindowSynchronizationPlanner.cpp similarity index 97% rename from editor/src/Windowing/EditorWindowSynchronizationPlanner.cpp rename to editor/app/Windowing/System/EditorWindowSynchronizationPlanner.cpp index 48df68b1..8cc77aad 100644 --- a/editor/src/Windowing/EditorWindowSynchronizationPlanner.cpp +++ b/editor/app/Windowing/System/EditorWindowSynchronizationPlanner.cpp @@ -1,6 +1,6 @@ -#include "Windowing/EditorWindowSynchronizationPlanner.h" +#include "Windowing/System/EditorWindowSynchronizationPlanner.h" -#include +#include "Windowing/Presentation/EditorWindowPresentationPolicy.h" #include #include diff --git a/editor/src/Windowing/EditorWindowSynchronizationPlanner.h b/editor/app/Windowing/System/EditorWindowSynchronizationPlanner.h similarity index 80% rename from editor/src/Windowing/EditorWindowSynchronizationPlanner.h rename to editor/app/Windowing/System/EditorWindowSynchronizationPlanner.h index 77695384..68e25591 100644 --- a/editor/src/Windowing/EditorWindowSynchronizationPlanner.h +++ b/editor/app/Windowing/System/EditorWindowSynchronizationPlanner.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "Windowing/System/EditorWindowSynchronizationPlan.h" namespace XCEngine::UI::Editor { diff --git a/editor/src/Windowing/EditorWindowSystem.cpp b/editor/app/Windowing/System/EditorWindowSystem.cpp similarity index 98% rename from editor/src/Windowing/EditorWindowSystem.cpp rename to editor/app/Windowing/System/EditorWindowSystem.cpp index 67514d56..a1b724fd 100644 --- a/editor/src/Windowing/EditorWindowSystem.cpp +++ b/editor/app/Windowing/System/EditorWindowSystem.cpp @@ -1,7 +1,7 @@ -#include +#include "Windowing/System/EditorWindowSystem.h" -#include "Windowing/EditorWindowSynchronizationPlanner.h" -#include "Windowing/EditorWindowWorkspaceStore.h" +#include "Windowing/System/EditorWindowSynchronizationPlanner.h" +#include "Windowing/System/EditorWindowWorkspaceStore.h" #include diff --git a/editor/include/XCEditor/Windowing/EditorWindowSystem.h b/editor/app/Windowing/System/EditorWindowSystem.h similarity index 97% rename from editor/include/XCEditor/Windowing/EditorWindowSystem.h rename to editor/app/Windowing/System/EditorWindowSystem.h index 1af794bb..141bd7a1 100644 --- a/editor/include/XCEditor/Windowing/EditorWindowSystem.h +++ b/editor/app/Windowing/System/EditorWindowSystem.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "Windowing/System/EditorWindowSynchronizationPlan.h" #include #include diff --git a/editor/src/Windowing/EditorWindowWorkspaceStore.cpp b/editor/app/Windowing/System/EditorWindowWorkspaceStore.cpp similarity index 95% rename from editor/src/Windowing/EditorWindowWorkspaceStore.cpp rename to editor/app/Windowing/System/EditorWindowWorkspaceStore.cpp index bad32ec2..eee44147 100644 --- a/editor/src/Windowing/EditorWindowWorkspaceStore.cpp +++ b/editor/app/Windowing/System/EditorWindowWorkspaceStore.cpp @@ -1,4 +1,4 @@ -#include "Windowing/EditorWindowWorkspaceStore.h" +#include "Windowing/System/EditorWindowWorkspaceStore.h" #include #include diff --git a/editor/src/Windowing/EditorWindowWorkspaceStore.h b/editor/app/Windowing/System/EditorWindowWorkspaceStore.h similarity index 100% rename from editor/src/Windowing/EditorWindowWorkspaceStore.h rename to editor/app/Windowing/System/EditorWindowWorkspaceStore.h diff --git a/tests/UI/Editor/unit/CMakeLists.txt b/tests/UI/Editor/unit/CMakeLists.txt index 284bc0ac..bdb258b2 100644 --- a/tests/UI/Editor/unit/CMakeLists.txt +++ b/tests/UI/Editor/unit/CMakeLists.txt @@ -104,6 +104,7 @@ add_executable(editor_windowing_phase1_tests target_link_libraries(editor_windowing_phase1_tests PRIVATE + XCUIEditorAppWindowing XCUIEditorLib GTest::gtest_main ) diff --git a/tests/UI/Editor/unit/test_editor_window_synchronization_planner.cpp b/tests/UI/Editor/unit/test_editor_window_synchronization_planner.cpp index b8ac4613..e5509f0b 100644 --- a/tests/UI/Editor/unit/test_editor_window_synchronization_planner.cpp +++ b/tests/UI/Editor/unit/test_editor_window_synchronization_planner.cpp @@ -1,8 +1,8 @@ #include -#include -#include -#include +#include "Windowing/Presentation/EditorWindowPresentationPolicy.h" +#include "Windowing/System/EditorWindowSynchronizationPlan.h" +#include "Windowing/System/EditorWindowSystem.h" #include #include #include @@ -82,6 +82,16 @@ EditorWindowHostSnapshot BuildWorkspaceSnapshot( return snapshot; } +XCEngine::UI::Editor::UIEditorWindowWorkspaceState BuildWindowState( + std::string windowId, + const XCEngine::UI::Editor::UIEditorWorkspaceController& workspaceController) { + XCEngine::UI::Editor::UIEditorWindowWorkspaceState windowState = {}; + windowState.windowId = std::move(windowId); + windowState.workspace = workspaceController.GetWorkspace(); + windowState.session = workspaceController.GetSession(); + return windowState; +} + EditorWindowSystem BuildSystem() { return EditorWindowSystem(BuildPanelRegistry()); } @@ -93,7 +103,10 @@ TEST(EditorWindowSynchronizationPlannerTest, ProducesNoActionsWhenHostAlreadyMat const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; auto plan = system.BuildSynchronizationPlan( EditorWindowSynchronizationPlannerInput{ @@ -118,7 +131,10 @@ TEST(EditorWindowSynchronizationPlannerTest, ProducesCreateActionForDetachedWind const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; UIEditorWindowWorkspaceController mutationController = system.BuildWorkspaceMutationController(); @@ -156,7 +172,10 @@ TEST(EditorWindowSynchronizationPlannerTest, ProducesCloseActionForRemovedDetach const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; UIEditorWindowWorkspaceController mutationController = system.BuildWorkspaceMutationController(); @@ -206,7 +225,10 @@ TEST(EditorWindowSynchronizationPlannerTest, ProducesUpdateActionWhenPrimaryWind const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; UIEditorWindowWorkspaceController mutationController = system.BuildWorkspaceMutationController(); @@ -346,7 +368,10 @@ TEST(EditorWindowSynchronizationPlannerTest, LiveWindowMutationBuildsCommitPlanW const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; auto liveController = workspaceController; const auto commandResult = liveController.Dispatch( @@ -356,9 +381,11 @@ TEST(EditorWindowSynchronizationPlannerTest, LiveWindowMutationBuildsCommitPlanW }); ASSERT_EQ(commandResult.status, UIEditorWorkspaceCommandStatus::Changed); - auto plan = system.BuildPlanForLiveWindowMutation( - "main", - liveController, + EditorWindowWorkspaceMutationRequest request = {}; + request.windowState = BuildWindowState("main", liveController); + + auto plan = system.BuildPlanForWorkspaceMutationRequest( + request, { BuildWorkspaceSnapshot( "main", @@ -384,7 +411,10 @@ TEST(EditorWindowSynchronizationPlannerTest, WorkspaceMutationRequestBuildsCommi const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; auto liveController = workspaceController; const auto commandResult = liveController.Dispatch( @@ -428,7 +458,10 @@ TEST(EditorWindowSynchronizationPlannerTest, WorkspaceMutationRequestRejectsUnkn const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; EditorWindowWorkspaceMutationRequest request = {}; request.windowState.windowId = "missing-window"; @@ -456,7 +489,10 @@ TEST(EditorWindowSynchronizationPlannerTest, DestroyedPrimaryWindowProducesClose const auto workspaceController = BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace()); std::string error = {}; - ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error; + ASSERT_TRUE(system.BootstrapPrimaryWindow( + "main", + BuildWindowState("main", workspaceController), + error)) << error; UIEditorWindowWorkspaceController mutationController = system.BuildWorkspaceMutationController();