Skip to content

Commit 26f92c9

Browse files
committed
feat: new component ListPopup;
refactor: refactor SuperDropdown and SuperSpinner using ListPopup
1 parent de380be commit 26f92c9

File tree

8 files changed

+761
-586
lines changed

8 files changed

+761
-586
lines changed

composeApp/src/commonMain/kotlin/UITest.kt

Lines changed: 116 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import androidx.compose.foundation.layout.captionBarPadding
1111
import androidx.compose.foundation.layout.fillMaxSize
1212
import androidx.compose.foundation.layout.imePadding
1313
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.layout.size
1415
import androidx.compose.foundation.layout.statusBarsPadding
16+
import androidx.compose.foundation.lazy.LazyColumn
1517
import androidx.compose.foundation.pager.PagerState
1618
import androidx.compose.foundation.pager.rememberPagerState
1719
import androidx.compose.material.icons.Icons
18-
import androidx.compose.material.icons.rounded.Favorite
1920
import androidx.compose.material.icons.rounded.Home
20-
import androidx.compose.material.icons.rounded.Menu
2121
import androidx.compose.material.icons.rounded.Settings
2222
import androidx.compose.runtime.Composable
2323
import androidx.compose.runtime.LaunchedEffect
@@ -40,16 +40,24 @@ import top.yukonga.miuix.kmp.basic.FloatingActionButton
4040
import top.yukonga.miuix.kmp.basic.HorizontalPager
4141
import top.yukonga.miuix.kmp.basic.Icon
4242
import top.yukonga.miuix.kmp.basic.IconButton
43+
import top.yukonga.miuix.kmp.basic.ListPopup
44+
import top.yukonga.miuix.kmp.basic.ListPopupDefaults
4345
import top.yukonga.miuix.kmp.basic.MiuixScrollBehavior
4446
import top.yukonga.miuix.kmp.basic.NavigationBar
4547
import top.yukonga.miuix.kmp.basic.NavigationItem
48+
import top.yukonga.miuix.kmp.basic.PopupPositionProvider
4649
import top.yukonga.miuix.kmp.basic.Scaffold
4750
import top.yukonga.miuix.kmp.basic.ScrollBehavior
4851
import top.yukonga.miuix.kmp.basic.SmallTopAppBar
4952
import top.yukonga.miuix.kmp.basic.TopAppBar
5053
import top.yukonga.miuix.kmp.basic.rememberTopAppBarState
54+
import top.yukonga.miuix.kmp.extra.DropdownImpl
5155
import top.yukonga.miuix.kmp.icon.MiuixIcons
5256
import top.yukonga.miuix.kmp.icon.icons.GitHub
57+
import top.yukonga.miuix.kmp.icon.icons.ImmersionMore
58+
import top.yukonga.miuix.kmp.icon.icons.Info
59+
import top.yukonga.miuix.kmp.icon.icons.More
60+
import top.yukonga.miuix.kmp.utils.MiuixPopupUtil.Companion.dismissPopup
5361
import utils.FPSMonitor
5462

