#pragma once #include "Windowing/EditorWindowShared.h" #include "Windowing/Frame/EditorWindowTransferRequests.h" #include "Windowing/Host/EditorWindowHostTypes.h" #include "Windowing/Host/EditorWindowPointerCapture.h" #include "Windowing/Host/EditorWindowTypes.h" #include #include #include #include #include #include #include #include #include #include #include namespace XCEngine::UI { struct UIPoint; } // namespace XCEngine::UI namespace XCEngine::UI::Editor { struct UIEditorDockHostTabDropTarget; namespace Rendering::Host { class EditorWindowRenderRuntimeSurface; } } // namespace XCEngine::UI::Editor namespace XCEngine::UI::Editor::App { class EditorWindowHostCoordinator; class EditorWindowDockHostBinding; class EditorWindowInputFeedbackBinding; class EditorWindowTitleBarBinding; struct EditorHostWindowRuntimeInitializationParams { std::filesystem::path repoRoot = {}; std::filesystem::path captureRoot = {}; bool autoCaptureOnStartup = false; }; struct EditorNativeWindowRuntimeSurface { std::shared_ptr renderSurface = {}; std::uint32_t widthPixels = 0u; std::uint32_t heightPixels = 0u; float dpiScale = 1.0f; bool IsValid() const { return renderSurface != nullptr && widthPixels > 0u && heightPixels > 0u; } }; struct EditorNativeWindowFrameSnapshot { std::uint32_t widthPixels = 0u; std::uint32_t heightPixels = 0u; float widthDips = 0.0f; float heightDips = 0.0f; float dpiScale = 1.0f; ::XCEngine::UI::UIRect workspaceBounds = {}; std::vector<::XCEngine::UI::UIInputEvent> inputEvents = {}; std::optional cursorScreenPoint = {}; bool useDetachedTitleBarTabStrip = false; bool IsValid() const { return widthPixels > 0u && heightPixels > 0u && widthDips > 0.0f && heightDips > 0.0f; } }; struct EditorNativeWindowFrameCommands { bool applyShellRuntimePointerCapture = false; bool applyCurrentCursor = false; }; struct EditorNativeWindowMetrics { float dpiScale = 1.0f; }; class EditorWindowNativePeer; class EditorHostWindow { public: virtual ~EditorHostWindow() = default; virtual std::string_view GetWindowId() const = 0; virtual EditorWindowLifecycleState GetLifecycleState() const = 0; virtual const EditorWindowChromePolicy& GetChromePolicy() const = 0; virtual bool IsPrimary() const = 0; virtual bool IsWorkspaceWindow() const = 0; virtual bool IsUtilityWindow() const = 0; virtual bool IsClosing() const = 0; virtual bool IsDestroyed() const = 0; virtual bool HasLiveHostWindow() const = 0; virtual const std::wstring& GetTitle() const = 0; virtual std::string_view GetCachedTitleText() const = 0; virtual const EditorWorkspaceWindowProjection* TryGetWorkspaceProjection() const = 0; virtual EditorWindowDockHostBinding* TryGetDockHostBinding() = 0; virtual const EditorWindowDockHostBinding* TryGetDockHostBinding() const = 0; virtual const EditorWindowInputFeedbackBinding* TryGetInputFeedbackBinding() const = 0; virtual const EditorWindowTitleBarBinding* TryGetTitleBarBinding() const = 0; virtual const UIEditorShellInteractionFrame& GetShellFrame() const = 0; virtual const UIEditorShellInteractionState& GetShellInteractionState() const = 0; virtual ::XCEngine::UI::UISize ResolveMinimumOuterSize() const = 0; virtual UIEditorTextMeasurer& GetTextMeasurer() = 0; virtual const UIEditorTextMeasurer& GetTextMeasurer() const = 0; virtual const ::XCEngine::UI::UITextureHandle& GetTitleBarLogoIcon() const = 0; virtual std::string BuildFrameRateText() const = 0; virtual ::XCEngine::UI::UIPoint ConvertScreenPixelsToClientDips( const EditorWindowScreenPoint& screenPoint) const = 0; virtual bool TryResolveDockTabDragHotspot( std::string_view nodeId, std::string_view panelId, const EditorWindowScreenPoint& screenPoint, EditorWindowScreenPoint& outHotspot) const = 0; virtual bool TryResolveDockTabDropTarget( const EditorWindowScreenPoint& screenPoint, UIEditorDockHostTabDropTarget& outTarget) const = 0; virtual void InvalidateHostWindow() const = 0; virtual void SetPrimary(bool primary) = 0; virtual void SetTitle(std::wstring title) = 0; virtual void ApplyHostWindowTitle() = 0; virtual void RefreshWorkspaceProjection(EditorWorkspaceWindowProjection projection) = 0; virtual void ResetInteractionState() = 0; virtual void SetDpiScale(float dpiScale) = 0; virtual bool ApplyResize(std::uint32_t width, std::uint32_t height) = 0; virtual void AcquirePointerCapture(EditorWindowPointerCaptureOwner owner) = 0; virtual void ReleasePointerCapture(EditorWindowPointerCaptureOwner owner) = 0; virtual void AttachNativePeer(EditorWindowNativePeer& nativePeer) = 0; virtual void DetachNativePeer(EditorWindowNativePeer& nativePeer) = 0; virtual void MarkNativeAttached() = 0; virtual void MarkInitializing() = 0; virtual void MarkRunning() = 0; virtual void MarkClosing() = 0; virtual void MarkDestroyed() = 0; virtual bool IsRenderReady() const = 0; virtual bool InitializeRuntime( const EditorHostWindowRuntimeInitializationParams& params) = 0; virtual EditorWindowFrameTransferRequests RenderHostFrame( bool globalTabDragActive) = 0; virtual void ValidateHostFrame() const = 0; virtual void RequestSkipNextSteadyStateFrame() = 0; virtual bool ConsumeSkipNextSteadyStateFrame() = 0; virtual void Shutdown() = 0; virtual bool TryGetHostScreenRect(EditorWindowScreenRect& outRect) const = 0; virtual void SetHostScreenPosition(const EditorWindowScreenPoint& screenPoint) = 0; virtual void FocusHostWindow() = 0; virtual void PostCloseToHost() = 0; virtual void DestroyHostWindow() = 0; virtual void RequestManualScreenshot(std::string reason) = 0; }; class EditorWindowNativePeer { public: virtual ~EditorWindowNativePeer() = default; virtual bool HasLiveHostWindow() const = 0; virtual EditorNativeWindowMetrics CaptureMetrics() const = 0; virtual bool CaptureRuntimeSurface( const EditorHostWindow& window, EditorNativeWindowRuntimeSurface& outSurface) = 0; virtual bool CaptureFrameSnapshot( const EditorHostWindow& window, const UIEditorShellInteractionState& shellState, EditorNativeWindowFrameSnapshot& outSnapshot) = 0; virtual void ApplyFrameCommands( const EditorHostWindow& window, const EditorNativeWindowFrameCommands& commands) = 0; virtual void AppendChrome( const EditorHostWindow& window, ::XCEngine::UI::UIDrawList& drawList, float clientWidthDips) const = 0; virtual void PrepareRuntimeInitialization(EditorHostWindow& window) = 0; virtual void ShutdownNativeInteraction() = 0; virtual void ResetNativeInteractionState() = 0; virtual void ValidateHostFrame() const = 0; virtual void InvalidateHostWindow() const = 0; virtual ::XCEngine::UI::UIPoint ConvertScreenPixelsToClientDips( const EditorWindowScreenPoint& screenPoint) const = 0; virtual bool TryGetHostScreenRect(EditorWindowScreenRect& outRect) const = 0; virtual void SetHostScreenPosition(const EditorWindowScreenPoint& screenPoint) = 0; virtual void FocusHostWindow() = 0; virtual void PostCloseToHost() = 0; virtual void DestroyHostWindow() = 0; virtual void ApplyHostWindowTitle(const std::wstring& title) = 0; virtual void AcquirePointerCapture(EditorWindowPointerCaptureOwner owner) = 0; virtual void ReleasePointerCapture(EditorWindowPointerCaptureOwner owner) = 0; virtual void RequestSkipNextSteadyStateFrame() = 0; virtual bool ConsumeSkipNextSteadyStateFrame() = 0; }; class EditorWindowHost { public: virtual ~EditorWindowHost() = default; virtual bool CreateHostWindow( EditorHostWindow& window, const EditorWindowCreateParams& params) = 0; virtual EditorHostWindow* FindWindowById(std::string_view windowId) = 0; virtual const EditorHostWindow* FindWindowById(std::string_view windowId) const = 0; virtual std::vector GetWindows() = 0; virtual std::vector GetWindows() const = 0; virtual std::wstring_view GetPrimaryWindowTitle() const = 0; virtual bool TryGetCursorScreenPoint(EditorWindowScreenPoint& outPoint) const = 0; virtual EditorWindowScreenRect ResolveFloatingPlacement( const EditorWindowScreenPoint& screenPoint, int preferredWidth, int preferredHeight) const = 0; virtual EditorHostWindow* FindWindowFromScreenPoint( const EditorWindowScreenPoint& screenPoint) = 0; virtual const EditorHostWindow* FindWindowFromScreenPoint( const EditorWindowScreenPoint& screenPoint) const = 0; virtual void ReapDestroyedWindows() = 0; virtual std::string DescribeWindows() const = 0; virtual void LogRuntimeTrace(std::string_view channel, std::string_view message) const = 0; }; class EditorWindowHostRuntimeServices : public EditorWindowHost { public: virtual ~EditorWindowHostRuntimeServices() = default; virtual void BindHostCoordinator(EditorWindowHostCoordinator& hostCoordinator) = 0; }; } // namespace XCEngine::UI::Editor::App