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,
)
}
}