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_circle">Circle</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_category_searchbar">Search bar</string>
<string name="preference_screen_services">Services</string>

View File

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

View File

@ -1,8 +1,10 @@
package de.mm20.launcher2.ui.component
import android.graphics.*
import android.graphics.Matrix
import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.graphics.RectF
import android.graphics.drawable.AdaptiveIconDrawable
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.LinearEasing
@ -23,17 +25,30 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
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.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.toRect
import androidx.compose.ui.graphics.*
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.scale
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.platform.LocalDensity
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.sp
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.preferences.Settings.IconSettings.IconShape
import de.mm20.launcher2.ui.base.LocalTime
@ -139,7 +166,7 @@ fun ShapedLauncherIcon(
)
}
} else Modifier
),
),
color = MaterialTheme.colorScheme.secondary,
shape = CircleShape
) {
@ -219,6 +246,7 @@ private fun IconLayer(
is ClockLayer -> {
ClockLayer(layer.sublayers, scale = layer.scale, tintColor = null)
}
is TintedClockLayer -> {
ClockLayer(
layer.sublayers,
@ -228,6 +256,7 @@ private fun IconLayer(
)
}
is ColorLayer -> {
Box(
modifier = Modifier
@ -241,6 +270,7 @@ private fun IconLayer(
)
)
}
is StaticIconLayer -> {
Canvas(modifier = Modifier.fillMaxSize()) {
withTransform({
@ -253,6 +283,7 @@ private fun IconLayer(
}
}
}
is TextLayer -> {
Text(
text = layer.text,
@ -266,6 +297,7 @@ private fun IconLayer(
},
)
}
is TintedIconLayer -> {
val color =
if (layer.color == 0) defaultTintColor.toArgb()
@ -284,6 +316,7 @@ private fun IconLayer(
}
}
}
is TransparentLayer -> {}
}
}
@ -347,12 +380,15 @@ private fun ClockLayer(
ClockSublayerRole.Hour -> {
rotate(hour.value / 12f * 360f)
}
ClockSublayerRole.Minute -> {
rotate(minute.value / 60f * 360f)
}
ClockSublayerRole.Second -> {
rotate(second.value / 60f * 360f)
}
ClockSublayerRole.Static -> {}
}
}) {
@ -379,6 +415,7 @@ fun getShape(iconShape: IconShape): Shape {
IconShape.Hexagon -> HexagonShape
IconShape.Pentagon -> PentagonShape
IconShape.Teardrop -> TeardropShape
IconShape.Pebble -> PebbleShape
IconShape.EasterEgg -> EasterEggShape
IconShape.UNRECOGNIZED -> CircleShape
}
@ -507,6 +544,44 @@ private val TeardropShape: Shape
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
get() = GenericShape { size, _ ->
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.Circle -> R.string.preference_icon_shape_circle
IconSettings.IconShape.Teardrop -> R.string.preference_icon_shape_teardrop
IconSettings.IconShape.Pebble -> R.string.preference_icon_shape_pebble
else -> return null
}
)