Add pebble icon shape

This commit is contained in:
MM20 2022-10-10 13:42:40 +02:00
parent f7e56cd9d5
commit bdb29d912b
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 83 additions and 5 deletions

View File

@ -470,6 +470,7 @@
<string name="preference_icon_shape_triangle">Reuleaux triangle</string> <string name="preference_icon_shape_triangle">Reuleaux triangle</string>
<string name="preference_icon_shape_circle">Circle</string> <string name="preference_icon_shape_circle">Circle</string>
<string name="preference_icon_shape_teardrop">Teardrop</string> <string name="preference_icon_shape_teardrop">Teardrop</string>
<string name="preference_icon_shape_pebble">Pebble</string>
<string name="preference_icon_shape_hexagon">Hexagon</string> <string name="preference_icon_shape_hexagon">Hexagon</string>
<string name="preference_category_searchbar">Search bar</string> <string name="preference_category_searchbar">Search bar</string>
<string name="preference_screen_services">Services</string> <string name="preference_screen_services">Services</string>

View File

@ -223,6 +223,7 @@ message Settings {
Pentagon = 7; Pentagon = 7;
EasterEgg = 8; EasterEgg = 8;
Teardrop = 9; Teardrop = 9;
Pebble = 10;
} }
IconShape shape = 1; IconShape shape = 1;
bool themed_icons = 2; bool themed_icons = 2;

View File

