diff --git a/app/src/main/java/xyz/pixelatedw/recipe/MainActivity.kt b/app/src/main/java/xyz/pixelatedw/recipe/MainActivity.kt index ab6cea4..369bd37 100644 --- a/app/src/main/java/xyz/pixelatedw/recipe/MainActivity.kt +++ b/app/src/main/java/xyz/pixelatedw/recipe/MainActivity.kt @@ -33,7 +33,7 @@ class MainActivity : ComponentActivity() { ).allowMainThreadQueries().build() val recipes = db.recipeWithTagsDao().getAll() - recipeView.setRecipes(recipes) + recipeView.setAllRecipes(recipes) enableEdgeToEdge() diff --git a/app/src/main/java/xyz/pixelatedw/recipe/data/RecipesView.kt b/app/src/main/java/xyz/pixelatedw/recipe/data/RecipesView.kt index 3ea5bb2..9879d92 100644 --- a/app/src/main/java/xyz/pixelatedw/recipe/data/RecipesView.kt +++ b/app/src/main/java/xyz/pixelatedw/recipe/data/RecipesView.kt @@ -9,9 +9,15 @@ class RecipesView : ViewModel() { private val _activeRecipe = MutableStateFlow(null) val activeRecipe = _activeRecipe.asStateFlow() + private val _allRecipes = MutableStateFlow>(arrayListOf()) + val allRecipes = _allRecipes.asStateFlow() + private val _recipes = MutableStateFlow>(arrayListOf()) val recipes = _recipes.asStateFlow() + private val _allTagFilters = MutableStateFlow>(arrayListOf()) + val allTagFilters = _allTagFilters.asStateFlow() + private val _tagFilters = MutableStateFlow>(arrayListOf()) val tagFilters = _tagFilters.asStateFlow() @@ -28,7 +34,7 @@ class RecipesView : ViewModel() { val activeFilterNames = _tagFilters.value.filter { f -> f.checked }.map { f -> f.tag } val filtersMap = mutableMapOf() - _recipes.value.stream() + _allRecipes.value.stream() .filter { it.tags.isNotEmpty() } .filter { if (activeFilterNames.isNotEmpty()) { @@ -44,12 +50,21 @@ class RecipesView : ViewModel() { } } - val filters = filtersMap.map { TagFilter(it.key, checked = activeFilterNames.contains(it.key), count = it.value) } - _tagFilters.update { filters.distinct().sortedBy { it.tag }.toList() } + val filters = filtersMap.map { + TagFilter( + it.key, + checked = activeFilterNames.contains(it.key), + count = it.value + ) + } + _tagFilters.update { filters.distinctBy { it.tag }.sortedBy { it.tag }.toList() } } fun setTagFilterState(tag: String, state: Boolean) { - _tagFilters.value = _tagFilters.value.map { if (tag == it.tag) it.checked = state; it } + _tagFilters.update { + _allTagFilters.value + .map { if (tag == it.tag) it.checked = state; it } + } this.reloadTagFilterState() } @@ -58,7 +73,26 @@ class RecipesView : ViewModel() { _keepScreenOn.update { flag } } - fun setRecipes(recipes: List) { + fun setAllRecipes(recipes: List) { + _allRecipes.update { recipes.sortedBy { it.recipe.title } } + _allTagFilters.update { + recipes.flatMap { it.tags } + .distinctBy { it.name } + .map { + TagFilter( + it.name, + false, + _allRecipes.value.count { r -> + r.tags.map { t -> t.name }.contains(it.name) + }) + } + .sortedBy { it.tag } + } + + setVisibleRecipes(recipes) + } + + fun setVisibleRecipes(recipes: List) { _recipes.update { recipes.sortedBy { it.recipe.title } } this.reloadTagFilterState() diff --git a/app/src/main/java/xyz/pixelatedw/recipe/ui/components/MainScreen.kt b/app/src/main/java/xyz/pixelatedw/recipe/ui/components/MainScreen.kt index 6b6a580..ce80e21 100644 --- a/app/src/main/java/xyz/pixelatedw/recipe/ui/components/MainScreen.kt +++ b/app/src/main/java/xyz/pixelatedw/recipe/ui/components/MainScreen.kt @@ -44,6 +44,7 @@ import java.io.File @Composable fun MainScreen(ctx: MainActivity, padding: PaddingValues, view: RecipesView) { + val allRecipes by view.allRecipes.collectAsState() val recipes by view.recipes.collectAsState() val active by view.activeRecipe.collectAsState() val search by view.search.collectAsState() @@ -80,8 +81,8 @@ fun MainScreen(ctx: MainActivity, padding: PaddingValues, view: RecipesView) { onValueChange = { search -> view.setSearch(search) val newRecipes = - recipes.filter { filterRecipe(it, search, filters) } - view.setRecipes(newRecipes) + allRecipes.filter { filterRecipe(it, search, filters) } + view.setVisibleRecipes(newRecipes) }, ) // Tags / Delete @@ -207,14 +208,14 @@ fun MainScreen(ctx: MainActivity, padding: PaddingValues, view: RecipesView) { openTagFilterDialog = false view.reloadTagFilterState() activeTags = filters.count { f -> f.checked } - val newRecipes = recipes.filter { + val newRecipes = allRecipes.filter { filterRecipe( it, search, filters ) } - ctx.recipeView.setRecipes(newRecipes) + ctx.recipeView.setVisibleRecipes(newRecipes) }, view, ) diff --git a/app/src/main/java/xyz/pixelatedw/recipe/utils/ImportRecipes.kt b/app/src/main/java/xyz/pixelatedw/recipe/utils/ImportRecipes.kt index 3acfcff..3fb1fae 100644 --- a/app/src/main/java/xyz/pixelatedw/recipe/utils/ImportRecipes.kt +++ b/app/src/main/java/xyz/pixelatedw/recipe/utils/ImportRecipes.kt @@ -31,7 +31,7 @@ fun import(ctx: MainActivity, nav: NavHostController, setLoading: (Boolean) -> U handler.post { if (ctx.importError.isEmpty()) { val recipes = ctx.db.recipeWithTagsDao().getAll() - ctx.recipeView.setRecipes(recipes) + ctx.recipeView.setAllRecipes(recipes) nav.navigate("list") } diff --git a/app/src/main/java/xyz/pixelatedw/recipe/utils/SyncRecipes.kt b/app/src/main/java/xyz/pixelatedw/recipe/utils/SyncRecipes.kt index 4d58edc..ad111d1 100644 --- a/app/src/main/java/xyz/pixelatedw/recipe/utils/SyncRecipes.kt +++ b/app/src/main/java/xyz/pixelatedw/recipe/utils/SyncRecipes.kt @@ -112,7 +112,7 @@ fun sync(ctx: MainActivity, nav: NavHostController, setLoading: (Boolean) -> Uni handler.post { if (ctx.importError.isEmpty()) { val recipes = ctx.db.recipeWithTagsDao().getAll() - ctx.recipeView.setRecipes(recipes) + ctx.recipeView.setAllRecipes(recipes) nav.navigate("list") }