Add preview in icon settings
This commit is contained in:
parent
fee45590d1
commit
87acb161c7
@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.settings.icons
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
@ -23,6 +24,7 @@ import androidx.compose.material3.FilledIconToggleButton
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedCard
|
||||
import androidx.compose.material3.PlainTooltipBox
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
@ -37,6 +39,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
@ -60,6 +63,7 @@ import de.mm20.launcher2.ui.component.preferences.SliderPreference
|
||||
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||
import de.mm20.launcher2.ui.component.preferences.label
|
||||
import de.mm20.launcher2.ui.component.preferences.value
|
||||
import de.mm20.launcher2.ui.ktx.toPixels
|
||||
|
||||
@Composable
|
||||
fun IconsSettingsScreen() {
|
||||
@ -67,6 +71,7 @@ fun IconsSettingsScreen() {
|
||||
val context = LocalContext.current
|
||||
|
||||
val iconSize by viewModel.iconSize.collectAsStateWithLifecycle(48)
|
||||
val density = LocalDensity.current
|
||||
val showLabels by viewModel.showLabels.collectAsStateWithLifecycle(null)
|
||||
val columnCount by viewModel.columnCount.collectAsStateWithLifecycle(5)
|
||||
val iconShape by viewModel.iconShape.collectAsStateWithLifecycle(Settings.IconSettings.IconShape.PlatformDefault)
|
||||
@ -84,6 +89,12 @@ fun IconsSettingsScreen() {
|
||||
val cloudFileBadges by viewModel.cloudFileBadges.collectAsStateWithLifecycle(null)
|
||||
val suspendedAppBadges by viewModel.suspendedAppBadges.collectAsStateWithLifecycle(null)
|
||||
val shortcutBadges by viewModel.shortcutBadges.collectAsStateWithLifecycle(null)
|
||||
|
||||
val previewIcons by remember(iconSize) {
|
||||
viewModel.getPreviewIcons(with(density) { iconSize.dp.toPx() }.toInt())
|
||||
}.collectAsState(
|
||||
emptyList()
|
||||
)
|
||||
|
||||
PreferenceScreen(title = stringResource(id = R.string.preference_screen_icons)) {
|
||||
item {
|
||||
@ -119,6 +130,29 @@ fun IconsSettingsScreen() {
|
||||
}
|
||||
item {
|
||||
PreferenceCategory(stringResource(R.string.preference_category_icons)) {
|
||||
if (previewIcons.isNotEmpty()) {
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(16.dp),
|
||||
shape = MaterialTheme.shapes.medium,
|
||||
color = MaterialTheme.colorScheme.surfaceContainer,
|
||||
border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(vertical = 24.dp, horizontal = 8.dp)
|
||||
) {
|
||||
for (icon in previewIcons) {
|
||||
Box(
|
||||
modifier = Modifier.weight(1f),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
ShapedLauncherIcon(size = iconSize.dp, icon = { icon })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
IconShapePreference(
|
||||
title = stringResource(R.string.preference_icon_shape),
|
||||
summary = getShapeName(iconShape),
|
||||
|
||||
@ -7,11 +7,16 @@ import androidx.lifecycle.viewmodel.initializer
|
||||
import androidx.lifecycle.viewmodel.viewModelFactory
|
||||
import de.mm20.launcher2.icons.IconPack
|
||||
import de.mm20.launcher2.icons.IconService
|
||||
import de.mm20.launcher2.icons.LauncherIcon
|
||||
import de.mm20.launcher2.permissions.PermissionGroup
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
import de.mm20.launcher2.search.data.LauncherApp
|
||||
import de.mm20.launcher2.services.favorites.FavoritesService
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.launch
|
||||
import org.koin.core.component.KoinComponent
|
||||
@ -20,6 +25,7 @@ import org.koin.core.component.get
|
||||
class IconsSettingsScreenVM(
|
||||
private val dataStore: LauncherDataStore,
|
||||
private val iconService: IconService,
|
||||
private val favoritesService: FavoritesService,
|
||||
private val permissionsManager: PermissionsManager,
|
||||
) : ViewModel() {
|
||||
|
||||
@ -215,6 +221,24 @@ class IconsSettingsScreenVM(
|
||||
}
|
||||
}
|
||||
|
||||
fun getPreviewIcons(size: Int): Flow<List<LauncherIcon>> {
|
||||
return columnCount.flatMapLatest { cols ->
|
||||
favoritesService.getFavorites(
|
||||
includeTypes = listOf(LauncherApp.Domain),
|
||||
limit = cols,
|
||||
manuallySorted = true,
|
||||
automaticallySorted = true,
|
||||
frequentlyUsed = true,
|
||||
)
|
||||
}.flatMapLatest { apps ->
|
||||
combine(apps.map {
|
||||
iconService.getIcon(it, size)
|
||||
}) {
|
||||
it.toList()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object : KoinComponent {
|
||||
val Factory = viewModelFactory {
|
||||
initializer {
|
||||
@ -222,6 +246,7 @@ class IconsSettingsScreenVM(
|
||||
dataStore = get(),
|
||||
iconService = get(),
|
||||
permissionsManager = get(),
|
||||
favoritesService = get(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user