@ -1,8 +1,10 @@
package de.mm20.launcher2.ui.component package de.mm20.launcher2.ui.component
import android.graphics.*
import android.graphics.Matrix import android.graphics.Matrix
import android.graphics.Path import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.graphics.RectF
import android.graphics.drawable.AdaptiveIconDrawable import android.graphics.drawable.AdaptiveIconDrawable
import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.LinearEasing
@ -23,17 +25,30 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.compositionLocalOf
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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.toRect import androidx.compose.ui.geometry.toRect
import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.asComposePath
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.drawscope.scale import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.graphics.drawscope.withTransform import androidx.compose.ui.graphics.drawscope.withTransform
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.graphics.toAndroidRect
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
@ -41,7 +56,19 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.icons.* import de.mm20.launcher2.icons.ClockLayer
import de.mm20.launcher2.icons.ClockSublayer
import de.mm20.launcher2.icons.ClockSublayerRole
import de.mm20.launcher2.icons.ColorLayer
import de.mm20.launcher2.icons.DynamicLauncherIcon
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.icons.LauncherIconLayer
import de.mm20.launcher2.icons.StaticIconLayer
import de.mm20.launcher2.icons.StaticLauncherIcon
import de.mm20.launcher2.icons.TextLayer
import de.mm20.launcher2.icons.TintedClockLayer
import de.mm20.launcher2.icons.TintedIconLayer
import de.mm20.launcher2.icons.TransparentLayer
import de.mm20.launcher2.ktx.drawWithColorFilter import de.mm20.launcher2.ktx.drawWithColorFilter
import de.mm20.launcher2.preferences.Settings.IconSettings.IconShape import de.mm20.launcher2.preferences.Settings.IconSettings.IconShape
import de.mm20.launcher2.ui.base.LocalTime import de.mm20.launcher2.ui.base.LocalTime
@ -219,6 +246,7 @@ private fun IconLayer(
is ClockLayer -> { is ClockLayer -> {
ClockLayer(layer.sublayers, scale = layer.scale, tintColor = null) ClockLayer(layer.sublayers, scale = layer.scale, tintColor = null)
} }
is TintedClockLayer -> { is TintedClockLayer -> {
ClockLayer( ClockLayer(
layer.sublayers, layer.sublayers,
@ -228,6 +256,7 @@ private fun IconLayer(
) )
} }
is ColorLayer -> { is ColorLayer -> {
Box( Box(
modifier = Modifier modifier = Modifier
@ -241,6 +270,7 @@ private fun IconLayer(
) )
) )
} }
is StaticIconLayer -> { is StaticIconLayer -> {
Canvas(modifier = Modifier.fillMaxSize()) { Canvas(modifier = Modifier.fillMaxSize()) {
withTransform({ withTransform({
@ -253,6 +283,7 @@ private fun IconLayer(
} }
} }
} }
is TextLayer -> { is TextLayer -> {
Text( Text(
text = layer.text, text = layer.text,
@ -266,6 +297,7 @@ private fun IconLayer(
}, },
) )
} }
is TintedIconLayer -> { is TintedIconLayer -> {
val color = val color =
if (layer.color == 0) defaultTintColor.toArgb() if (layer.color == 0) defaultTintColor.toArgb()
@ -284,6 +316,7 @@ private fun IconLayer(
} }
} }
} }
is TransparentLayer -> {} is TransparentLayer -> {}
} }
} }
@ -347,12 +380,15 @@ private fun ClockLayer(
ClockSublayerRole.Hour -> { ClockSublayerRole.Hour -> {
rotate(hour.value / 12f * 360f) rotate(hour.value / 12f * 360f)
} }
ClockSublayerRole.Minute -> { ClockSublayerRole.Minute -> {
rotate(minute.value / 60f * 360f) rotate(minute.value / 60f * 360f)
} }
ClockSublayerRole.Second -> { ClockSublayerRole.Second -> {
rotate(second.value / 60f * 360f) rotate(second.value / 60f * 360f)
} }
ClockSublayerRole.Static -> {} ClockSublayerRole.Static -> {}
} }
}) { }) {
@ -379,6 +415,7 @@ fun getShape(iconShape: IconShape): Shape {
IconShape.Hexagon -> HexagonShape IconShape.Hexagon -> HexagonShape
IconShape.Pentagon -> PentagonShape IconShape.Pentagon -> PentagonShape
IconShape.Teardrop -> TeardropShape IconShape.Teardrop -> TeardropShape
IconShape.Pebble -> PebbleShape
IconShape.EasterEgg -> EasterEggShape IconShape.EasterEgg -> EasterEggShape
IconShape.UNRECOGNIZED -> CircleShape IconShape.UNRECOGNIZED -> CircleShape
} }
@ -507,6 +544,44 @@ private val TeardropShape: Shape
close() close()
} }
private val PebbleShape: Shape
get() = GenericShape { size, _ ->
moveTo(0.55f * size.width, 0f * size.height)
cubicTo(
0.25f * size.width,
0f * size.height,
0f * size.width,
0.25f * size.height,
0f * size.width,
0.5f * size.height
)
cubicTo(
0f * size.width,
0.78f * size.height,
0.28f * size.width,
1f * size.height,
0.55f * size.width,
1f * size.height
)
cubicTo(
0.85f * size.width,
1f * size.height,
1f * size.width,
0.85f * size.height,
1f * size.width,
0.58f * size.height
)
cubicTo(
1f * size.width,
0.3f * size.height,
0.86f * size.width,
0f * size.height,
0.55f * size.width,
0f * size.height
)
close()
}
private val EasterEggShape: Shape private val EasterEggShape: Shape
get() = GenericShape { size, _ -> get() = GenericShape { size, _ ->
moveTo( moveTo(

View File

@ -593,6 +593,7 @@ private fun getShapeName(shape: IconSettings.IconShape?): String? {
IconSettings.IconShape.PlatformDefault -> R.string.preference_icon_shape_platform IconSettings.IconShape.PlatformDefault -> R.string.preference_icon_shape_platform
IconSettings.IconShape.Circle -> R.string.preference_icon_shape_circle IconSettings.IconShape.Circle -> R.string.preference_icon_shape_circle
IconSettings.IconShape.Teardrop -> R.string.preference_icon_shape_teardrop IconSettings.IconShape.Teardrop -> R.string.preference_icon_shape_teardrop
IconSettings.IconShape.Pebble -> R.string.preference_icon_shape_pebble
else -> return null else -> return null
} }
) )