Do not show floating action buttons when reordering items

This commit is contained in:
vfsfitvnm
2022-10-06 18:01:48 +02:00
parent b30b282628
commit 5b47484a40
10 changed files with 142 additions and 120 deletions

View File

@@ -22,8 +22,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import it.vfsfitvnm.vimusic.LocalPlayerAwarePaddingValues
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.utils.isScrollingDown
import it.vfsfitvnm.vimusic.utils.isScrollingDownToIsFar
import it.vfsfitvnm.vimusic.utils.ScrollingInfo
import it.vfsfitvnm.vimusic.utils.scrollingInfo
import it.vfsfitvnm.vimusic.utils.smoothScrollToTop
import kotlinx.coroutines.launch
@@ -32,12 +32,13 @@ import kotlinx.coroutines.launch
fun BoxScope.FloatingActionsContainerWithScrollToTop(
lazyGridState: LazyGridState,
modifier: Modifier = Modifier,
visible: Boolean = true,
iconId: Int? = null,
onClick: (() -> Unit)? = null,
) {
val transitionState = remember {
MutableTransitionState(false to false)
}.apply { targetState = lazyGridState.isScrollingDownToIsFar() }
MutableTransitionState<ScrollingInfo?>(ScrollingInfo())
}.apply { targetState = if (visible) lazyGridState.scrollingInfo() else null }
FloatingActions(
transitionState = transitionState,
@@ -53,12 +54,13 @@ fun BoxScope.FloatingActionsContainerWithScrollToTop(
fun BoxScope.FloatingActionsContainerWithScrollToTop(
lazyListState: LazyListState,
modifier: Modifier = Modifier,
visible: Boolean = true,
iconId: Int? = null,
onClick: (() -> Unit)? = null,
) {
val transitionState = remember {
MutableTransitionState(false to false)
}.apply { targetState = lazyListState.isScrollingDownToIsFar() }
MutableTransitionState<ScrollingInfo?>(ScrollingInfo())
}.apply { targetState = if (visible) lazyListState.scrollingInfo() else null }
FloatingActions(
transitionState = transitionState,
@@ -74,12 +76,13 @@ fun BoxScope.FloatingActionsContainerWithScrollToTop(
fun BoxScope.FloatingActionsContainerWithScrollToTop(
scrollState: ScrollState,
modifier: Modifier = Modifier,
visible: Boolean = true,
iconId: Int? = null,
onClick: (() -> Unit)? = null,
) {
val transitionState = remember {
MutableTransitionState(false to false)
}.apply { targetState = scrollState.isScrollingDown() to false }
MutableTransitionState<ScrollingInfo?>(ScrollingInfo())
}.apply { targetState = if (visible) scrollState.scrollingInfo() else null }
FloatingActions(
transitionState = transitionState,
@@ -92,13 +95,13 @@ fun BoxScope.FloatingActionsContainerWithScrollToTop(
@ExperimentalAnimationApi
@Composable
fun BoxScope.FloatingActions(
transitionState: MutableTransitionState<Pair<Boolean, Boolean>>,
transitionState: MutableTransitionState<ScrollingInfo?>,
modifier: Modifier = Modifier,
onScrollToTop: (suspend () -> Unit)? = null,
iconId: Int? = null,
onClick: (() -> Unit)? = null,
) {
val transition = updateTransition(transitionState, "FloatingActionsContainer")
val transition = updateTransition(transitionState, "")
Row(
horizontalArrangement = Arrangement.spacedBy(16.dp),
@@ -110,7 +113,7 @@ fun BoxScope.FloatingActions(
) {
onScrollToTop?.let {
transition.AnimatedVisibility(
visible = { it.first && it.second },
visible = { it?.isScrollingDown == false && it.isFar },
enter = slideInVertically(tween(500, if (iconId == null) 0 else 100)) { it },
exit = slideOutVertically(tween(500, 0)) { it },
) {
@@ -122,6 +125,7 @@ fun BoxScope.FloatingActions(
onScrollToTop()
}
},
enabled = transition.targetState?.isScrollingDown == false && transition.targetState?.isFar == true,
iconId = R.drawable.chevron_up,
modifier = Modifier
.padding(bottom = 16.dp)
@@ -132,13 +136,14 @@ fun BoxScope.FloatingActions(
iconId?.let {
onClick?.let {
transition.AnimatedVisibility(
visible = { it.first },
visible = { it?.isScrollingDown == false },
enter = slideInVertically(tween(500, 0)) { it },
exit = slideOutVertically(tween(500, 100)) { it },
) {
PrimaryButton(
iconId = iconId,
onClick = onClick,
enabled = transition.targetState?.isScrollingDown == false,
modifier = Modifier
.padding(bottom = 16.dp)
)

View File

@@ -21,14 +21,14 @@ fun PrimaryButton(
onClick: () -> Unit,
@DrawableRes iconId: Int,
modifier: Modifier = Modifier,
isEnabled: Boolean = true,
enabled: Boolean = true,
) {
val (colorPalette) = LocalAppearance.current
Box(
modifier = modifier
.clip(RoundedCornerShape(16.dp))
.clickable(enabled = isEnabled, onClick = onClick)
.clickable(enabled = enabled, onClick = onClick)
.background(colorPalette.background2)
.size(62.dp)
) {

View File

@@ -21,14 +21,14 @@ fun SecondaryButton(
onClick: () -> Unit,
@DrawableRes iconId: Int,
modifier: Modifier = Modifier,
isEnabled: Boolean = true,
enabled: Boolean = true,
) {
val (colorPalette) = LocalAppearance.current
Box(
modifier = modifier
.clip(CircleShape)
.clickable(enabled = isEnabled, onClick = onClick)
.clickable(enabled = enabled, onClick = onClick)
.background(colorPalette.background2)
.size(48.dp)
) {

View File

@@ -277,6 +277,7 @@ fun LocalPlaylistSongs(
FloatingActionsContainerWithScrollToTop(
lazyListState = lazyListState,
iconId = R.drawable.shuffle,
visible = !reorderingState.isDragging,
onClick = {
playlistWithSongs?.songs?.let { songs ->
if (songs.isNotEmpty()) {