Add workspace panel overlay routing

This commit is contained in:
2026-04-29 17:34:31 +08:00
parent 4a125cbe7f
commit f74503c2a5
21 changed files with 458 additions and 53 deletions

View File

@@ -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(

View File

@@ -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());