diff --git a/src/main/kotlin/ca/gosyer/data/catalog/CatalogPreferences.kt b/src/main/kotlin/ca/gosyer/data/catalog/CatalogPreferences.kt index 2f14bf21..75be640d 100644 --- a/src/main/kotlin/ca/gosyer/data/catalog/CatalogPreferences.kt +++ b/src/main/kotlin/ca/gosyer/data/catalog/CatalogPreferences.kt @@ -8,9 +8,10 @@ package ca.gosyer.data.catalog import ca.gosyer.common.prefs.Preference import ca.gosyer.common.prefs.PreferenceStore +import java.util.Locale class CatalogPreferences(private val preferenceStore: PreferenceStore) { fun languages(): Preference> { - return preferenceStore.getStringSet("enabled_langs", setOf("en")) + return preferenceStore.getStringSet("enabled_langs", setOf("en", Locale.getDefault().language)) } } diff --git a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenu.kt b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenu.kt index bbd8e9eb..9b150a48 100644 --- a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenu.kt +++ b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenu.kt @@ -21,6 +21,7 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Translate import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState @@ -30,11 +31,13 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.unit.dp import ca.gosyer.BuildConfig import ca.gosyer.data.models.Source +import ca.gosyer.ui.base.components.ActionIcon import ca.gosyer.ui.base.components.KtorImage import ca.gosyer.ui.base.components.Toolbar import ca.gosyer.ui.base.components.combinedMouseClickable import ca.gosyer.ui.base.resources.stringResource import ca.gosyer.ui.base.vm.viewModel +import ca.gosyer.ui.extensions.LanguageDialog import ca.gosyer.ui.manga.openMangaMenu import ca.gosyer.ui.sources.components.SourceHomeScreen import ca.gosyer.ui.sources.components.SourceScreen @@ -42,6 +45,7 @@ import ca.gosyer.util.compose.ThemedWindow import com.github.zsoltk.compose.savedinstancestate.Bundle import com.github.zsoltk.compose.savedinstancestate.BundleScope import com.github.zsoltk.compose.savedinstancestate.LocalSavedInstanceState +import kotlinx.coroutines.flow.MutableStateFlow fun openSourcesMenu() { ThemedWindow(BuildConfig.NAME) { @@ -85,7 +89,21 @@ fun SourcesMenu(bundle: Bundle, onMangaClick: (Long) -> Unit) { sourceSearchQuery } else null, search = if (sourceSearchEnabled) vm::search else null, - searchSubmit = vm::submitSearch + searchSubmit = vm::submitSearch, + actions = { + if (selectedSourceTab == null) { + ActionIcon( + { + val enabledLangs = MutableStateFlow(vm.languages.value) + LanguageDialog(enabledLangs, vm.getSourceLanguages().toList()) { + vm.setEnabledLanguages(enabledLangs.value) + } + }, + stringResource("enabled_languages"), + Icons.Default.Translate + ) + } + } ) Row { Surface(elevation = 1.dp) { diff --git a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt index 445fbd9c..843580d1 100644 --- a/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt +++ b/src/main/kotlin/ca/gosyer/ui/sources/SourcesMenuViewModel.kt @@ -30,11 +30,14 @@ class SourcesMenuViewModel @Inject constructor( ) : ViewModel() { val serverUrl = serverPreferences.serverUrl().stateIn(scope) - private val languages = catalogPreferences.languages().stateIn(scope) + private val _languages = catalogPreferences.languages().asStateFlow() + val languages = _languages.asStateFlow() private val _isLoading = MutableStateFlow(true) val isLoading = _isLoading.asStateFlow() + private var installedSources = emptyList() + private val _sources = MutableStateFlow(emptyList()) val sources = _sources.asStateFlow() @@ -72,12 +75,15 @@ class SourcesMenuViewModel @Inject constructor( getSources() } + private fun setSources(langs: Set) { + _sources.value = installedSources.filter { it.lang in langs } + } + private fun getSources() { scope.launch { try { - val sources = sourceHandler.getSourceList() - info { sources } - _sources.value = sources.filter { it.lang in languages.value } + installedSources = sourceHandler.getSourceList() + setSources(_languages.value) info { _sources.value } } catch (e: Exception) { e.throwIfCancellation() @@ -134,6 +140,16 @@ class SourcesMenuViewModel @Inject constructor( searchSource?.invoke(sourceSearchQuery.value) } + fun getSourceLanguages(): Set { + return installedSources.map { it.lang }.toSet() + } + + fun setEnabledLanguages(langs: Set) { + info { langs } + _languages.value = langs + setSources(langs) + } + private companion object : CKLogger({}) { const val SOURCE_TABS_KEY = "source_tabs" const val SELECTED_SOURCE_TAB = "selected_tab"