Hold the FAB still while the selection bar unfolds (#141)
This commit is contained in:
@@ -11,6 +11,8 @@ import androidx.compose.animation.shrinkHorizontally
|
|||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.wrapContentHeight
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
||||||
import androidx.compose.material.icons.filled.Add
|
import androidx.compose.material.icons.filled.Add
|
||||||
@@ -26,6 +28,7 @@ import androidx.compose.runtime.Composable
|
|||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import de.jeanlucmakiola.calendula.R
|
import de.jeanlucmakiola.calendula.R
|
||||||
@@ -39,6 +42,9 @@ class FabSelection(
|
|||||||
|
|
||||||
private enum class FabIcon { Create, Open, Fold }
|
private enum class FabIcon { Create, Open, Fold }
|
||||||
|
|
||||||
|
/** The standard FAB's size, which the row it sits in is held to. */
|
||||||
|
private val FAB_SIZE = 56.dp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The FAB stack shared by the three calendar views: a persistent "+" to
|
* The FAB stack shared by the three calendar views: a persistent "+" to
|
||||||
* create an event, with the jump-to-today pill appearing above it whenever
|
* create an event, with the jump-to-today pill appearing above it whenever
|
||||||
@@ -73,12 +79,17 @@ fun CalendarFabColumn(
|
|||||||
// Held past the selection clearing, so the bar has something to fold away.
|
// Held past the selection clearing, so the bar has something to fold away.
|
||||||
val heldBar = remember { mutableStateOf<(@Composable () -> Unit)?>(null) }
|
val heldBar = remember { mutableStateOf<(@Composable () -> Unit)?>(null) }
|
||||||
selection?.let { heldBar.value = it.bar }
|
selection?.let { heldBar.value = it.bar }
|
||||||
|
// Held at the FAB's own height whatever the bar does: the bar is taller,
|
||||||
|
// and a row grown to fit it moved the FAB up as the bar unfolded.
|
||||||
Row(
|
Row(
|
||||||
|
modifier = Modifier.height(FAB_SIZE),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
) {
|
) {
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
visible = selection?.expanded == true,
|
visible = selection?.expanded == true,
|
||||||
|
// Overflows the row evenly above and below, centred on the FAB.
|
||||||
|
modifier = Modifier.wrapContentHeight(unbounded = true),
|
||||||
enter = expandHorizontally(
|
enter = expandHorizontally(
|
||||||
animationSpec = MaterialTheme.motionScheme.fastSpatialSpec(),
|
animationSpec = MaterialTheme.motionScheme.fastSpatialSpec(),
|
||||||
expandFrom = Alignment.End,
|
expandFrom = Alignment.End,
|
||||||
|
|||||||
Reference in New Issue
Block a user