Skip to content

Commit 9008781

Browse files
committed
fix: fix window size not updating immediately after rotating the screen;
fix: fix the button in Spinner's dialog is too small in some cases;
1 parent 342d604 commit 9008781

File tree

6 files changed

+306
-42
lines changed

6 files changed

+306
-42
lines changed

composeApp/src/commonMain/kotlin/UITest.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ import androidx.compose.foundation.layout.statusBarsPadding
1616
import androidx.compose.foundation.lazy.LazyColumn
1717
import androidx.compose.foundation.pager.PagerState
1818
import androidx.compose.foundation.pager.rememberPagerState
19-
import androidx.compose.material.icons.Icons
20-
import androidx.compose.material.icons.rounded.Home
21-
import androidx.compose.material.icons.rounded.Settings
2219
import androidx.compose.runtime.Composable
2320
import androidx.compose.runtime.LaunchedEffect
2421
import androidx.compose.runtime.MutableState
@@ -57,6 +54,8 @@ import top.yukonga.miuix.kmp.icon.icons.GitHub
5754
import top.yukonga.miuix.kmp.icon.icons.ImmersionMore
5855
import top.yukonga.miuix.kmp.icon.icons.Info
5956
import top.yukonga.miuix.kmp.icon.icons.More
57+
import top.yukonga.miuix.kmp.icon.icons.NavigatorSwitch
58+
import top.yukonga.miuix.kmp.icon.icons.Settings
6059
import top.yukonga.miuix.kmp.utils.MiuixPopupUtil.Companion.dismissPopup
6160
import utils.FPSMonitor
6261

@@ -84,9 +83,9 @@ fun UITest(
8483
}
8584

8685
val items = listOf(
87-
NavigationItem("HomePage", Icons.Rounded.Home),
86+
NavigationItem("HomePage", MiuixIcons.NavigatorSwitch),
8887
NavigationItem("DropDown", MiuixIcons.Info),
89-
NavigationItem("Settings", Icons.Rounded.Settings),
88+
NavigationItem("Settings", MiuixIcons.Settings),
9089
NavigationItem("More", MiuixIcons.More)
9190
)
9291

