Fix per-category sort/display affecting the wrong category

(cherry picked from commit bd47eafeecc837f833a0c370372dd6d5edb62130)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel.kt
This commit is contained in:
arkon 2023-02-23 13:54:08 -05:00 committed by Jobobby04
parent 654e894aee
commit 563063a6fd
6 changed files with 49 additions and 45 deletions

View File

@ -32,9 +32,16 @@ import tachiyomi.presentation.core.theme.header
@Composable
fun HeadingItem(
@StringRes labelRes: Int,
) {
HeadingItem(stringResource(labelRes))
}
@Composable
fun HeadingItem(
text: String,
) {
Text(
text = stringResource(labelRes),
text = text,
style = MaterialTheme.typography.header,
modifier = Modifier
.fillMaxWidth()

View File

@ -7,7 +7,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@ -40,13 +39,11 @@ import tachiyomi.domain.manga.model.TriStateFilter
fun LibrarySettingsDialog(
onDismissRequest: () -> Unit,
screenModel: LibrarySettingsScreenModel,
activeCategoryIndex: Int,
category: Category,
// SY -->
hasCategories: Boolean,
// SY <--
) {
val state by screenModel.state.collectAsState()
val category by remember(activeCategoryIndex) {
derivedStateOf { state.categories[activeCategoryIndex] }
}
TabbedDialog(
onDismissRequest = onDismissRequest,
tabTitles = listOf(
@ -79,7 +76,7 @@ fun LibrarySettingsDialog(
// SY -->
3 -> GroupPage(
screenModel = screenModel,
categories = state.categories,
hasCategories = hasCategories,
)
// SY <--
}
@ -308,10 +305,9 @@ data class GroupMode(
@Composable
private fun ColumnScope.GroupPage(
screenModel: LibrarySettingsScreenModel,
categories: List<Category>,
hasCategories: Boolean,
) {
val realCategories = categories.filterNot { it.isSystemCategory }
val groups = remember(realCategories.isNotEmpty(), screenModel.trackServices) {
val groups = remember(hasCategories, screenModel.trackServices) {
buildList {
add(LibraryGroup.BY_DEFAULT)
add(LibraryGroup.BY_SOURCE)
@ -319,13 +315,13 @@ private fun ColumnScope.GroupPage(
if (screenModel.trackServices.isNotEmpty()) {
add(LibraryGroup.BY_TRACK_STATUS)
}
if (realCategories.isNotEmpty()) {
if (hasCategories) {
add(LibraryGroup.UNGROUPED)
}
}.map {
GroupMode(
it,
LibraryGroup.groupTypeStringRes(it, realCategories.isNotEmpty()),
LibraryGroup.groupTypeStringRes(it, hasCategories),
LibraryGroup.groupTypeDrawableRes(it),
)
}

View File

@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.library
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.getValue
import cafe.adriel.voyager.core.model.StateScreenModel
import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.coroutineScope
import eu.kanade.core.prefs.asState
import eu.kanade.domain.base.BasePreferences
@ -12,12 +12,9 @@ import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.util.preference.toggle
import eu.kanade.tachiyomi.widget.TriState
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.update
import tachiyomi.core.preference.Preference
import tachiyomi.core.preference.getAndSet
import tachiyomi.core.util.lang.launchIO
import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.model.Category
import tachiyomi.domain.library.model.LibraryDisplayMode
import tachiyomi.domain.library.model.LibrarySort
@ -27,11 +24,10 @@ import uy.kohesive.injekt.api.get
class LibrarySettingsScreenModel(
val preferences: BasePreferences = Injekt.get(),
val libraryPreferences: LibraryPreferences = Injekt.get(),
private val getCategories: GetCategories = Injekt.get(),
private val setDisplayModeForCategory: SetDisplayModeForCategory = Injekt.get(),
private val setSortModeForCategory: SetSortModeForCategory = Injekt.get(),
trackManager: TrackManager = Injekt.get(),
) : StateScreenModel<LibrarySettingsScreenModel.State>(State()) {
) : ScreenModel {
val trackServices = trackManager.services.filter { service -> service.isLogged }
@ -39,31 +35,13 @@ class LibrarySettingsScreenModel(
val grouping by libraryPreferences.groupLibraryBy().asState(coroutineScope)
// SY <--
init {
coroutineScope.launchIO {
getCategories.subscribe()
.collectLatest {
mutableState.update { state ->
state.copy(
categories = it,
)
}
}
}
}
fun togglePreference(preference: (LibraryPreferences) -> Preference<Boolean>) {
preference(libraryPreferences).toggle()
}
fun toggleFilter(preference: (LibraryPreferences) -> Preference<Int>) {
preference(libraryPreferences).getAndSet {
when (it) {
TriState.DISABLED.value -> TriState.ENABLED_IS.value
TriState.ENABLED_IS.value -> TriState.ENABLED_NOT.value
TriState.ENABLED_NOT.value -> TriState.DISABLED.value
else -> throw IllegalStateException("Unknown TriStateGroup state: $this")
}
TriState.valueOf(it).next().value
}
}
@ -89,10 +67,5 @@ class LibrarySettingsScreenModel(
libraryPreferences.groupLibraryBy().set(grouping)
}
}
// SY <--
@Immutable
data class State(
val categories: List<Category> = emptyList(),
)
}

View File

@ -22,6 +22,7 @@ import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.util.fastAll
import androidx.compose.ui.util.fastAny
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator
@ -248,7 +249,10 @@ object LibraryTab : Tab {
is LibraryScreenModel.Dialog.SettingsSheet -> LibrarySettingsDialog(
onDismissRequest = onDismissRequest,
screenModel = settingsScreenModel,
activeCategoryIndex = screenModel.activeCategoryIndex,
category = state.categories[screenModel.activeCategoryIndex],
// SY -->
hasCategories = state.categories.fastAny { !it.isSystemCategory },
// SY <--
)
is LibraryScreenModel.Dialog.ChangeCategory -> {
ChangeCategoryDialog(

View File

@ -7,6 +7,21 @@ enum class TriState(val value: Int) {
DISABLED(0),
ENABLED_IS(1),
ENABLED_NOT(2),
;
fun next(): TriState {
return when (this) {
DISABLED -> ENABLED_IS
ENABLED_IS -> ENABLED_NOT
ENABLED_NOT -> DISABLED
}
}
companion object {
fun valueOf(value: Int): TriState {
return TriState.values().first { it.value == value }
}
}
}
fun Int.toTriStateFilter(): TriStateFilter {

View File

@ -4,4 +4,13 @@ enum class TriStateFilter {
DISABLED, // Disable filter
ENABLED_IS, // Enabled with "is" filter
ENABLED_NOT, // Enabled with "not" filter
;
fun next(): TriStateFilter {
return when (this) {
DISABLED -> ENABLED_IS
ENABLED_IS -> ENABLED_NOT
ENABLED_NOT -> DISABLED
}
}
}