44package component
55
66import androidx.compose.foundation.layout.Arrangement
7+ import androidx.compose.foundation.layout.Column
8+ import androidx.compose.foundation.layout.IntrinsicSize
79import androidx.compose.foundation.layout.Row
810import androidx.compose.foundation.layout.Spacer
11+ import androidx.compose.foundation.layout.fillMaxHeight
12+ import androidx.compose.foundation.layout.fillMaxWidth
13+ import androidx.compose.foundation.layout.height
914import androidx.compose.foundation.layout.padding
1015import androidx.compose.foundation.layout.width
1116import androidx.compose.foundation.lazy.LazyListScope
@@ -14,23 +19,35 @@ import androidx.compose.runtime.getValue
1419import androidx.compose.runtime.mutableStateOf
1520import androidx.compose.runtime.remember
1621import androidx.compose.runtime.setValue
22+ import androidx.compose.ui.Alignment
1723import androidx.compose.ui.Modifier
24+ import androidx.compose.ui.platform.LocalWindowInfo
25+ import androidx.compose.ui.text.font.FontWeight
26+ import androidx.compose.ui.text.style.TextAlign
1827import androidx.compose.ui.unit.dp
1928import top.yukonga.miuix.kmp.basic.ButtonDefaults
2029import top.yukonga.miuix.kmp.basic.Card
2130import top.yukonga.miuix.kmp.basic.SmallTitle
31+ import top.yukonga.miuix.kmp.basic.Text
2232import top.yukonga.miuix.kmp.basic.TextButton
33+ import top.yukonga.miuix.kmp.basic.VerticalDivider
34+ import top.yukonga.miuix.kmp.layout.DialogDefaults
2335import top.yukonga.miuix.kmp.overlay.OverlayDialog
2436import top.yukonga.miuix.kmp.preference.ArrowPreference
2537import top.yukonga.miuix.kmp.theme.LocalDismissState
38+ import top.yukonga.miuix.kmp.theme.MiuixTheme
2639import top.yukonga.miuix.kmp.window.WindowDialog
2740
2841fun LazyListScope.dialogSection () {
2942 item(key = " dialog" ) {
30- var showSuperDialog by remember { mutableStateOf(false ) }
43+ var showOverlayDialog by remember { mutableStateOf(false ) }
3144 var showWindowDialog by remember { mutableStateOf(false ) }
32- var superDialogHoldDown by remember { mutableStateOf(false ) }
45+ var overlayDialogHoldDown by remember { mutableStateOf(false ) }
3346 var windowDialogHoldDown by remember { mutableStateOf(false ) }
47+ var showWideSuperDialog by remember { mutableStateOf(false ) }
48+ var showWideWindowDialog by remember { mutableStateOf(false ) }
49+ var wideSuperDialogHoldDown by remember { mutableStateOf(false ) }
50+ var wideWindowDialogHoldDown by remember { mutableStateOf(false ) }
3451
3552 SmallTitle (text = " Dialog" )
3653 Card (
@@ -42,10 +59,10 @@ fun LazyListScope.dialogSection() {
4259 title = " Dialog (O)" ,
4360 summary = " Click to show an OverlayDialog" ,
4461 onClick = {
45- showSuperDialog = true
46- superDialogHoldDown = true
62+ showOverlayDialog = true
63+ overlayDialogHoldDown = true
4764 },
48- holdDownState = superDialogHoldDown ,
65+ holdDownState = overlayDialogHoldDown ,
4966 )
5067 ArrowPreference (
5168 title = " Dialog (W)" ,
@@ -56,23 +73,51 @@ fun LazyListScope.dialogSection() {
5673 },
5774 holdDownState = windowDialogHoldDown,
5875 )
76+ ArrowPreference (
77+ title = " Wide Dialog (O)" ,
78+ summary = " Portrait shows a regular dialog; landscape shows a two-column dialog" ,
79+ onClick = {
80+ showWideSuperDialog = true
81+ wideSuperDialogHoldDown = true
82+ },
83+ holdDownState = wideSuperDialogHoldDown,
84+ )
85+ ArrowPreference (
86+ title = " Wide Dialog (W)" ,
87+ summary = " Portrait shows a regular dialog; landscape shows a two-column dialog" ,
88+ onClick = {
89+ showWideWindowDialog = true
90+ wideWindowDialogHoldDown = true
91+ },
92+ holdDownState = wideWindowDialogHoldDown,
93+ )
5994 }
6095
61- SuperDialogDemo (
62- show = showSuperDialog ,
63- onDismissRequest = { showSuperDialog = false },
64- onDismissFinished = { superDialogHoldDown = false },
96+ OverlayDialogDemo (
97+ show = showOverlayDialog ,
98+ onDismissRequest = { showOverlayDialog = false },
99+ onDismissFinished = { overlayDialogHoldDown = false },
65100 )
66101 WindowDialogDemo (
67102 show = showWindowDialog,
68103 onDismissRequest = { showWindowDialog = false },
69104 onDismissFinished = { windowDialogHoldDown = false },
70105 )
106+ WideSuperDialogDemo (
107+ show = showWideSuperDialog,
108+ onDismissRequest = { showWideSuperDialog = false },
109+ onDismissFinished = { wideSuperDialogHoldDown = false },
110+ )
111+ WideWindowDialogDemo (
112+ show = showWideWindowDialog,
113+ onDismissRequest = { showWideWindowDialog = false },
114+ onDismissFinished = { wideWindowDialogHoldDown = false },
115+ )
71116 }
72117}
73118
74119@Composable
75- private fun SuperDialogDemo (
120+ private fun OverlayDialogDemo (
76121 show : Boolean ,
77122 onDismissRequest : () -> Unit ,
78123 onDismissFinished : () -> Unit ,
@@ -137,3 +182,141 @@ private fun WindowDialogDemo(
137182 },
138183 )
139184}
185+
186+ @Composable
187+ private fun WideSuperDialogDemo (
188+ show : Boolean ,
189+ onDismissRequest : () -> Unit ,
190+ onDismissFinished : () -> Unit ,
191+ ) {
192+ val windowSize = LocalWindowInfo .current.containerDpSize
193+ val isLandscape = windowSize.width > windowSize.height
194+
195+ OverlayDialog (
196+ show = show,
197+ title = if (isLandscape) null else " Wide Dialog" ,
198+ summary = if (isLandscape) null else " Rotate to landscape to see the effect." ,
199+ maxWidth = if (isLandscape) 560 .dp else DialogDefaults .MaxWidth ,
200+ onDismissRequest = onDismissRequest,
201+ onDismissFinished = onDismissFinished,
202+ content = {
203+ WideDialogContent (isLandscape = isLandscape)
204+ },
205+ )
206+ }
207+
208+ @Composable
209+ private fun WideWindowDialogDemo (
210+ show : Boolean ,
211+ onDismissRequest : () -> Unit ,
212+ onDismissFinished : () -> Unit ,
213+ ) {
214+ val windowSize = LocalWindowInfo .current.containerDpSize
215+ val isLandscape = windowSize.width > windowSize.height
216+
217+ WindowDialog (
218+ show = show,
219+ title = if (isLandscape) null else " Wide Dialog" ,
220+ summary = if (isLandscape) null else " Rotate to landscape to see the effect." ,
221+ maxWidth = if (isLandscape) 560 .dp else DialogDefaults .MaxWidth ,
222+ onDismissRequest = onDismissRequest,
223+ onDismissFinished = onDismissFinished,
224+ content = {
225+ WideDialogContent (isLandscape = isLandscape)
226+ },
227+ )
228+ }
229+
230+ @Composable
231+ private fun WideDialogContent (
232+ isLandscape : Boolean ,
233+ ) {
234+ val dismissState = LocalDismissState .current
235+
236+ if (isLandscape) {
237+ Row (
238+ modifier = Modifier
239+ .fillMaxWidth()
240+ .height(IntrinsicSize .Min ),
241+ ) {
242+ Column (
243+ modifier = Modifier
244+ .weight(1f )
245+ .fillMaxHeight(),
246+ verticalArrangement = Arrangement .Center ,
247+ horizontalAlignment = Alignment .CenterHorizontally ,
248+ ) {
249+ Text (
250+ modifier = Modifier .fillMaxWidth(),
251+ text = " Wide Dialog" ,
252+ style = MiuixTheme .textStyles.title4,
253+ color = MiuixTheme .colorScheme.onBackground,
254+ fontWeight = FontWeight .Medium ,
255+ textAlign = TextAlign .Center ,
256+ )
257+ Spacer (Modifier .height(8 .dp))
258+ Text (
259+ modifier = Modifier .fillMaxWidth(),
260+ text = " Rotate to landscape to see the effect." ,
261+ style = MiuixTheme .textStyles.body1,
262+ color = MiuixTheme .colorScheme.onSurfaceSecondary,
263+ textAlign = TextAlign .Center ,
264+ )
265+ }
266+
267+ VerticalDivider (
268+ modifier = Modifier
269+ .fillMaxHeight()
270+ .padding(horizontal = 20 .dp),
271+ )
272+
273+ Column (
274+ modifier = Modifier
275+ .weight(1f )
276+ .fillMaxHeight(),
277+ verticalArrangement = Arrangement .spacedBy(
278+ space = 12 .dp,
279+ alignment = Alignment .CenterVertically ,
280+ ),
281+ ) {
282+ TextButton (
283+ text = " Allow Once" ,
284+ onClick = { dismissState?.invoke() },
285+ modifier = Modifier .fillMaxWidth(),
286+ colors = ButtonDefaults .textButtonColorsPrimary(),
287+ )
288+ TextButton (
289+ text = " Always Allow" ,
290+ onClick = { dismissState?.invoke() },
291+ modifier = Modifier .fillMaxWidth(),
292+ )
293+ TextButton (
294+ text = " Deny" ,
295+ onClick = { dismissState?.invoke() },
296+ modifier = Modifier .fillMaxWidth(),
297+ )
298+ }
299+ }
300+ } else {
301+ Column (
302+ verticalArrangement = Arrangement .spacedBy(12 .dp),
303+ ) {
304+ TextButton (
305+ text = " Allow Once" ,
306+ onClick = { dismissState?.invoke() },
307+ modifier = Modifier .fillMaxWidth(),
308+ colors = ButtonDefaults .textButtonColorsPrimary(),
309+ )
310+ TextButton (
311+ text = " Always Allow" ,
312+ onClick = { dismissState?.invoke() },
313+ modifier = Modifier .fillMaxWidth(),
314+ )
315+ TextButton (
316+ text = " Deny" ,
317+ onClick = { dismissState?.invoke() },
318+ modifier = Modifier .fillMaxWidth(),
319+ )
320+ }
321+ }
322+ }
0 commit comments