From 930897f1d6f878dfa82d3ad6bde6dec519340e4c Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:49:45 +0100 Subject: [PATCH] Add preference for compact tag buttons Close #645 --- .../ui/common/FavoritesTagSelector.kt | 75 ++++++++++++++----- .../mm20/launcher2/ui/common/FavoritesVM.kt | 1 + .../ui/launcher/search/SearchColumn.kt | 2 + .../search/favorites/SearchFavorites.kt | 2 + .../search/favorites/SearchFavoritesVM.kt | 2 + .../launcher/sheets/ConfigureWidgetSheet.kt | 8 ++ .../widgets/favorites/FavoritesWidget.kt | 2 + .../widgets/favorites/FavoritesWidgetVM.kt | 2 + .../favorites/FavoritesSettingsScreen.kt | 9 +++ .../favorites/FavoritesSettingsScreenVM.kt | 6 ++ core/i18n/src/main/res/values/strings.xml | 2 + .../preferences/LauncherSettingsData.kt | 1 + .../preferences/search/FavoritesSettings.kt | 7 ++ .../mm20/launcher2/widgets/FavoritesWidget.kt | 1 + 14 files changed, 102 insertions(+), 18 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesTagSelector.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesTagSelector.kt index 6c683fbc..990ba7d5 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesTagSelector.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesTagSelector.kt @@ -49,6 +49,7 @@ fun FavoritesTagSelector( reverse: Boolean, onSelectTag: (String?) -> Unit, scrollState: ScrollState, + compact: Boolean, expanded: Boolean, onExpand: (Boolean) -> Unit, ) { @@ -86,14 +87,26 @@ fun FavoritesTagSelector( ), selected = selectedTag == null, onClick = { onSelectTag(null) }, - leadingIcon = { - Icon( - imageVector = Icons.Rounded.Star, - contentDescription = null, - modifier = Modifier.size(FilterChipDefaults.IconSize), - ) + leadingIcon = if (compact) null else { + { + Icon( + imageVector = Icons.Rounded.Star, + contentDescription = null, + modifier = Modifier.size(FilterChipDefaults.IconSize), + ) + } }, - label = { Text(stringResource(R.string.favorites)) } + label = { + if (compact) { + Icon( + imageVector = Icons.Rounded.Star, + contentDescription = null, + modifier = Modifier.size(FilterChipDefaults.IconSize), + ) + } else { + Text(stringResource(R.string.favorites)) + } + } ) for (tag in tags) { TagChip( @@ -112,6 +125,7 @@ fun FavoritesTagSelector( onSelectTag(tag.tag) } }, + compact = compact, onLongClick = { sheetManager.showEditTagSheet(tag.tag) } @@ -164,24 +178,43 @@ fun FavoritesTagSelector( FilterChip( modifier = Modifier .padding(end = 8.dp) - .sharedBounds(rememberSharedContentState("favorites"), this@AnimatedContent), + .sharedBounds( + rememberSharedContentState("favorites"), + this@AnimatedContent + ), selected = selectedTag == null, onClick = { onSelectTag(null) }, - leadingIcon = { - Icon( - imageVector = Icons.Rounded.Star, - contentDescription = null, - modifier = Modifier.size(FilterChipDefaults.IconSize), - ) + leadingIcon = if (compact) null else { + { + Icon( + imageVector = Icons.Rounded.Star, + contentDescription = null, + modifier = Modifier.size(FilterChipDefaults.IconSize), + ) + } }, - label = { Text(stringResource(R.string.favorites)) } + label = { + if (compact) { + Icon( + imageVector = Icons.Rounded.Star, + contentDescription = null, + modifier = Modifier.size(FilterChipDefaults.IconSize), + ) + } else { + Text(stringResource(R.string.favorites)) + } + } ) for (tag in tags) { TagChip( modifier = Modifier .padding(end = 8.dp) - .sharedBounds(rememberSharedContentState("tag-${tag.tag}"), this@AnimatedContent), + .sharedBounds( + rememberSharedContentState("tag-${tag.tag}"), + this@AnimatedContent + ), tag = tag, + compact = compact, selected = selectedTag == tag.tag, onClick = { if (selectedTag == tag.tag) { @@ -207,7 +240,10 @@ fun FavoritesTagSelector( IconButton( modifier = Modifier .rotate(rot) - .sharedBounds(rememberSharedContentState("expand"), this@AnimatedContent), + .sharedBounds( + rememberSharedContentState("expand"), + this@AnimatedContent + ), onClick = { onExpand(false) } ) { Icon(Icons.Rounded.ExpandLess, null) @@ -216,7 +252,10 @@ fun FavoritesTagSelector( if (editButton) { SmallFloatingActionButton( modifier = Modifier - .sharedBounds(rememberSharedContentState("edit"), this@AnimatedContent), + .sharedBounds( + rememberSharedContentState("edit"), + this@AnimatedContent + ), elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation(), onClick = { sheetManager.showEditFavoritesSheet() } ) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt index fdd8fdcd..6f02ca88 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt @@ -27,6 +27,7 @@ abstract class FavoritesVM : ViewModel(), KoinComponent { val showEditButton = settings.showEditButton.stateIn(viewModelScope, SharingStarted.Lazily, false) abstract val tagsExpanded: Flow + abstract val compactTags: Flow val pinnedTags = favoritesService.getFavorites( includeTypes = listOf("tag"), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt index 70928ab4..6d241c8a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt @@ -105,6 +105,7 @@ fun SearchColumn( val pinnedTags by favoritesVM.pinnedTags.collectAsState(emptyList()) val selectedTag by favoritesVM.selectedTag.collectAsState(null) + val compactTags by favoritesVM.compactTags.collectAsState(false) val favoritesEditButton by favoritesVM.showEditButton.collectAsState(false) val favoritesTagsExpanded by favoritesVM.tagsExpanded.collectAsState(false) @@ -168,6 +169,7 @@ fun SearchColumn( onExpandTags = { favoritesVM.setTagsExpanded(it) }, + compactTags = compactTags, editButton = favoritesEditButton ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavorites.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavorites.kt index 42080895..78b737be 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavorites.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavorites.kt @@ -28,6 +28,7 @@ fun LazyListScope.SearchFavorites( favorites: List, pinnedTags: List, selectedTag: String?, + compactTags: Boolean, tagsExpanded: Boolean, onExpandTags: (Boolean) -> Unit, onSelectTag: (String?) -> Unit, @@ -72,6 +73,7 @@ fun LazyListScope.SearchFavorites( onSelectTag = onSelectTag, scrollState = rememberScrollState(), expanded = tagsExpanded, + compact = compactTags, onExpand = onExpandTags, ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavoritesVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavoritesVM.kt index 3310bf43..89013a72 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavoritesVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/favorites/SearchFavoritesVM.kt @@ -19,4 +19,6 @@ class SearchFavoritesVM : FavoritesVM() { uiState.setFavoritesTagsExpanded(expanded) } + override val compactTags: Flow = settings.compactTags + } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt index a67abf28..cf7f1979 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/ConfigureWidgetSheet.kt @@ -207,6 +207,14 @@ fun ColumnScope.ConfigureFavoritesWidget( onWidgetUpdated(widget.copy(config = widget.config.copy(editButton = it))) } ) + SwitchPreference( + title = stringResource(R.string.preference_compact_tags), + iconPadding = false, + value = widget.config.compactTags, + onValueChanged = { + onWidgetUpdated(widget.copy(config = widget.config.copy(compactTags = it))) + } + ) } } TextButton( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt index 29d35906..ecfa5214 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt @@ -32,6 +32,7 @@ fun FavoritesWidget(widget: FavoritesWidget) { val favorites by remember { viewModel.favorites }.collectAsState(emptyList()) val pinnedTags by viewModel.pinnedTags.collectAsState(emptyList()) val selectedTag by viewModel.selectedTag.collectAsState(null) + val compactTags by viewModel.compactTags.collectAsState(false) val favoritesEditButton = widget.config.editButton val tagsExpanded by viewModel.tagsExpanded.collectAsState(false) @@ -61,6 +62,7 @@ fun FavoritesWidget(widget: FavoritesWidget) { onSelectTag = { viewModel.selectTag(it) }, scrollState = rememberScrollState(), expanded = tagsExpanded, + compact = compactTags, onExpand = { viewModel.setTagsExpanded(it) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt index c5d0ead9..80120a04 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt @@ -6,6 +6,7 @@ import de.mm20.launcher2.preferences.ui.UiSettings import de.mm20.launcher2.services.widgets.WidgetsService import de.mm20.launcher2.ui.common.FavoritesVM import de.mm20.launcher2.widgets.FavoritesWidget +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map @@ -20,6 +21,7 @@ class FavoritesWidgetVM : FavoritesVM() { private val widget = MutableStateFlow(null) override val tagsExpanded = widget.map { it?.config?.tagsMultiline == true } + override val compactTags: Flow = widget.map { it?.config?.compactTags == true } private val isTopWidget = widgetsService.isFavoritesWidgetFirst() private val clockWidgetFavSlots = diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt index fa57ad25..f1a0abb3 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt @@ -83,6 +83,7 @@ fun FavoritesSettingsScreen() { } item { val editButton by viewModel.editButton.collectAsState() + val compactTags by viewModel.compactTags.collectAsState() PreferenceCategory { SwitchPreference( title = stringResource(R.string.preference_edit_button), @@ -93,6 +94,14 @@ fun FavoritesSettingsScreen() { }, icon = Icons.Rounded.Edit ) + SwitchPreference( + title = stringResource(R.string.preference_compact_tags), + summary = stringResource(R.string.preference_compact_tags_summary), + value = compactTags == true, + onValueChanged = { + viewModel.setCompactTags(it) + }, + ) } } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt index 4012d075..1a47b58d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt @@ -39,4 +39,10 @@ class FavoritesSettingsScreenVM: ViewModel(), KoinComponent { fun setSearchResultWeightFactor(searchResultWeightFactor: WeightFactor) { rankingSettings.setWeightFactor(searchResultWeightFactor) } + + val compactTags = favoritesSettings.compactTags + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) + fun setCompactTags(compactTags: Boolean) { + favoritesSettings.setCompactTags(compactTags) + } } \ No newline at end of file diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index af33845e..062ac513 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -652,6 +652,8 @@ Show frequently used items in favorites Edit button Show a button to rearrange the favorites + Compact tags + Hide tag labels or icons to reduce the space occupied by tags Show a button to add, remove and rearrange widgets Home screen Clock, search bar, wallpaper, system bars 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 d27762cf..8456e566 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 @@ -48,6 +48,7 @@ data class LauncherSettingsData internal constructor( val favoritesFrequentlyUsed: Boolean = true, val favoritesFrequentlyUsedRows: Int = 1, val favoritesEditButton: Boolean = true, + val favoritesCompactTags: Boolean = false, val fileSearchProviders: Set = setOf("local"), diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/FavoritesSettings.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/FavoritesSettings.kt index 7afe0bd7..06139e07 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/FavoritesSettings.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/search/FavoritesSettings.kt @@ -41,4 +41,11 @@ class FavoritesSettings internal constructor( fun setFrequentlyUsedRows(frequentlyUsedRows: Int) { dataStore.update { it.copy(favoritesFrequentlyUsedRows = frequentlyUsedRows) } } + + val compactTags: Flow + get() = dataStore.data.map { it.favoritesCompactTags }.distinctUntilChanged() + + fun setCompactTags(compactTags: Boolean) { + dataStore.update { it.copy(favoritesCompactTags = compactTags) } + } } \ No newline at end of file diff --git a/data/widgets/src/main/java/de/mm20/launcher2/widgets/FavoritesWidget.kt b/data/widgets/src/main/java/de/mm20/launcher2/widgets/FavoritesWidget.kt index d84d35e5..f8b8a16b 100644 --- a/data/widgets/src/main/java/de/mm20/launcher2/widgets/FavoritesWidget.kt +++ b/data/widgets/src/main/java/de/mm20/launcher2/widgets/FavoritesWidget.kt @@ -10,6 +10,7 @@ import java.util.UUID data class FavoritesWidgetConfig( val editButton: Boolean = true, val tagsMultiline: Boolean = false, + val compactTags: Boolean = false, ) data class FavoritesWidget(