diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/TimePickerModal.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/TimePickerModal.kt index be4a4d669509987d6f8c945bc8dfe9ac28979c7e..0d1e21c6b244925ad9b650b341c05d8508d18ba1 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/TimePickerModal.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/TimePickerModal.kt @@ -14,6 +14,10 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -36,7 +40,7 @@ fun TimePickerModal( onClickOk: (LocalTime) -> Unit ) { val selectorSettings = WheelPickerDefaults.selectorProperties(enabled = false) - var time = startTime + var time by remember { mutableStateOf(startTime) } Column( modifier = modifier diff --git a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/WheelTimePicker.kt b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/WheelTimePicker.kt index 1cef6980fef6fc2175e50115e44f83e9db924ece..5654edaaa25559dc2233c2efefeea5eb8f85048b 100644 --- a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/WheelTimePicker.kt +++ b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/WheelTimePicker.kt @@ -45,7 +45,6 @@ fun WheelTimePicker( selectorProperties, onSnappedTime = { snappedTime, _ -> onSnappedTime(snappedTime.snappedLocalTime) - snappedTime.snappedIndex } ) } diff --git a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/DefaultWheelTimePicker.kt b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/DefaultWheelTimePicker.kt index abfe03e61a93c986946c73a6f80a201ebf1a52d4..e2c60010cdb2f2db48eb1b25afd899f7939171da 100644 --- a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/DefaultWheelTimePicker.kt +++ b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/DefaultWheelTimePicker.kt @@ -38,11 +38,15 @@ internal fun DefaultWheelTimePicker( textStyle: TextStyle = MaterialTheme.typography.titleMedium, textColor: Color = LocalContentColor.current, selectorProperties: SelectorProperties = WheelPickerDefaults.selectorProperties(), - onSnappedTime: (snappedTime: SnappedTime, timeFormat: TimeFormat) -> Int? = { _, _ -> null }, + onSnappedTime: (snappedTime: SnappedTime, timeFormat: TimeFormat) -> Unit = { _, _ -> }, ) { var snappedTime by remember { mutableStateOf(startTime.truncatedToMinute()) } + fun onTimeChanged() { + onSnappedTime(SnappedTime.Hour(localTime = snappedTime, index = 0), timeFormat) + } + val hours = (0..23).map { Hour( text = it.toString().padStart(2, '0'), @@ -111,13 +115,13 @@ internal fun DefaultWheelTimePicker( selectorProperties = WheelPickerDefaults.selectorProperties( enabled = false ), - onScrollFinished = { snappedIndex -> + onSnappedIndexChanged = { snappedIndex -> val newHour = if (timeFormat == TimeFormat.HOUR_24) { - hours.find { it.index == snappedIndex }?.value + hours.getOrNull(snappedIndex)?.value } else { amPmHourToHour24( - amPmHours.find { it.index == snappedIndex }?.value ?: 0, + amPmHours.getOrNull(snappedIndex)?.value ?: 0, snappedTime.minute, snappedAmPm.value ) @@ -129,33 +133,12 @@ internal fun DefaultWheelTimePicker( if (!newTime.isBefore(minTime) && !newTime.isAfter(maxTime)) { snappedTime = newTime - } - - val newIndex = if (timeFormat == TimeFormat.HOUR_24) { - hours.find { it.value == snappedTime.hour }?.index - } else { - amPmHours.find { it.value == localTimeToAmPmHour(snappedTime) }?.index - } - - newIndex?.let { - onSnappedTime( - SnappedTime.Hour( - localTime = snappedTime, - index = newIndex - ), - timeFormat - )?.let { return@WheelTextPicker it } + onTimeChanged() } } - - return@WheelTextPicker if (timeFormat == TimeFormat.HOUR_24) { - hours.find { it.value == snappedTime.hour }?.index - } else { - amPmHours.find { it.value == localTimeToAmPmHour(snappedTime) }?.index - } } ) - //Minute + // Minute WheelTextPicker( size = DpSize( width = size.width / if (timeFormat == TimeFormat.HOUR_24) 2 else 3, @@ -169,44 +152,16 @@ internal fun DefaultWheelTimePicker( selectorProperties = WheelPickerDefaults.selectorProperties( enabled = false ), - onScrollFinished = { snappedIndex -> - - val newMinute = minutes.find { it.index == snappedIndex }?.value - - val newHour = if (timeFormat == TimeFormat.HOUR_24) { - hours.find { it.value == snappedTime.hour }?.value - } else { - amPmHourToHour24( - amPmHours.find { it.value == localTimeToAmPmHour(snappedTime) }?.value - ?: 0, - snappedTime.minute, - snappedAmPm.value - ) - } + onSnappedIndexChanged = { snappedIndex -> + val newMinute = minutes.getOrNull(snappedIndex)?.value newMinute?.let { - newHour?.let { - val newTime = snappedTime.withMinute(newMinute).withHour(newHour) - - if (!newTime.isBefore(minTime) && !newTime.isAfter(maxTime)) { - snappedTime = newTime - } - - val newIndex = minutes.find { it.value == snappedTime.minute }?.index - - newIndex?.let { - onSnappedTime( - SnappedTime.Minute( - localTime = snappedTime, - index = newIndex - ), - timeFormat - )?.let { return@WheelTextPicker it } - } + val newTime = snappedTime.withMinute(newMinute) + if (!newTime.isBefore(minTime) && !newTime.isAfter(maxTime)) { + snappedTime = newTime + onTimeChanged() } } - - return@WheelTextPicker minutes.find { it.value == snappedTime.minute }?.index } ) //AM_PM @@ -225,50 +180,19 @@ internal fun DefaultWheelTimePicker( selectorProperties = WheelPickerDefaults.selectorProperties( enabled = false ), - onScrollFinished = { snappedIndex -> - - val newAmPm = amPms.find { - if (snappedIndex == 2) { - it.index == 1 - } else { - it.index == snappedIndex - } - } + onSnappedIndexChanged = { snappedIndex -> + val newAmPm = amPms.getOrNull(snappedIndex) newAmPm?.let { snappedAmPm = newAmPm - } - - val newMinute = minutes.find { it.value == snappedTime.minute }?.value - - val newHour = amPmHourToHour24( - amPmHours.find { it.value == localTimeToAmPmHour(snappedTime) }?.value - ?: 0, - snappedTime.minute, - snappedAmPm.value - ) - - newMinute?.let { - val newTime = snappedTime.withMinute(newMinute).withHour(newHour) - + val currentAmPmHour = localTimeToAmPmHour(snappedTime) + val newHour = amPmHourToHour24(currentAmPmHour, snappedTime.minute, newAmPm.value) + val newTime = snappedTime.withHour(newHour) if (!newTime.isBefore(minTime) && !newTime.isAfter(maxTime)) { snappedTime = newTime - } - - val newIndex = minutes.find { it.value == snappedTime.hour }?.index - - newIndex?.let { - onSnappedTime( - SnappedTime.Hour( - localTime = snappedTime, - index = newIndex - ), - timeFormat - ) + onTimeChanged() } } - - return@WheelTextPicker snappedIndex } ) } diff --git a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelPicker.kt b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelPicker.kt index f35f5befecfd35d075b37bc3df5b58b1fb1dbedd..9e0eb1ba6160676704df8fd67c570b4b72c849ca 100644 --- a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelPicker.kt +++ b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelPicker.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp +import kotlinx.coroutines.flow.distinctUntilChanged import kotlin.math.absoluteValue @OptIn(ExperimentalFoundationApi::class) @@ -33,7 +34,7 @@ internal fun WheelPicker( rowCount: Int, size: DpSize = DpSize(128.dp, 128.dp), selectorProperties: SelectorProperties = WheelPickerDefaults.selectorProperties(), - onScrollFinished: (snappedIndex: Int) -> Int? = { null }, + onSnappedIndexChanged: (snappedIndex: Int) -> Unit = {}, content: @Composable LazyItemScope.(index: Int) -> Unit, ) { val lazyListState = rememberLazyListState(startIndex) @@ -42,14 +43,12 @@ internal fun WheelPicker( val flingBehavior = rememberSnapFlingBehavior(snapperLayoutInfo) - val isScrollInProgress = lazyListState.isScrollInProgress - - LaunchedEffect(isScrollInProgress, count) { - if(!isScrollInProgress) { - onScrollFinished(calculateSnappedItemIndex(lazyListState, rowCount))?.let { - lazyListState.scrollToItem(it) + LaunchedEffect(lazyListState) { + snapshotFlow { calculateSnappedItemIndex(lazyListState, rowCount) } + .distinctUntilChanged() + .collect { index -> + onSnappedIndexChanged(index) } - } } Box( diff --git a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelTextPicker.kt b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelTextPicker.kt index ffd57bf5bd6d3e7240014c749a3978561052fa12..9be166dd28565780e321bc50c94669ab0bbfd5cf 100644 --- a/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelTextPicker.kt +++ b/wheel-picker-compose/src/commonMain/kotlin/com/commandiron/wheel_picker_compose/core/WheelTextPicker.kt @@ -20,7 +20,7 @@ fun WheelTextPicker( style: TextStyle = MaterialTheme.typography.titleMedium, color: Color = LocalContentColor.current, selectorProperties: SelectorProperties = WheelPickerDefaults.selectorProperties(), - onScrollFinished: (snappedIndex: Int) -> Int? = { null }, + onSnappedIndexChanged: (snappedIndex: Int) -> Unit, ) { WheelPicker( modifier = modifier, @@ -29,7 +29,7 @@ fun WheelTextPicker( count = texts.size, rowCount = rowCount, selectorProperties = selectorProperties, - onScrollFinished = onScrollFinished + onSnappedIndexChanged = onSnappedIndexChanged, ){ index -> Text( text = texts[index],