@@ -75,66 +75,16 @@ fun ListPopup(
7575) {
7676 if (! show.value) return
7777
78- val currentOnDismissRequest by rememberUpdatedState(onDismissRequest)
79- val currentContent by rememberUpdatedState(content)
80-
81- var offset by remember { mutableStateOf(IntOffset .Zero ) }
8278 val density = LocalDensity .current
8379 val layoutDirection = LocalLayoutDirection .current
8480
8581 val getWindowSizeState = rememberUpdatedState(getWindowSize())
8682 var windowSize by remember { mutableStateOf(IntSize (getWindowSizeState.value.width, getWindowSizeState.value.height)) }
8783 var parentBounds by remember { mutableStateOf(IntRect .Zero ) }
8884
89- val windowBounds = with (density) {
90- IntRect (
91- left = WindowInsets .displayCutout.asPaddingValues(density).calculateLeftPadding(layoutDirection).roundToPx(),
92- top = WindowInsets .statusBars.asPaddingValues().calculateTopPadding().roundToPx(),
93- right = windowSize.width -
94- WindowInsets .displayCutout.asPaddingValues(density).calculateRightPadding(layoutDirection).roundToPx(),
95- bottom = windowSize.height -
96- WindowInsets .navigationBars.asPaddingValues().calculateBottomPadding().roundToPx() -
97- WindowInsets .captionBar.asPaddingValues().calculateBottomPadding().roundToPx()
98- )
99- }
100-
101- var popupContentSize by remember { mutableStateOf(IntSize .Zero ) }
102-
103- val popupMargin = remember(popupPositionProvider, density, layoutDirection) {
104- val popupMarginsPd = popupPositionProvider.getMargins()
105- with (density) {
106- IntRect (
107- left = popupMarginsPd.calculateLeftPadding(layoutDirection).roundToPx(),
108- top = popupMarginsPd.calculateTopPadding().roundToPx(),
109- right = popupMarginsPd.calculateRightPadding(layoutDirection).roundToPx(),
110- bottom = popupMarginsPd.calculateBottomPadding().roundToPx()
111- )
112- }
113- }
114-
115- val transformOrigin = remember(parentBounds, popupMargin, windowSize, density, alignment) {
116- val xInWindow = if (alignment in listOf (
117- PopupPositionProvider .Align .Right ,
118- PopupPositionProvider .Align .TopRight ,
119- PopupPositionProvider .Align .BottomRight ,
120- )
121- ) {
122- parentBounds.right - popupMargin.right - with (density) { 64 .dp.roundToPx() }
123- } else {
124- parentBounds.left + popupMargin.left + with (density) { 64 .dp.roundToPx() }
125- }
126- val yInWindow = parentBounds.top + parentBounds.height / 2 - with (density) { 56 .dp.roundToPx() }
127- safeTransformOrigin(
128- xInWindow / windowSize.width.toFloat(),
129- yInWindow / windowSize.height.toFloat()
130- )
131- }
132-
133- // Anchor point for the popup
13485 Layout (
13586 modifier = Modifier .onGloballyPositioned { childCoordinates ->
136- val parentLayoutCoordinates = childCoordinates.parentLayoutCoordinates
137- if (parentLayoutCoordinates != null ) {
87+ childCoordinates.parentLayoutCoordinates?.let { parentLayoutCoordinates ->
13888 val positionInWindow = parentLayoutCoordinates.positionInWindow()
13989 parentBounds = IntRect (
14090 left = positionInWindow.x.toInt(),
@@ -149,10 +99,53 @@ fun ListPopup(
14999 windowSize = newIntSize
150100 }
151101 }
152- ) { _, _ ->
153- layout(0 , 0 ) {}
102+ ) { _, _ -> layout(0 , 0 ) {} }
103+
104+ val popupMargin = remember(popupPositionProvider, layoutDirection, density) {
105+ val pd = popupPositionProvider.getMargins()
106+ with (density) {
107+ IntRect (
108+ left = pd.calculateLeftPadding(layoutDirection).roundToPx(),
109+ top = pd.calculateTopPadding().roundToPx(),
110+ right = pd.calculateRightPadding(layoutDirection).roundToPx(),
111+ bottom = pd.calculateBottomPadding().roundToPx()
112+ )
113+ }
114+ }
115+
116+ val displayCutoutPadding = WindowInsets .displayCutout.asPaddingValues(density)
117+ val statusBarsPadding = WindowInsets .statusBars.asPaddingValues()
118+ val navigationBarsPadding = WindowInsets .navigationBars.asPaddingValues()
119+ val captionBarPadding = WindowInsets .captionBar.asPaddingValues()
120+
121+ val windowBounds = with (density) {
122+ IntRect (
123+ left = displayCutoutPadding.calculateLeftPadding(layoutDirection).roundToPx(),
124+ top = statusBarsPadding.calculateTopPadding().roundToPx(),
125+ right = windowSize.width - displayCutoutPadding.calculateRightPadding(layoutDirection).roundToPx(),
126+ bottom = windowSize.height -
127+ navigationBarsPadding.calculateBottomPadding().roundToPx() -
128+ captionBarPadding.calculateBottomPadding().roundToPx()
129+ )
130+ }
131+
132+ val transformOrigin = remember(parentBounds, popupMargin, windowSize, alignment, density) {
133+ val xInWindow = when (alignment) {
134+ PopupPositionProvider .Align .Right ,
135+ PopupPositionProvider .Align .TopRight ,
136+ PopupPositionProvider .Align .BottomRight -> parentBounds.right - popupMargin.right - with (density) { 64 .dp.roundToPx() }
137+ else -> parentBounds.left + popupMargin.left + with (density) { 64 .dp.roundToPx() }
138+ }
139+ val yInWindow = parentBounds.top + parentBounds.height / 2 - with (density) { 56 .dp.roundToPx() }
140+ safeTransformOrigin(
141+ xInWindow / windowSize.width.toFloat(),
142+ yInWindow / windowSize.height.toFloat()
143+ )
154144 }
155145
146+ var offset by remember { mutableStateOf(IntOffset .Zero ) }
147+ var popupContentSize by remember { mutableStateOf(IntSize .Zero ) }
148+
156149 PopupLayout (
157150 visible = show,
158151 enableWindowDim = enableWindowDim,
@@ -163,10 +156,10 @@ fun ListPopup(
163156
164157 Box (
165158 modifier = popupModifier
166- .pointerInput(currentOnDismissRequest ) {
167- detectTapGestures {
168- currentOnDismissRequest ?.invoke()
169- }
159+ .pointerInput(onDismissRequest ) {
160+ detectTapGestures(
161+ onTap = { onDismissRequest ?.invoke() }
162+ )
170163 }
171164 .layout { measurable, constraints ->
172165 val placeable = measurable.measure(
@@ -213,13 +206,13 @@ fun ListPopup(
213206 )
214207 .background(MiuixTheme .colorScheme.surface)
215208 ) {
216- currentContent ()
209+ content ()
217210 }
218211 }
219212 }
220213
221214 BackHandler (enabled = show.value) {
222- currentOnDismissRequest ?.invoke()
215+ onDismissRequest ?.invoke()
223216 }
224217}
225218
0 commit comments