mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-20 11:32:31 +01:00
Categorize extensions menu
This commit is contained in:
@@ -103,7 +103,15 @@ fun ExtensionsMenu() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
items(extensions) { extension ->
|
extensions.forEach { (header, items) ->
|
||||||
|
item {
|
||||||
|
Text(
|
||||||
|
header,
|
||||||
|
style = MaterialTheme.typography.h6,
|
||||||
|
modifier = Modifier.padding(16.dp, 16.dp, 16.dp, 4.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
items(items) { extension ->
|
||||||
ExtensionItem(
|
ExtensionItem(
|
||||||
extension,
|
extension,
|
||||||
serverUrl,
|
serverUrl,
|
||||||
@@ -114,6 +122,7 @@ fun ExtensionsMenu() {
|
|||||||
Spacer(Modifier.height(8.dp))
|
Spacer(Modifier.height(8.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
VerticalScrollbar(
|
VerticalScrollbar(
|
||||||
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
|
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
|
||||||
adapter = rememberScrollbarAdapter(state)
|
adapter = rememberScrollbarAdapter(state)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import ca.gosyer.data.extension.ExtensionPreferences
|
|||||||
import ca.gosyer.data.models.Extension
|
import ca.gosyer.data.models.Extension
|
||||||
import ca.gosyer.data.server.ServerPreferences
|
import ca.gosyer.data.server.ServerPreferences
|
||||||
import ca.gosyer.data.server.interactions.ExtensionInteractionHandler
|
import ca.gosyer.data.server.interactions.ExtensionInteractionHandler
|
||||||
|
import ca.gosyer.data.translation.XmlResourceBundle
|
||||||
import ca.gosyer.ui.base.vm.ViewModel
|
import ca.gosyer.ui.base.vm.ViewModel
|
||||||
import ca.gosyer.util.lang.throwIfCancellation
|
import ca.gosyer.util.lang.throwIfCancellation
|
||||||
import ca.gosyer.util.system.CKLogger
|
import ca.gosyer.util.system.CKLogger
|
||||||
@@ -19,12 +20,14 @@ import kotlinx.coroutines.flow.drop
|
|||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ExtensionsMenuViewModel @Inject constructor(
|
class ExtensionsMenuViewModel @Inject constructor(
|
||||||
private val extensionHandler: ExtensionInteractionHandler,
|
private val extensionHandler: ExtensionInteractionHandler,
|
||||||
|
private val resources: XmlResourceBundle,
|
||||||
serverPreferences: ServerPreferences,
|
serverPreferences: ServerPreferences,
|
||||||
private val extensionPreferences: ExtensionPreferences
|
extensionPreferences: ExtensionPreferences
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
val serverUrl = serverPreferences.serverUrl().stateIn(scope)
|
val serverUrl = serverPreferences.serverUrl().stateIn(scope)
|
||||||
private val _enabledLangs = extensionPreferences.languages().asStateFlow()
|
private val _enabledLangs = extensionPreferences.languages().asStateFlow()
|
||||||
@@ -32,7 +35,7 @@ class ExtensionsMenuViewModel @Inject constructor(
|
|||||||
|
|
||||||
private lateinit var extensionList: List<Extension>
|
private lateinit var extensionList: List<Extension>
|
||||||
|
|
||||||
private val _extensions = MutableStateFlow(emptyList<Extension>())
|
private val _extensions = MutableStateFlow(emptyMap<String, List<Extension>>())
|
||||||
val extensions = _extensions.asStateFlow()
|
val extensions = _extensions.asStateFlow()
|
||||||
|
|
||||||
private val _isLoading = MutableStateFlow(true)
|
private val _isLoading = MutableStateFlow(true)
|
||||||
@@ -121,13 +124,22 @@ class ExtensionsMenuViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<Extension>.splitSort(): List<Extension> {
|
private fun List<Extension>.splitSort(): Map<String, List<Extension>> {
|
||||||
val comparator = compareBy<Extension>({ it.lang }, { it.pkgName })
|
val comparator = compareBy<Extension>({ it.lang }, { it.pkgName })
|
||||||
val obsolete = filter { it.obsolete }.sortedWith(comparator)
|
val obsolete = filter { it.obsolete }.sortedWith(comparator)
|
||||||
val updates = filter { it.hasUpdate }.sortedWith(comparator)
|
val updates = filter { it.hasUpdate }.sortedWith(comparator)
|
||||||
val installed = filter { it.installed && !it.hasUpdate && !it.obsolete }.sortedWith(comparator)
|
val installed = filter { it.installed && !it.hasUpdate && !it.obsolete }.sortedWith(comparator)
|
||||||
val available = filter { !it.installed }.sortedWith(comparator)
|
val available = filter { !it.installed }.sortedWith(comparator)
|
||||||
return obsolete + updates + installed + available
|
|
||||||
|
return mapOf(
|
||||||
|
resources.getStringA("installed") to (obsolete + updates + installed),
|
||||||
|
) + available.groupBy { it.lang }.mapKeys {
|
||||||
|
if (it.key == "all") {
|
||||||
|
resources.getStringA("all")
|
||||||
|
} else {
|
||||||
|
Locale.forLanguageTag(it.key).displayName
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private companion object : CKLogger({})
|
private companion object : CKLogger({})
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
|
|
||||||
<!-- Extensions Menu -->
|
<!-- Extensions Menu -->
|
||||||
<string name="enabled_languages">Enabled languages</string>
|
<string name="enabled_languages">Enabled languages</string>
|
||||||
|
<string name="installed">Installed</string>
|
||||||
|
<string name="all">All</string>
|
||||||
|
|
||||||
<!-- Library Menu -->
|
<!-- Library Menu -->
|
||||||
<string name="default_category">Default</string>
|
<string name="default_category">Default</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user