mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2026-02-01 08:24:11 +01:00
Allow setting languages to show in the sources menu
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user