Allow setting languages to show in the sources menu

This commit is contained in:
Syer10
2021-06-21 16:32:33 -04:00
parent ab29d491ea
commit b9c68cbca5
3 changed files with 41 additions and 6 deletions

View File

@@ -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<Set<String>> {
return preferenceStore.getStringSet("enabled_langs", setOf("en"))
return preferenceStore.getStringSet("enabled_langs", setOf("en", Locale.getDefault().language))
}
}

View File

@@ -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) {

View File

@@ -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<Source>()
private val _sources = MutableStateFlow(emptyList<Source>())
val sources = _sources.asStateFlow()
@@ -72,12 +75,15 @@ class SourcesMenuViewModel @Inject constructor(
getSources()
}
private fun setSources(langs: Set<String>) {
_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<String> {
return installedSources.map { it.lang }.toSet()
}
fun setEnabledLanguages(langs: Set<String>) {
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"