Document TimePicker and ClockPicker Composable and their util classes, functions
This commit is contained in:
parent
db9c62884f
commit
7817250472
6 changed files with 91 additions and 4 deletions
|
|
@ -5,10 +5,16 @@ import androidx.compose.runtime.remember
|
||||||
import java.text.DateFormatSymbols
|
import java.text.DateFormatSymbols
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns Default AM, PM texts for given [locale].
|
||||||
|
*/
|
||||||
fun defaultAmPmStrings(locale: Locale = Locale.getDefault()) =
|
fun defaultAmPmStrings(locale: Locale = Locale.getDefault()) =
|
||||||
DateFormatSymbols.getInstance(locale).amPmStrings.toList()
|
DateFormatSymbols.getInstance(locale).amPmStrings.toList()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caches the [defaultAmPmStrings].
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun rememberDefaultAMPMList(locale: Locale = Locale.getDefault()) = remember(locale) {
|
fun rememberDefaultAMPMList(locale: Locale = Locale.getDefault()) = remember(locale) {
|
||||||
DateFormatSymbols.getInstance(locale).amPmStrings.toList()
|
defaultAmPmStrings(locale = locale)
|
||||||
}
|
}
|
||||||
|
|
@ -3,6 +3,9 @@ package org.fknives.android.compose.picker.time
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selection state object, representing current selection of [TimePicker]
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
data class SelectedTime(
|
data class SelectedTime(
|
||||||
val hour: Int,
|
val hour: Int,
|
||||||
|
|
@ -11,6 +14,10 @@ data class SelectedTime(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
/**
|
||||||
|
* Creates [SelectedTime] from the given unix [time] stamp.
|
||||||
|
* Defaults to Current Time.
|
||||||
|
*/
|
||||||
fun get(time: Long = System.currentTimeMillis()): SelectedTime {
|
fun get(time: Long = System.currentTimeMillis()): SelectedTime {
|
||||||
val calendar = Calendar.getInstance()
|
val calendar = Calendar.getInstance()
|
||||||
calendar.timeInMillis = time
|
calendar.timeInMillis = time
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,25 @@ import org.fknives.android.compose.picker.number.NumberPickerConfig
|
||||||
import org.fknives.android.compose.picker.number.rememberNumberPickerScope
|
import org.fknives.android.compose.picker.number.rememberNumberPickerScope
|
||||||
import org.fknives.android.compose.picker.number.rememberNumberPickerState
|
import org.fknives.android.compose.picker.number.rememberNumberPickerState
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up Time Pickers.
|
||||||
|
* Expected to contain an Hour, Minute and AM/PM Picker, respectively, Number, Number and TextPicker.
|
||||||
|
*
|
||||||
|
* Creates a [TimePickerScope] which then is feeded to [timePickers].
|
||||||
|
*
|
||||||
|
* @param timePickersMinWidth MinWidth given for each TimePicker.
|
||||||
|
* @param selectedTime currently selected [SelectedTime]
|
||||||
|
* @param onSelectedTimeChanged notified when [SelectedTime] should be changes by User Actions.
|
||||||
|
* @param amPm the list of translated texts for "AM" and "PM". Expected order is AM,PM.
|
||||||
|
* @param timePickers the actual Composable for TimePickers.
|
||||||
|
* *Note: Check Defaults for customization: [StandardTimePickers].
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun TimePicker(
|
fun TimePicker(
|
||||||
timePickersMinWidth: Dp = 40.dp,
|
timePickersMinWidth: Dp = 40.dp,
|
||||||
selectedTime: SelectedTime,
|
selectedTime: SelectedTime,
|
||||||
amPm: List<String> = rememberDefaultAMPMList(),
|
|
||||||
onSelectedTimeChanged: (SelectedTime) -> Unit,
|
onSelectedTimeChanged: (SelectedTime) -> Unit,
|
||||||
|
amPm: List<String> = rememberDefaultAMPMList(),
|
||||||
timePickers: @Composable (TimePickerScope) -> Unit = { StandardTimePickers(it) }
|
timePickers: @Composable (TimePickerScope) -> Unit = { StandardTimePickers(it) }
|
||||||
) {
|
) {
|
||||||
val hourConfig = remember { NumberPickerConfig.configHourPicker12 }
|
val hourConfig = remember { NumberPickerConfig.configHourPicker12 }
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,11 @@ import androidx.compose.ui.unit.Dp
|
||||||
import org.fknives.android.compose.picker.number.NumberPickerScope
|
import org.fknives.android.compose.picker.number.NumberPickerScope
|
||||||
import org.fknives.android.compose.picker.text.util.TextPickerDefaults
|
import org.fknives.android.compose.picker.text.util.TextPickerDefaults
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope setup from [TimePicker].
|
||||||
|
*
|
||||||
|
* Contains all the Values for the respective Hour, Minute and AMorPM Pickers.
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
interface TimePickerScope {
|
interface TimePickerScope {
|
||||||
val timePickerMinWidth: Dp
|
val timePickerMinWidth: Dp
|
||||||
|
|
@ -15,6 +20,9 @@ interface TimePickerScope {
|
||||||
val amORpmPickerScope: AMorPMPickerScope
|
val amORpmPickerScope: AMorPMPickerScope
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data class implementation of [TimePickerScope]
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
data class TimePickerScopeImpl(
|
data class TimePickerScopeImpl(
|
||||||
override val timePickerMinWidth: Dp,
|
override val timePickerMinWidth: Dp,
|
||||||
|
|
@ -23,6 +31,10 @@ data class TimePickerScopeImpl(
|
||||||
override val amORpmPickerScope: AMorPMPickerScope
|
override val amORpmPickerScope: AMorPMPickerScope
|
||||||
) : TimePickerScope
|
) : TimePickerScope
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intended scope for AMorPM Picker.
|
||||||
|
* Contained within [TimePickerScope]
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
interface AMorPMPickerScope {
|
interface AMorPMPickerScope {
|
||||||
val listOfAMorPM: List<String>
|
val listOfAMorPM: List<String>
|
||||||
|
|
@ -31,6 +43,9 @@ interface AMorPMPickerScope {
|
||||||
val onIndexDifferenceChanging: (Int) -> Unit
|
val onIndexDifferenceChanging: (Int) -> Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data class implementation of [AMorPMPickerScope]
|
||||||
|
*/
|
||||||
@Immutable
|
@Immutable
|
||||||
data class AMorPMPickerScopeImpl(
|
data class AMorPMPickerScopeImpl(
|
||||||
override val listOfAMorPM: List<String>,
|
override val listOfAMorPM: List<String>,
|
||||||
|
|
@ -39,6 +54,9 @@ data class AMorPMPickerScopeImpl(
|
||||||
override val onIndexDifferenceChanging: (Int) -> Unit = TextPickerDefaults.onIndexDifferenceChanging
|
override val onIndexDifferenceChanging: (Int) -> Unit = TextPickerDefaults.onIndexDifferenceChanging
|
||||||
) : AMorPMPickerScope
|
) : AMorPMPickerScope
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caching function for [AMorPMPickerScope]
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun rememberAMorPMPickerScope(
|
fun rememberAMorPMPickerScope(
|
||||||
listOfAMorPM: List<String>,
|
listOfAMorPM: List<String>,
|
||||||
|
|
@ -57,6 +75,9 @@ fun rememberAMorPMPickerScope(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caching function for [TimePickerScope]
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun rememberTimePickerScope(
|
fun rememberTimePickerScope(
|
||||||
timePickerMinWidth: Dp,
|
timePickerMinWidth: Dp,
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,11 @@ import org.fknives.android.compose.picker.number.CustomInnerTextPicker
|
||||||
import org.fknives.android.compose.picker.text.TextPicker
|
import org.fknives.android.compose.picker.text.TextPicker
|
||||||
import org.fknives.android.compose.picker.text.util.TextPickerDefaults
|
import org.fknives.android.compose.picker.text.util.TextPickerDefaults
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Pickers for [TimePicker].
|
||||||
|
*
|
||||||
|
* Gets values from [scope] and creates the respective Pickers.
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun StandardTimePickers(scope: TimePickerScope) {
|
fun StandardTimePickers(scope: TimePickerScope) {
|
||||||
Row {
|
Row {
|
||||||
|
|
@ -21,6 +26,11 @@ fun StandardTimePickers(scope: TimePickerScope) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Hour Picker for [TimePicker]
|
||||||
|
*
|
||||||
|
* Gets values from [TimePickerScope.hoursPickerScope].
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun TimePickerScope.HourPicker(
|
fun TimePickerScope.HourPicker(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
|
@ -36,6 +46,12 @@ fun TimePickerScope.HourPicker(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Hour Picker for [TimePicker]
|
||||||
|
*
|
||||||
|
* Gets values from [TimePickerScope.minutesPickerScope].
|
||||||
|
*/
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun TimePickerScope.MinutePicker(
|
fun TimePickerScope.MinutePicker(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
|
@ -51,6 +67,11 @@ fun TimePickerScope.MinutePicker(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Hour Picker for [TimePicker]
|
||||||
|
*
|
||||||
|
* Gets values from [TimePickerScope.amORpmPickerScope].
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun TimePickerScope.IsAMorPMPicker(
|
fun TimePickerScope.IsAMorPMPicker(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,28 @@ import org.fknives.android.compose.picker.time.rememberDefaultAMPMList
|
||||||
import org.fknives.android.compose.picker.time.rememberTimePickerScope
|
import org.fknives.android.compose.picker.time.rememberTimePickerScope
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom [TimePicker][org.fknives.android.compose.picker.time.TimePicker] implementation.
|
||||||
|
*
|
||||||
|
* Main difference is that this implementation contains additional interactions between the elements:
|
||||||
|
* - When Hour Rotates Around (1 -by decrease-> 12 or 12 -by increase-> 1) the AM/PM Picker is automatically updated.
|
||||||
|
* - When Minute Rotates Around (0 -by decrease-> 59 or 59 by increase-> 0) the Hour Picker is updated
|
||||||
|
* (if that rotates around the AM/PM also)
|
||||||
|
*
|
||||||
|
* These updates are just on the UI while selecting, they become permanent, aka [onSelectedTimeChanged] notified only when the user lets go.
|
||||||
|
*
|
||||||
|
* Creates a Custom Implementation [TimePickerScope] which then is feeded to [timePickers].
|
||||||
|
*
|
||||||
|
* @param timePickersMinWidth MinWidth given for each TimePicker.
|
||||||
|
* @param selectedTime currently selected [SelectedTime]
|
||||||
|
* @param onSelectedTimeChanged notified when [SelectedTime] should be changes by User Actions.
|
||||||
|
* @param amPm the list of translated texts for "AM" and "PM". Expected order is AM,PM.
|
||||||
|
* @param timePickers the actual Composable for TimePickers.
|
||||||
|
* *Note: Check Defaults for customization: [StandardTimePickers].
|
||||||
|
*/
|
||||||
@Composable
|
@Composable
|
||||||
fun ClockTimePicker(
|
fun ClockTimePicker(
|
||||||
timePickerMinWidth: Dp = 40.dp,
|
timePickersMinWidth: Dp = 40.dp,
|
||||||
selectedTime: SelectedTime,
|
selectedTime: SelectedTime,
|
||||||
amPm: List<String> = rememberDefaultAMPMList(),
|
amPm: List<String> = rememberDefaultAMPMList(),
|
||||||
onSelectedTimeChanged: (SelectedTime) -> Unit,
|
onSelectedTimeChanged: (SelectedTime) -> Unit,
|
||||||
|
|
@ -80,7 +99,7 @@ fun ClockTimePicker(
|
||||||
)
|
)
|
||||||
|
|
||||||
val scope = rememberTimePickerScope(
|
val scope = rememberTimePickerScope(
|
||||||
timePickerMinWidth = timePickerMinWidth,
|
timePickerMinWidth = timePickersMinWidth,
|
||||||
hoursPickerScope = hourScope,
|
hoursPickerScope = hourScope,
|
||||||
minutesPickerScope = minutesScope,
|
minutesPickerScope = minutesScope,
|
||||||
amORpmPickerScope = amORpmScope
|
amORpmPickerScope = amORpmScope
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue