Files
XCEngine/editor/app/Windowing/Host/EditorWindowHostInterfaces.h

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