diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt index 8fddf522..09807498 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/ClockWidget.kt @@ -24,6 +24,7 @@ import androidx.compose.material.icons.rounded.AlignVerticalBottom import androidx.compose.material.icons.rounded.AlignVerticalCenter import androidx.compose.material.icons.rounded.AlignVerticalTop import androidx.compose.material.icons.rounded.AutoAwesome +import androidx.compose.material.icons.rounded.AvTimer import androidx.compose.material.icons.rounded.BatteryFull import androidx.compose.material.icons.rounded.ColorLens import androidx.compose.material.icons.rounded.DarkMode @@ -312,7 +313,8 @@ fun Clock( compact, showSeconds, useThemeColor, - darkColors + darkColors, + style ) is ClockWidgetStyle.Orbit -> OrbitClock( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/WatchFaceSelector.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/WatchFaceSelector.kt index 6d483211..0b392d2e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/WatchFaceSelector.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/WatchFaceSelector.kt @@ -147,7 +147,9 @@ fun WatchFaceSelector( Box { androidx.compose.animation.AnimatedVisibility( - selected is ClockWidgetStyle.Digital1 || (selected is ClockWidgetStyle.Custom && selected.widgetId != null), + selected is ClockWidgetStyle.Digital1 || + selected is ClockWidgetStyle.Analog || + (selected is ClockWidgetStyle.Custom && selected.widgetId != null), modifier = Modifier .align(Alignment.TopEnd) .zIndex(1f), @@ -179,6 +181,21 @@ fun WatchFaceSelector( } ) } + if (selected is ClockWidgetStyle.Analog) { + DropdownMenuItem( + text = { Text(stringResource(R.string.clock_variant_analog_ticks)) }, + leadingIcon = { + Icon( + if (selected.showTicks) Icons.Rounded.CheckCircle + else Icons.Rounded.RadioButtonUnchecked, + null + ) + }, + onClick = { + onSelect(selected.copy(showTicks = !selected.showTicks)) + } + ) + } if (selected is ClockWidgetStyle.Custom) { DropdownMenuItem( text = { Text(stringResource(R.string.widget_pick_widget)) }, diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/clocks/AnalogClock.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/clocks/AnalogClock.kt index 9326cb74..f113b146 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/clocks/AnalogClock.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/clocks/AnalogClock.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Fill import androidx.compose.ui.graphics.drawscope.rotate import androidx.compose.ui.unit.dp +import de.mm20.launcher2.preferences.ClockWidgetStyle import de.mm20.launcher2.ui.locals.LocalDarkTheme import java.util.Calendar @@ -23,6 +24,7 @@ fun AnalogClock( showSeconds: Boolean, useThemeColor: Boolean, darkColors: Boolean, + style: ClockWidgetStyle.Analog, ) { val verticalLayout = !compact val date = Calendar.getInstance() @@ -66,6 +68,19 @@ fun AnalogClock( .padding(top = if (verticalLayout) 8.dp else 0.dp, bottom = if (verticalLayout) 8.dp else 0.dp) .size(size)) { + if (style.showTicks) { + for (hour in 0.. 11) { + rotate(hour.toFloat() / 12f * 360f, this.size.center) { + drawLine( + secondaryColor, + this.size.center.copy(y = this.size.height * 0.95f), + this.size.center.copy(y = this.size.height), + strokeWidth = (strokeWidth * 0.75f).toPx(), + cap = StrokeCap.Round + ) + } + } + } rotate(hour.toFloat() / 12f * 360f + ((minute.toFloat() / 60f) * 30f) + (second.toFloat() / 120f), this.size.center) { drawLine( color, diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt index 68397e8d..792800c7 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/clockwidget/ClockWidgetSettingsScreenVM.kt @@ -21,11 +21,11 @@ class ClockWidgetSettingsScreenVM : ViewModel(), KoinComponent { settings.setCompact(compact) } - val availableClockStyles = combine(settings.digital1, settings.custom) { digital1, custom -> + val availableClockStyles = combine(settings.digital1, settings.analog, settings.custom) { digital1, analog, custom -> listOf( digital1, ClockWidgetStyle.Digital2, - ClockWidgetStyle.Analog, + analog, ClockWidgetStyle.Orbit, ClockWidgetStyle.Segment, ClockWidgetStyle.Binary, diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index fc333f5e..aa5667b9 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -878,6 +878,7 @@ No clock Custom widget Outlined + Ticks Show filters Hide filters Tools diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt index 8b0cd24c..57438b51 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherSettingsData.kt @@ -41,6 +41,7 @@ data class LauncherSettingsData internal constructor( @SerialName("clockWidgetStyle2") internal val clockWidgetStyle: ClockWidgetStyleEnum = ClockWidgetStyleEnum.Digital1, val clockWidgetDigital1: ClockWidgetStyle.Digital1 = ClockWidgetStyle.Digital1(), + val clockWidgetAnalog: ClockWidgetStyle.Analog = ClockWidgetStyle.Analog(), val clockWidgetCustom: ClockWidgetStyle.Custom = ClockWidgetStyle.Custom(), val clockWidgetColors: ClockWidgetColors = ClockWidgetColors.Auto, val clockWidgetShowSeconds: Boolean = false, @@ -249,7 +250,9 @@ sealed interface ClockWidgetStyle { @Serializable @SerialName("analog") - data object Analog : ClockWidgetStyle + data class Analog( + val showTicks: Boolean = false + ) : ClockWidgetStyle @Serializable @SerialName("binary") diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt index db44f9c7..632a1a29 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ui/ClockWidgetSettings.kt @@ -84,7 +84,7 @@ class ClockWidgetSettings internal constructor( ClockWidgetStyleEnum.Digital1 -> it.clockWidgetDigital1 ClockWidgetStyleEnum.Digital2 -> ClockWidgetStyle.Digital2 ClockWidgetStyleEnum.Orbit -> ClockWidgetStyle.Orbit - ClockWidgetStyleEnum.Analog -> ClockWidgetStyle.Analog + ClockWidgetStyleEnum.Analog -> it.clockWidgetAnalog ClockWidgetStyleEnum.Binary -> ClockWidgetStyle.Binary ClockWidgetStyleEnum.Segment -> ClockWidgetStyle.Segment ClockWidgetStyleEnum.Empty -> ClockWidgetStyle.Empty @@ -95,6 +95,9 @@ class ClockWidgetSettings internal constructor( val digital1: Flow get() = launcherDataStore.data.map { it.clockWidgetDigital1 } + val analog: Flow + get() = launcherDataStore.data.map { it.clockWidgetAnalog } + val custom: Flow get() = launcherDataStore.data.map { it.clockWidgetCustom } @@ -102,8 +105,9 @@ class ClockWidgetSettings internal constructor( launcherDataStore.update { it.copy( clockWidgetStyle = clockStyle.enumValue, - clockWidgetDigital1 = if (clockStyle is ClockWidgetStyle.Digital1) clockStyle else it.clockWidgetDigital1, - clockWidgetCustom = if (clockStyle is ClockWidgetStyle.Custom) clockStyle else it.clockWidgetCustom, + clockWidgetDigital1 = clockStyle as? ClockWidgetStyle.Digital1 ?: it.clockWidgetDigital1, + clockWidgetAnalog = clockStyle as? ClockWidgetStyle.Analog ?: it.clockWidgetAnalog, + clockWidgetCustom = clockStyle as? ClockWidgetStyle.Custom ?: it.clockWidgetCustom, ) } }