@@ -133,12 +132,16 @@ fun UITest(
133132
}
134133
) {
135134
LazyColumn {
136-
items(items.size) { index ->
135+
items(items.take(3).size) { index ->
137136
DropdownImpl(
138137
text = items[index].label,
139-
optionSize = items.size,
140-
isSelected = false,
138+
optionSize = items.take(3).size,
139+
isSelected = items[index] == items[targetPage],
141140
onSelectedIndexChange = {
141+
targetPage = index
142+
coroutineScope.launch {
143+
pagerState.animateScrollToPage(index)
144+
}
142145
dismissPopup(showTopPopup)
143146
isTopPopupExpanded.value = false
144147
},

miuix/src/androidMain/kotlin/top/yukonga/miuix/kmp/utils/Utils.android.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@ import android.annotation.SuppressLint
44
import android.os.Build
55
import android.view.RoundedCorner
66
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.platform.LocalConfiguration
78
import androidx.compose.ui.platform.LocalContext
89
import androidx.compose.ui.platform.LocalDensity
910
import androidx.compose.ui.platform.LocalView
1011
import androidx.compose.ui.unit.Dp
1112
import androidx.compose.ui.unit.dp
1213
import androidx.window.layout.WindowMetricsCalculator
14+
import kotlin.math.max
15+
import kotlin.math.min
1316

1417
@Composable
1518
actual fun getWindowSize(): WindowSize {
19+
val configuration = LocalConfiguration.current
20+
val screenWidthDp = configuration.screenWidthDp
21+
val screenHeightDp = configuration.screenHeightDp
1622
val context = LocalContext.current
1723
val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context)
1824
val widthPx = windowMetrics.bounds.width()
1925
val heightPx = windowMetrics.bounds.height()
20-
return WindowSize(widthPx, heightPx)
26+
return if (screenWidthDp > screenHeightDp)
27+
WindowSize(max(widthPx, heightPx), min(widthPx, heightPx))
28+
else
29+
WindowSize(min(widthPx, heightPx), max(widthPx, heightPx))
2130
}
2231

2332
actual fun platform(): Platform = Platform.Android

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic/ListPopup.kt

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,21 @@ fun ListPopup(
6868
val density = LocalDensity.current
6969
val layoutDirection = LocalLayoutDirection.current
7070
val getWindowSize = rememberUpdatedState(getWindowSize())
71-
val windowHeightPx by rememberUpdatedState(getWindowSize.value.height)
72-
val windowWidthPx by rememberUpdatedState(getWindowSize.value.width)
71+
var windowSize by remember { mutableStateOf(IntSize(getWindowSize.value.width, getWindowSize.value.height)) }
7372

7473
var parentBounds by remember { mutableStateOf(IntRect.Zero) }
7574
val windowBounds by rememberUpdatedState(with(density) {
7675
IntRect(
7776
left = WindowInsets.displayCutout.asPaddingValues(density).calculateLeftPadding(layoutDirection).roundToPx(),
7877
top = WindowInsets.statusBars.asPaddingValues().calculateTopPadding().roundToPx(),
79-
right = windowWidthPx -
78+
right = windowSize.width -
8079
WindowInsets.displayCutout.asPaddingValues(density).calculateRightPadding(layoutDirection).roundToPx(),
81-
bottom = windowHeightPx -
80+
bottom = windowSize.height -
8281
WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding().roundToPx() -
8382
WindowInsets.captionBar.asPaddingValues().calculateBottomPadding().roundToPx()
8483
)
8584
})
86-
var popupContentSize by remember { mutableStateOf(IntSize.Zero) }
85+
var popupContentSize = IntSize.Zero
8786
var popupMargin by remember { mutableStateOf(IntRect.Zero) }
8887

8988

@@ -155,14 +154,7 @@ fun ListPopup(
155154
maxHeight = windowBounds.height
156155
)
157156
)
158-
val popupMargins = popupPositionProvider.getMargins()
159157
popupContentSize = IntSize(placeable.width, placeable.height)
160-
popupMargin = IntRect(
161-
left = popupMargins.calculateLeftPadding(layoutDirection).roundToPx(),
162-
top = popupMargins.calculateTopPadding().roundToPx(),
163-
right = popupMargins.calculateRightPadding(layoutDirection).roundToPx(),
164-
bottom = popupMargins.calculateBottomPadding().roundToPx()
165-
)
166158
offset = popupPositionProvider.calculatePosition(
167159
parentBounds,
168160
windowBounds,
@@ -205,6 +197,9 @@ fun ListPopup(
205197
right = positionInWindow.x.toInt() + parentCoordinates.size.width,
206198
bottom = positionInWindow.y.toInt() + parentCoordinates.size.height
207199
)
200+
val windowHeightPx = getWindowSize.value.height
201+
val windowWidthPx = getWindowSize.value.width
202+
windowSize = IntSize(windowWidthPx, windowHeightPx)
208203
with(density) {
209204
val xInWindow = if (alignment in listOf(
210205
PopupPositionProvider.Align.Right,

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSpinner.kt

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.compose.ui.graphics.ColorFilter
3333
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
3434
import androidx.compose.ui.input.pointer.PointerEventType
3535
import androidx.compose.ui.input.pointer.pointerInput
36+
import androidx.compose.ui.layout.Layout
3637
import androidx.compose.ui.layout.onGloballyPositioned
3738
import androidx.compose.ui.layout.positionInWindow
3839
import androidx.compose.ui.platform.LocalHapticFeedback
@@ -344,30 +345,44 @@ fun SuperSpinner(
344345
},
345346
insideMargin = DpSize(0.dp, 24.dp)
346347
) {
347-
Column {
348-
LazyColumn {
349-
items(items.size) { index ->
350-
SpinnerItemImpl(
351-
entry = items[index],
352-
entryCount = items.size,
353-
isSelected = selectedIndex == index,
354-
index = index,
355-
dialogMode = true
356-
) {
357-
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
358-
onSelectedIndexChange?.let { it1 -> it1(it) }
359-
dismissDialog(isDropdownExpanded)
348+
Layout(
349+
content = {
350+
LazyColumn {
351+
items(items.size) { index ->
352+
SpinnerItemImpl(
353+
entry = items[index],
354+
entryCount = items.size,
355+
isSelected = selectedIndex == index,
356+
index = index,
357+
dialogMode = true
358+
) {
359+
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
360+
onSelectedIndexChange?.let { it1 -> it1(it) }
361+
dismissDialog(isDropdownExpanded)
362+
}
360363
}
361364
}
365+
TextButton(
366+
modifier = Modifier.padding(start = 24.dp, top = 12.dp, end = 24.dp).fillMaxWidth(),
367+
text = dialogButtonString,
368+
minHeight = 50.dp,
369+
onClick = {
370+
dismissDialog(isDropdownExpanded)
371+
}
372+
)
373+
}
374+
) { measurables, constraints ->
375+
if (measurables.size != 2) {
376+
layout(0, 0) { }
377+
}
378+
val button = measurables[1].measure(constraints)
379+
val lazyList = measurables[0].measure(constraints.copy(
380+
maxHeight = constraints.maxHeight - button.height
381+
))
382+
layout(constraints.maxWidth, lazyList.height + button.height) {
383+
lazyList.place(0, 0)
384+
button.place(0, lazyList.height)
362385
}
363-
TextButton(
364-
modifier = Modifier.padding(start = 24.dp, top = 12.dp, end = 24.dp).fillMaxWidth(),
365-
text = dialogButtonString,
366-
minHeight = 50.dp,
367-
onClick = {
368-
dismissDialog(isDropdownExpanded)
369-
}
370-
)
371386
}
372387
}
373388
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package top.yukonga.miuix.kmp.icon.icons
2+
3+
import androidx.compose.ui.graphics.Color
4+
import androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd
5+
import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
6+
import androidx.compose.ui.graphics.SolidColor
7+
import androidx.compose.ui.graphics.vector.ImageVector
8+
import androidx.compose.ui.graphics.vector.path
9+
import androidx.compose.ui.unit.dp
10+
import top.yukonga.miuix.kmp.icon.MiuixIcons
11+
12+
val MiuixIcons.NavigatorSwitch: ImageVector
13+
get() {
14+
if (_navigatorSwitch != null) return _navigatorSwitch!!
15+
_navigatorSwitch = ImageVector.Builder("NavigatorSwitch", 26.dp, 26.dp, 26.0f, 26.0f).apply {
16+
path(
17+
fill = SolidColor(Color.Black),
18+
pathFillType = EvenOdd
19+
) {
20+
moveTo(19.5406f, 4.2162f)
21+
curveTo(20.9407f, 4.2162f, 21.6408f, 4.2162f, 22.1755f, 4.4887f)
22+
curveTo(22.6459f, 4.7284f, 23.0284f, 5.1108f, 23.2681f, 5.5812f)
23+
curveTo(23.5406f, 6.116f, 23.5406f, 6.8161f, 23.5406f, 8.2162f)
24+
verticalLineTo(17.7838f)
25+
curveTo(23.5406f, 19.1839f, 23.5406f, 19.884f, 23.2681f, 20.4187f)
26+
curveTo(23.0284f, 20.8891f, 22.6459f, 21.2716f, 22.1755f, 21.5113f)
27+
curveTo(21.6408f, 21.7838f, 20.9407f, 21.7838f, 19.5406f, 21.7838f)
28+
horizontalLineTo(6.4595f)
29+
curveTo(5.0593f, 21.7838f, 4.3593f, 21.7838f, 3.8245f, 21.5113f)
30+
curveTo(3.3541f, 21.2716f, 2.9716f, 20.8891f, 2.732f, 20.4187f)
31+
curveTo(2.4595f, 19.884f, 2.4595f, 19.1839f, 2.4595f, 17.7838f)
32+
verticalLineTo(8.2162f)
33+
curveTo(2.4595f, 6.8161f, 2.4595f, 6.116f, 2.732f, 5.5812f)
34+
curveTo(2.9716f, 5.1108f, 3.3541f, 4.7284f, 3.8245f, 4.4887f)
35+
curveTo(4.3593f, 4.2162f, 5.0593f, 4.2162f, 6.4595f, 4.2162f)
36+
horizontalLineTo(19.5406f)
37+
close()
38+
moveTo(20.34f, 5.815f)
39+
curveTo(20.9001f, 5.815f, 21.1801f, 5.815f, 21.394f, 5.924f)
40+
curveTo(21.5822f, 6.0198f, 21.7351f, 6.1728f, 21.831f, 6.361f)
41+
curveTo(21.94f, 6.5749f, 21.94f, 6.8549f, 21.94f, 7.415f)
42+
verticalLineTo(18.585f)
43+
curveTo(21.94f, 19.145f, 21.94f, 19.4251f, 21.831f, 19.639f)
44+
curveTo(21.7351f, 19.8271f, 21.5822f, 19.9801f, 21.394f, 20.076f)
45+
curveTo(21.1801f, 20.185f, 20.9001f, 20.185f, 20.34f, 20.185f)
46+
horizontalLineTo(12.746f)
47+
verticalLineTo(5.815f)
48+
lineTo(20.34f, 5.815f)
49+
close()
50+
moveTo(11.146f, 5.815f)
51+
lineTo(5.66f, 5.815f)
52+
curveTo(5.0999f, 5.815f, 4.8199f, 5.815f, 4.606f, 5.924f)
53+
curveTo(4.4179f, 6.0198f, 4.2649f, 6.1728f, 4.169f, 6.361f)
54+
curveTo(4.06f, 6.5749f, 4.06f, 6.8549f, 4.06f, 7.415f)
55+
lineTo(4.06f, 18.585f)
56+
curveTo(4.06f, 19.145f, 4.06f, 19.4251f, 4.169f, 19.639f)
57+
curveTo(4.2649f, 19.8271f, 4.4179f, 19.9801f, 4.606f, 20.076f)
58+
curveTo(4.8199f, 20.185f, 5.0999f, 20.185f, 5.66f, 20.185f)
59+
horizontalLineTo(11.146f)
60+
verticalLineTo(5.815f)
61+
close()
62+
}
63+
path(
64+
fill = SolidColor(Color.Black),
65+
pathFillType = NonZero
66+
) {
67+
moveTo(9.3492f, 8.1689f)
68+
curveTo(9.3492f, 8.3903f, 9.3492f, 8.501f, 9.3185f, 8.5901f)
69+
curveTo(9.2621f, 8.7534f, 9.1338f, 8.8818f, 8.9704f, 8.9381f)
70+
curveTo(8.8813f, 8.9689f, 8.7706f, 8.9689f, 8.5492f, 8.9689f)
71+
horizontalLineTo(6.6357f)
72+
curveTo(6.4143f, 8.9689f, 6.3036f, 8.9689f, 6.2145f, 8.9381f)
73+
curveTo(6.0512f, 8.8818f, 5.9228f, 8.7534f, 5.8665f, 8.5901f)
74+
curveTo(5.8357f, 8.501f, 5.8357f, 8.3903f, 5.8357f, 8.1689f)
75+
curveTo(5.8357f, 7.9475f, 5.8357f, 7.8368f, 5.8665f, 7.7477f)
76+
curveTo(5.9228f, 7.5844f, 6.0512f, 7.456f, 6.2145f, 7.3996f)
77+
curveTo(6.3036f, 7.3689f, 6.4143f, 7.3689f, 6.6357f, 7.3689f)
78+
horizontalLineTo(8.5492f)
79+
curveTo(8.7706f, 7.3689f, 8.8813f, 7.3689f, 8.9704f, 7.3996f)
80+
curveTo(9.1338f, 7.456f, 9.2621f, 7.5844f, 9.3185f, 7.7477f)
81+
curveTo(9.3492f, 7.8368f, 9.3492f, 7.9475f, 9.3492f, 8.1689f)
82+
close()
83+
}
84+
path(
85+
fill = SolidColor(Color.Black),
86+
pathFillType = NonZero
87+
) {
88+
moveTo(9.3492f, 11.3311f)
89+
curveTo(9.3492f, 11.5525f, 9.3492f, 11.6632f, 9.3185f, 11.7523f)
90+
curveTo(9.2621f, 11.9156f, 9.1338f, 12.0439f, 8.9704f, 12.1003f)
91+
curveTo(8.8813f, 12.1311f, 8.7706f, 12.1311f, 8.5492f, 12.1311f)
92+
horizontalLineTo(6.6357f)
93+
curveTo(6.4143f, 12.1311f, 6.3036f, 12.1311f, 6.2145f, 12.1003f)
94+
curveTo(6.0512f, 12.0439f, 5.9228f, 11.9156f, 5.8665f, 11.7523f)
95+
curveTo(5.8357f, 11.6632f, 5.8357f, 11.5525f, 5.8357f, 11.3311f)
96+
curveTo(5.8357f, 11.1097f, 5.8357f, 10.999f, 5.8665f, 10.9098f)
97+
curveTo(5.9228f, 10.7465f, 6.0512f, 10.6182f, 6.2145f, 10.5618f)
98+
curveTo(6.3036f, 10.5311f, 6.4143f, 10.5311f, 6.6357f, 10.5311f)
99+
horizontalLineTo(8.5492f)
100+
curveTo(8.7706f, 10.5311f, 8.8813f, 10.5311f, 8.9704f, 10.5618f)
101+
curveTo(9.1338f, 10.6182f, 9.2621f, 10.7465f, 9.3185f, 10.9098f)
102+
curveTo(9.3492f, 10.999f, 9.3492f, 11.1097f, 9.3492f, 11.3311f)
103+
close()
104+
}
105+
path(
106+
fill = SolidColor(Color.Black),
107+
pathFillType = NonZero
108+
) {
109+
moveTo(5.8357f, 14.4932f)
110+
curveTo(5.8357f, 14.7146f, 5.8357f, 14.8253f, 5.8665f, 14.9144f)
111+
curveTo(5.9228f, 15.0778f, 6.0512f, 15.2061f, 6.2145f, 15.2625f)
112+
curveTo(6.3036f, 15.2932f, 6.4143f, 15.2932f, 6.6357f, 15.2932f)
113+
horizontalLineTo(8.5492f)
114+
curveTo(8.7706f, 15.2932f, 8.8813f, 15.2932f, 8.9704f, 15.2625f)
115+
curveTo(9.1338f, 15.2061f, 9.2621f, 15.0778f, 9.3185f, 14.9144f)
116+
curveTo(9.3492f, 14.8253f, 9.3492f, 14.7146f, 9.3492f, 14.4932f)
117+
curveTo(9.3492f, 14.2718f, 9.3492f, 14.1611f, 9.3185f, 14.072f)
118+
curveTo(9.2621f, 13.9087f, 9.1338f, 13.7803f, 8.9704f, 13.724f)
119+
curveTo(8.8813f, 13.6932f, 8.7706f, 13.6932f, 8.5492f, 13.6932f)
120+
horizontalLineTo(6.6357f)
121+
curveTo(6.4143f, 13.6932f, 6.3036f, 13.6932f, 6.2145f, 13.724f)
122+
curveTo(6.0512f, 13.7803f, 5.9228f, 13.9087f, 5.8665f, 14.072f)
123+
curveTo(5.8357f, 14.1611f, 5.8357f, 14.2718f, 5.8357f, 14.4932f)
124+
close()
125+
}
126+
}.build()
127+
return _navigatorSwitch!!
128+
}
129+
130+
private var _navigatorSwitch: ImageVector? = null

0 commit comments

Comments
 (0)