Add workspace panel overlay routing
This commit is contained in:
@@ -95,6 +95,32 @@ TEST(UIEditorPanelInputFilterTests, CapturedPointerEventsBypassBoundsWhenEnabled
|
||||
EXPECT_EQ(filtered[1].type, UIInputEventType::PointerButtonDown);
|
||||
}
|
||||
|
||||
TEST(UIEditorPanelInputFilterTests, ExtraOverlayBoundsAllowPointerEventsOutsidePanelRect) {
|
||||
const std::vector<UIRect> overlayBounds = {
|
||||
UIRect(120.0f, 10.0f, 80.0f, 80.0f)
|
||||
};
|
||||
const std::vector<UIInputEvent> filtered =
|
||||
FilterUIEditorPanelInputEvents(
|
||||
UIRect(0.0f, 0.0f, 100.0f, 100.0f),
|
||||
{
|
||||
MakePointerMove(150.0f, 30.0f),
|
||||
MakePointerButtonDown(160.0f, 35.0f),
|
||||
MakePointerMove(240.0f, 30.0f)
|
||||
},
|
||||
UIEditorPanelInputFilterOptions{
|
||||
.allowPointerInBounds = true,
|
||||
.allowPointerWhileCaptured = false,
|
||||
.allowKeyboardInput = false,
|
||||
.allowFocusEvents = false,
|
||||
.includePointerLeave = false
|
||||
},
|
||||
&overlayBounds);
|
||||
|
||||
ASSERT_EQ(filtered.size(), 2u);
|
||||
EXPECT_EQ(filtered[0].type, UIInputEventType::PointerMove);
|
||||
EXPECT_EQ(filtered[1].type, UIInputEventType::PointerButtonDown);
|
||||
}
|
||||
|
||||
TEST(UIEditorPanelInputFilterTests, SyntheticFocusTransitionsArePrependedToFilteredEvents) {
|
||||
const std::vector<UIInputEvent> filtered =
|
||||
BuildUIEditorPanelInputEvents(
|
||||
|
||||
@@ -208,6 +208,48 @@ TEST(UIEditorWorkspaceInteractionTest, HostedPanelPointerDownTransfersOwnerAndCl
|
||||
EXPECT_TRUE(frame.result.viewportInputFrame.captureEnded);
|
||||
}
|
||||
|
||||
TEST(UIEditorWorkspaceInteractionTest, OverlayRegionOutsidePanelBoundsResolvesHostedPanelOwner) {
|
||||
auto controller =
|
||||
BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace());
|
||||
UIEditorWorkspaceInteractionState state = {};
|
||||
UIEditorWorkspaceInteractionModel model = BuildInteractionModel();
|
||||
|
||||
auto frame = UpdateUIEditorWorkspaceInteraction(
|
||||
state,
|
||||
controller,
|
||||
UIRect(0.0f, 0.0f, 1280.0f, 720.0f),
|
||||
model,
|
||||
{});
|
||||
const auto* viewportFrame =
|
||||
FindUIEditorWorkspaceViewportPresentationFrame(frame.composeFrame, "viewport");
|
||||
ASSERT_NE(viewportFrame, nullptr);
|
||||
const UIPoint viewportCenter =
|
||||
RectCenter(viewportFrame->viewportShellFrame.slotLayout.inputRect);
|
||||
|
||||
model.panelOverlayRegions = {
|
||||
{
|
||||
"details",
|
||||
UIRect(viewportCenter.x - 24.0f, viewportCenter.y - 24.0f, 48.0f, 48.0f),
|
||||
true
|
||||
}
|
||||
};
|
||||
frame = UpdateUIEditorWorkspaceInteraction(
|
||||
state,
|
||||
controller,
|
||||
UIRect(0.0f, 0.0f, 1280.0f, 720.0f),
|
||||
model,
|
||||
{
|
||||
MakePointerEvent(
|
||||
UIInputEventType::PointerButtonDown,
|
||||
viewportCenter.x,
|
||||
viewportCenter.y,
|
||||
UIPointerButton::Left)
|
||||
});
|
||||
|
||||
EXPECT_TRUE(frame.inputOwnerChanged);
|
||||
EXPECT_TRUE(IsUIEditorWorkspaceHostedPanelInputOwner(frame.inputOwner, "details"));
|
||||
}
|
||||
|
||||
TEST(UIEditorWorkspaceInteractionTest, PointerUpInsideViewportBubblesPointerReleaseRequest) {
|
||||
auto controller =
|
||||
BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace());
|
||||
|
||||
Reference in New Issue
Block a user