89 lines
3.2 KiB
C++
89 lines
3.2 KiB
C++
#include <XCEditor/Shell/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,
|
|
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
|