#include #include namespace XCEngine::UI::Editor { namespace { bool HasMeaningfulViewportInputFrame(const UIEditorViewportInputBridgeFrame& frame) { return frame.pointerMoved || frame.pointerPressedInside || frame.pointerReleasedInside || frame.focusGained || frame.focusLost || frame.captureStarted || frame.captureEnded || frame.wheelDelta != 0.0f || !frame.pressedKeyCodes.empty() || !frame.releasedKeyCodes.empty() || !frame.characters.empty(); } } // namespace UIEditorWorkspaceInteractionFrame UpdateUIEditorWorkspaceInteraction( UIEditorWorkspaceInteractionState& state, UIEditorWorkspaceController& controller, const ::XCEngine::UI::UIRect& bounds, const UIEditorWorkspaceInteractionModel& model, const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents, const Widgets::UIEditorDockHostMetrics& dockHostMetrics, const Widgets::UIEditorViewportSlotMetrics& viewportMetrics) { UIEditorWorkspaceInteractionFrame frame = {}; frame.dockHostFrame = UpdateUIEditorDockHostInteraction( state.dockHostInteractionState, controller, bounds, inputEvents, dockHostMetrics); frame.composeFrame = UpdateUIEditorWorkspaceCompose( state.composeState, bounds, controller.GetPanelRegistry(), controller.GetWorkspace(), controller.GetSession(), model.workspacePresentations, inputEvents, state.dockHostInteractionState.dockHostState, dockHostMetrics, viewportMetrics); frame.result.dockHostResult = frame.dockHostFrame.result; frame.result.consumed = frame.dockHostFrame.result.consumed; frame.result.requestPointerCapture = frame.dockHostFrame.result.requestPointerCapture; frame.result.releasePointerCapture = frame.dockHostFrame.result.releasePointerCapture; for (const UIEditorWorkspaceViewportComposeFrame& viewportFrame : frame.composeFrame.viewportFrames) { const UIEditorViewportInputBridgeFrame& inputFrame = viewportFrame.viewportShellFrame.inputFrame; const bool meaningfulInput = HasMeaningfulViewportInputFrame(inputFrame); if (!meaningfulInput && !inputFrame.captureStarted && !inputFrame.captureEnded) { continue; } if (frame.result.viewportPanelId.empty()) { frame.result.viewportPanelId = viewportFrame.panelId; frame.result.viewportInputFrame = inputFrame; } frame.result.viewportInteractionChanged = frame.result.viewportInteractionChanged || meaningfulInput; frame.result.requestPointerCapture = frame.result.requestPointerCapture || inputFrame.captureStarted; frame.result.releasePointerCapture = frame.result.releasePointerCapture || inputFrame.captureEnded; } frame.result.consumed = frame.result.consumed || frame.result.viewportInteractionChanged || frame.result.requestPointerCapture || frame.result.releasePointerCapture; return frame; } } // namespace XCEngine::UI::Editor