Add workspace interaction coordination contract
This commit is contained in:
86
new_editor/src/Core/UIEditorWorkspaceInteraction.cpp
Normal file
86
new_editor/src/Core/UIEditorWorkspaceInteraction.cpp
Normal 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
|
||||
Reference in New Issue
Block a user