5563
@OptIn(FlowPreview::class)
@@ -77,8 +85,9 @@ fun UITest(
7785

7886
val items = listOf(
7987
NavigationItem("HomePage", Icons.Rounded.Home),
80-
NavigationItem("DropDown", Icons.Rounded.Favorite),
81-
NavigationItem("Settings", Icons.Rounded.Settings)
88+
NavigationItem("DropDown", MiuixIcons.Info),
89+
NavigationItem("Settings", Icons.Rounded.Settings),
90+
NavigationItem("More", MiuixIcons.More)
8291
)
8392

8493
LaunchedEffect(pagerState) {
@@ -93,6 +102,11 @@ fun UITest(
93102
val showFloatingActionButton = remember { mutableStateOf(true) }
94103
val enablePageUserScroll = remember { mutableStateOf(false) }
95104

105+
val isTopPopupExpanded = remember { mutableStateOf(false) }
106+
val showTopPopup = remember { mutableStateOf(false) }
107+
val isBottomPopupExpanded = remember { mutableStateOf(false) }
108+
val showBottomPopup = remember { mutableStateOf(false) }
109+
96110
val uriHandler = LocalUriHandler.current
97111

98112
Scaffold(
@@ -109,12 +123,41 @@ fun UITest(
109123
title = "Miuix",
110124
scrollBehavior = currentScrollBehavior,
111125
actions = {
126+
if (isTopPopupExpanded.value) {
127+
ListPopup(
128+
show = showTopPopup,
129+
popupPositionProvider = ListPopupDefaults.ContextMenuPositionProvider,
130+
alignment = PopupPositionProvider.Align.TopRight,
131+
onDismissRequest = {
132+
isTopPopupExpanded.value = false
133+
}
134+
) {
135+
LazyColumn {
136+
items(items.size) { index ->
137+
DropdownImpl(
138+
text = items[index].label,
139+
optionSize = items.size,
140+
isSelected = false,
141+
onSelectedIndexChange = {
142+
dismissPopup(showTopPopup)
143+
isTopPopupExpanded.value = false
144+
},
145+
textWidthDp = 100.dp,
146+
index = index
147+
)
148+
}
149+
}
150+
}
151+
showTopPopup.value = true
152+
}
112153
IconButton(
113-
modifier = Modifier.padding(end = 12.dp),
114-
onClick = { }
154+
modifier = Modifier.padding(end = 21.dp).size(40.dp),
155+
onClick = {
156+
isTopPopupExpanded.value = true
157+
}
115158
) {
116159
Icon(
117-
imageVector = Icons.Rounded.Menu,
160+
imageVector = MiuixIcons.ImmersionMore,
118161
contentDescription = "Menu"
119162
)
120163
}
@@ -125,12 +168,41 @@ fun UITest(
125168
title = "Miuix",
126169
scrollBehavior = currentScrollBehavior,
127170
actions = {
171+
if (isTopPopupExpanded.value) {
172+
ListPopup(
173+
show = showTopPopup,
174+
popupPositionProvider = ListPopupDefaults.ContextMenuPositionProvider,
175+
alignment = PopupPositionProvider.Align.TopRight,
176+
onDismissRequest = {
177+
isTopPopupExpanded.value = false
178+
}
179+
) {
180+
LazyColumn {
181+
items(items.size) { index ->
182+
DropdownImpl(
183+
text = items[index].label,
184+
optionSize = items.size,
185+
isSelected = false,
186+
onSelectedIndexChange = {
187+
dismissPopup(showTopPopup)
188+
isTopPopupExpanded.value = false
189+
},
190+
textWidthDp = 100.dp,
191+
index = index
192+
)
193+
}
194+
}
195+
}
196+
showTopPopup.value = true
197+
}
128198
IconButton(
129-
modifier = Modifier.padding(end = 12.dp),
130-
onClick = { }
199+
modifier = Modifier.padding(end = 21.dp).size(40.dp),
200+
onClick = {
201+
isTopPopupExpanded.value = true
202+
}
131203
) {
132204
Icon(
133-
imageVector = Icons.Rounded.Menu,
205+
imageVector = MiuixIcons.ImmersionMore,
134206
contentDescription = "Menu"
135207
)
136208
}
@@ -146,13 +218,44 @@ fun UITest(
146218
enter = fadeIn() + expandVertically(),
147219
exit = fadeOut() + shrinkVertically()
148220
) {
221+
if (isBottomPopupExpanded.value) {
222+
ListPopup(
223+
show = showBottomPopup,
224+
popupPositionProvider = ListPopupDefaults.ContextMenuPositionProvider,
225+
alignment = PopupPositionProvider.Align.BottomRight,
226+
onDismissRequest = {
227+
isBottomPopupExpanded.value = false
228+
}
229+
) {
230+
LazyColumn {
231+
items(items.size) { index ->
232+
DropdownImpl(
233+
text = items[index].label,
234+
optionSize = items.size,
235+
isSelected = false,
236+
onSelectedIndexChange = {
237+
dismissPopup(showBottomPopup)
238+
isBottomPopupExpanded.value = false
239+
},
240+
textWidthDp = 100.dp,
241+
index = index
242+
)
243+
}
244+
}
245+
}
246+
showBottomPopup.value = true
247+
}
149248
NavigationBar(
150249
items = items,
151250
selected = targetPage,
152251
onClick = { index ->
153-
targetPage = index
154-
coroutineScope.launch {
155-
pagerState.animateScrollToPage(index)
252+
if (index in 0..2) {
253+
targetPage = index
254+
coroutineScope.launch {
255+
pagerState.animateScrollToPage(index)
256+
}
257+
} else {
258+
isBottomPopupExpanded.value = true
156259
}
157260
}
158261
)

0 commit comments

Comments
 (0)