Add workspace interaction coordination contract

This commit is contained in:
2026-04-07 11:12:18 +08:00
parent 5d57101da3
commit 0d6a4113e7
11 changed files with 1140 additions and 0 deletions

View File

@@ -0,0 +1,86 @@
#include <XCEditor/Core/UIEditorWorkspaceInteraction.h>
#include <utility>
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) {
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);
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