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 @Composable
fun HeadingItem( fun HeadingItem(
@StringRes labelRes: Int, @StringRes labelRes: Int,
) {
HeadingItem(stringResource(labelRes))
}
@Composable
fun HeadingItem(
text: String,
) { ) {
Text( Text(
text = stringResource(labelRes), text = text,
style = MaterialTheme.typography.header, style = MaterialTheme.typography.header,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()

View File

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

View File

@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.library
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.runtime.getValue 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 cafe.adriel.voyager.core.model.coroutineScope
import eu.kanade.core.prefs.asState import eu.kanade.core.prefs.asState
import eu.kanade.domain.base.BasePreferences 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.data.track.TrackManager
import eu.kanade.tachiyomi.util.preference.toggle import eu.kanade.tachiyomi.util.preference.toggle
import eu.kanade.tachiyomi.widget.TriState 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.Preference
import tachiyomi.core.preference.getAndSet import tachiyomi.core.preference.getAndSet
import tachiyomi.core.util.lang.launchIO import tachiyomi.core.util.lang.launchIO
import tachiyomi.domain.category.interactor.GetCategories
import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.Category
import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibraryDisplayMode
import tachiyomi.domain.library.model.LibrarySort import tachiyomi.domain.library.model.LibrarySort
@ -27,11 +24,10 @@ import uy.kohesive.injekt.api.get
class LibrarySettingsScreenModel( class LibrarySettingsScreenModel(
val preferences: BasePreferences = Injekt.get(), val preferences: BasePreferences = Injekt.get(),
val libraryPreferences: LibraryPreferences = Injekt.get(), val libraryPreferences: LibraryPreferences = Injekt.get(),
private val getCategories: GetCategories = Injekt.get(),
private val setDisplayModeForCategory: SetDisplayModeForCategory = Injekt.get(), private val setDisplayModeForCategory: SetDisplayModeForCategory = Injekt.get(),
private val setSortModeForCategory: SetSortModeForCategory = Injekt.get(), private val setSortModeForCategory: SetSortModeForCategory = Injekt.get(),
trackManager: TrackManager = Injekt.get(), trackManager: TrackManager = Injekt.get(),
) : StateScreenModel<LibrarySettingsScreenModel.State>(State()) { ) : ScreenModel {
val trackServices = trackManager.services.filter { service -> service.isLogged } val trackServices = trackManager.services.filter { service -> service.isLogged }
@ -39,31 +35,13 @@ class LibrarySettingsScreenModel(
val grouping by libraryPreferences.groupLibraryBy().asState(coroutineScope) val grouping by libraryPreferences.groupLibraryBy().asState(coroutineScope)
// SY <-- // SY <--
init {
coroutineScope.launchIO {
getCategories.subscribe()
.collectLatest {
mutableState.update { state ->
state.copy(
categories = it,
)
}
}
}
}
fun togglePreference(preference: (LibraryPreferences) -> Preference<Boolean>) { fun togglePreference(preference: (LibraryPreferences) -> Preference<Boolean>) {
preference(libraryPreferences).toggle() preference(libraryPreferences).toggle()
} }
fun toggleFilter(preference: (LibraryPreferences) -> Preference<Int>) { fun toggleFilter(preference: (LibraryPreferences) -> Preference<Int>) {
preference(libraryPreferences).getAndSet { preference(libraryPreferences).getAndSet {
when (it) { TriState.valueOf(it).next().value
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")
}
} }
} }
@ -89,10 +67,5 @@ class LibrarySettingsScreenModel(
libraryPreferences.groupLibraryBy().set(grouping) libraryPreferences.groupLibraryBy().set(grouping)
} }
} }
// SY <-- // 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.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAll
import androidx.compose.ui.util.fastAny
import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.Navigator
@ -248,7 +249,10 @@ object LibraryTab : Tab {
is LibraryScreenModel.Dialog.SettingsSheet -> LibrarySettingsDialog( is LibraryScreenModel.Dialog.SettingsSheet -> LibrarySettingsDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
screenModel = settingsScreenModel, screenModel = settingsScreenModel,
activeCategoryIndex = screenModel.activeCategoryIndex, category = state.categories[screenModel.activeCategoryIndex],
// SY -->
hasCategories = state.categories.fastAny { !it.isSystemCategory },
// SY <--
) )
is LibraryScreenModel.Dialog.ChangeCategory -> { is LibraryScreenModel.Dialog.ChangeCategory -> {
ChangeCategoryDialog( ChangeCategoryDialog(

View File

@ -7,6 +7,21 @@ enum class TriState(val value: Int) {
DISABLED(0), DISABLED(0),
ENABLED_IS(1), ENABLED_IS(1),
ENABLED_NOT(2), 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 { fun Int.toTriStateFilter(): TriStateFilter {

View File

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