234 lines
9.5 KiB
C++
234 lines
9.5 KiB
C++
#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 <XCEditor/Foundation/UIEditorTextMeasurement.h>
|
|
#include <XCEditor/Shell/UIEditorShellInteraction.h>
|
|
#include <XCEditor/Windowing/Presentation/EditorWorkspaceWindowProjection.h>
|
|
#include <XCEngine/UI/Types.h>
|
|
|
|
#include <filesystem>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
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<const Rendering::Host::EditorWindowRenderRuntimeSurface> 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<EditorWindowScreenPoint> 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<EditorHostWindow*> GetWindows() = 0;
|
|
virtual std::vector<const EditorHostWindow*> 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
|