Improve bottom sheet dialogs
This commit is contained in:
parent
ecdbe8705f
commit
255e737178
@ -14,11 +14,15 @@ import androidx.compose.foundation.layout.PaddingValues
|
|||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.RowScope
|
import androidx.compose.foundation.layout.RowScope
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.offset
|
import androidx.compose.foundation.layout.offset
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.safeDrawing
|
||||||
|
import androidx.compose.foundation.layout.systemBars
|
||||||
import androidx.compose.foundation.layout.width
|
import androidx.compose.foundation.layout.width
|
||||||
|
import androidx.compose.foundation.layout.windowInsetsBottomHeight
|
||||||
import androidx.compose.foundation.layout.wrapContentHeight
|
import androidx.compose.foundation.layout.wrapContentHeight
|
||||||
import androidx.compose.foundation.shape.CornerSize
|
import androidx.compose.foundation.shape.CornerSize
|
||||||
import androidx.compose.material.FixedThreshold
|
import androidx.compose.material.FixedThreshold
|
||||||
@ -31,7 +35,6 @@ import androidx.compose.material3.MaterialTheme
|
|||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocal
|
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
@ -41,7 +44,6 @@ import androidx.compose.runtime.rememberCoroutineScope
|
|||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.alpha
|
|
||||||
import androidx.compose.ui.draw.clipToBounds
|
import androidx.compose.ui.draw.clipToBounds
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
@ -55,8 +57,6 @@ import androidx.compose.ui.unit.Velocity
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.Dialog
|
import androidx.compose.ui.window.Dialog
|
||||||
import androidx.compose.ui.window.DialogProperties
|
import androidx.compose.ui.window.DialogProperties
|
||||||
import androidx.compose.ui.window.Popup
|
|
||||||
import androidx.compose.ui.window.PopupProperties
|
|
||||||
import de.mm20.launcher2.ui.ktx.toDp
|
import de.mm20.launcher2.ui.ktx.toDp
|
||||||
import de.mm20.launcher2.ui.ktx.toPixels
|
import de.mm20.launcher2.ui.ktx.toPixels
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@ -69,8 +69,7 @@ fun BottomSheetDialog(
|
|||||||
actions: @Composable RowScope.() -> Unit = {},
|
actions: @Composable RowScope.() -> Unit = {},
|
||||||
confirmButton: @Composable (() -> Unit)? = null,
|
confirmButton: @Composable (() -> Unit)? = null,
|
||||||
dismissButton: @Composable (() -> Unit)? = null,
|
dismissButton: @Composable (() -> Unit)? = null,
|
||||||
swipeToDismiss: () -> Boolean = { true },
|
dismissible: () -> Boolean = { true },
|
||||||
dismissOnBackPress: () -> Boolean = { true },
|
|
||||||
content: @Composable (paddingValues: PaddingValues) -> Unit,
|
content: @Composable (paddingValues: PaddingValues) -> Unit,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
@ -79,13 +78,13 @@ fun BottomSheetDialog(
|
|||||||
initialValue = SwipeState.Dismiss,
|
initialValue = SwipeState.Dismiss,
|
||||||
confirmStateChange = {
|
confirmStateChange = {
|
||||||
if (it == SwipeState.Dismiss) {
|
if (it == SwipeState.Dismiss) {
|
||||||
if (swipeToDismiss()) {
|
if (dismissible()) {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
}
|
}
|
||||||
else return@SwipeableState false
|
else return@SwipeableState false
|
||||||
}
|
}
|
||||||
return@SwipeableState true
|
return@SwipeableState true
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,9 +140,10 @@ fun BottomSheetDialog(
|
|||||||
) {
|
) {
|
||||||
Dialog(
|
Dialog(
|
||||||
properties = DialogProperties(
|
properties = DialogProperties(
|
||||||
dismissOnBackPress = dismissOnBackPress(),
|
dismissOnBackPress = dismissible(),
|
||||||
dismissOnClickOutside = swipeToDismiss(),
|
dismissOnClickOutside = dismissible(),
|
||||||
usePlatformDefaultWidth = false,
|
usePlatformDefaultWidth = false,
|
||||||
|
decorFitsSystemWindows = false,
|
||||||
),
|
),
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
) {
|
) {
|
||||||
@ -161,9 +161,9 @@ fun BottomSheetDialog(
|
|||||||
Box(modifier = Modifier
|
Box(modifier = Modifier
|
||||||
.background(MaterialTheme.colorScheme.scrim.copy(alpha = scrimAlpha))
|
.background(MaterialTheme.colorScheme.scrim.copy(alpha = scrimAlpha))
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.pointerInput(onDismissRequest, swipeToDismiss) {
|
.pointerInput(onDismissRequest, dismissible) {
|
||||||
detectTapGestures {
|
detectTapGestures {
|
||||||
if (swipeToDismiss()) {
|
if (dismissible()) {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
swipeState.animateTo(SwipeState.Dismiss)
|
swipeState.animateTo(SwipeState.Dismiss)
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
@ -201,7 +201,6 @@ fun BottomSheetDialog(
|
|||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.nestedScroll(nestedScrollConnection)
|
.nestedScroll(nestedScrollConnection)
|
||||||
.animateContentSize()
|
|
||||||
.onSizeChanged {
|
.onSizeChanged {
|
||||||
height = it.height.toFloat()
|
height = it.height.toFloat()
|
||||||
}
|
}
|
||||||
@ -217,7 +216,7 @@ fun BottomSheetDialog(
|
|||||||
FractionalThreshold(0.5f)
|
FractionalThreshold(0.5f)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
resistance = null
|
resistance = null,
|
||||||
)
|
)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.weight(1f, false),
|
.weight(1f, false),
|
||||||
@ -238,7 +237,8 @@ fun BottomSheetDialog(
|
|||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.wrapContentHeight(),
|
.wrapContentHeight()
|
||||||
|
.animateContentSize(),
|
||||||
propagateMinConstraints = true,
|
propagateMinConstraints = true,
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
@ -250,7 +250,6 @@ fun BottomSheetDialog(
|
|||||||
|
|
||||||
if (confirmButton != null || dismissButton != null) {
|
if (confirmButton != null || dismissButton != null) {
|
||||||
val elevation by animateDpAsState(if (swipeState.offset.value == 0f) 0.dp else 1.dp)
|
val elevation by animateDpAsState(if (swipeState.offset.value == 0f) 0.dp else 1.dp)
|
||||||
val alpha by animateFloatAsState(if (swipeState.targetValue == SwipeState.Dismiss) 0f else 1f)
|
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.wrapContentHeight()
|
.wrapContentHeight()
|
||||||
@ -277,6 +276,13 @@ fun BottomSheetDialog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.windowInsetsBottomHeight(WindowInsets.systemBars)
|
||||||
|
.fillMaxWidth()
|
||||||
|
.background(MaterialTheme.colorScheme.surface)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,8 +79,7 @@ fun CustomizeSearchableSheet(
|
|||||||
title = {
|
title = {
|
||||||
Text(stringResource(if (pickIcon) R.string.icon_picker_title else R.string.menu_customize))
|
Text(stringResource(if (pickIcon) R.string.icon_picker_title else R.string.menu_customize))
|
||||||
},
|
},
|
||||||
swipeToDismiss = { !pickIcon },
|
dismissible = { !pickIcon },
|
||||||
dismissOnBackPress = { !pickIcon },
|
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
if (pickIcon) {
|
if (pickIcon) {
|
||||||
OutlinedButton(onClick = { viewModel.closeIconPicker() }) {
|
OutlinedButton(onClick = { viewModel.closeIconPicker() }) {
|
||||||
|
|||||||
@ -115,10 +115,7 @@ fun EditFavoritesSheet(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
swipeToDismiss = {
|
dismissible = {
|
||||||
createShortcutTarget == null
|
|
||||||
},
|
|
||||||
dismissOnBackPress = {
|
|
||||||
createShortcutTarget == null
|
createShortcutTarget == null
|
||||||
},
|
},
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
|
|||||||
@ -113,10 +113,7 @@ fun EditSearchActionSheet(
|
|||||||
viewModel.onDismiss()
|
viewModel.onDismiss()
|
||||||
onDismiss()
|
onDismiss()
|
||||||
},
|
},
|
||||||
dismissOnBackPress = {
|
dismissible = {
|
||||||
page != EditSearchActionPage.PickIcon
|
|
||||||
},
|
|
||||||
swipeToDismiss = {
|
|
||||||
page != EditSearchActionPage.PickIcon
|
page != EditSearchActionPage.PickIcon
|
||||||
},
|
},
|
||||||
confirmButton = when (page) {
|
confirmButton = when (page) {
|
||||||
|
|||||||
@ -103,12 +103,9 @@ fun EditTagSheet(
|
|||||||
if (viewModel.page == EditTagSheetPage.CustomizeTag) viewModel.save()
|
if (viewModel.page == EditTagSheetPage.CustomizeTag) viewModel.save()
|
||||||
onDismiss()
|
onDismiss()
|
||||||
},
|
},
|
||||||
swipeToDismiss = {
|
dismissible = {
|
||||||
!(!isCreatingNewTag && viewModel.page == EditTagSheetPage.PickItems)
|
!(!isCreatingNewTag && viewModel.page == EditTagSheetPage.PickItems)
|
||||||
},
|
},
|
||||||
dismissOnBackPress = {
|
|
||||||
!(!isCreatingNewTag && viewModel.page == EditTagSheetPage.PickItems)
|
|
||||||
}
|
|
||||||
) {
|
) {
|
||||||
when (viewModel.page) {
|
when (viewModel.page) {
|
||||||
EditTagSheetPage.CreateTag -> CreateNewTagPage(viewModel, it)
|
EditTagSheetPage.CreateTag -> CreateNewTagPage(viewModel, it)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user