diff --git a/app/src/main/java/eu/kanade/domain/library/service/LibraryPreferences.kt b/app/src/main/java/eu/kanade/domain/library/service/LibraryPreferences.kt index 2f3b126fe..a29893dd6 100644 --- a/app/src/main/java/eu/kanade/domain/library/service/LibraryPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/library/service/LibraryPreferences.kt @@ -36,17 +36,17 @@ class LibraryPreferences( // region Filter - fun filterDownloaded() = preferenceStore.getInt("pref_filter_library_downloaded", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterDownloaded() = preferenceStore.getInt("pref_filter_library_downloaded", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) - fun filterUnread() = preferenceStore.getInt("pref_filter_library_unread", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterUnread() = preferenceStore.getInt("pref_filter_library_unread", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) - fun filterStarted() = preferenceStore.getInt("pref_filter_library_started", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterStarted() = preferenceStore.getInt("pref_filter_library_started", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) - fun filterBookmarked() = preferenceStore.getInt("pref_filter_library_bookmarked", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterBookmarked() = preferenceStore.getInt("pref_filter_library_bookmarked", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) - fun filterCompleted() = preferenceStore.getInt("pref_filter_library_completed", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterCompleted() = preferenceStore.getInt("pref_filter_library_completed", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) - fun filterTracking(name: Int) = preferenceStore.getInt("pref_filter_library_tracked_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterTracking(name: Int) = preferenceStore.getInt("pref_filter_library_tracked_$name", ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value) // endregion diff --git a/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt index 0a81f834b..92ee2ca2e 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt @@ -3,6 +3,7 @@ package eu.kanade.presentation.manga import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -104,6 +105,68 @@ fun ChapterSettingsDialog( } } +@Composable +private fun ColumnScope.FilterPage( + downloadFilter: TriStateFilter, + onDownloadFilterChanged: ((TriStateFilter) -> Unit)?, + unreadFilter: TriStateFilter, + onUnreadFilterChanged: (TriStateFilter) -> Unit, + bookmarkedFilter: TriStateFilter, + onBookmarkedFilterChanged: (TriStateFilter) -> Unit, +) { + TriStateItem( + label = stringResource(R.string.label_downloaded), + state = downloadFilter, + onClick = onDownloadFilterChanged, + ) + TriStateItem( + label = stringResource(R.string.action_filter_unread), + state = unreadFilter, + onClick = onUnreadFilterChanged, + ) + TriStateItem( + label = stringResource(R.string.action_filter_bookmarked), + state = bookmarkedFilter, + onClick = onBookmarkedFilterChanged, + ) +} + +@Composable +private fun ColumnScope.SortPage( + sortingMode: Long, + sortDescending: Boolean, + onItemSelected: (Long) -> Unit, +) { + listOf( + R.string.sort_by_source to Manga.CHAPTER_SORTING_SOURCE, + R.string.sort_by_number to Manga.CHAPTER_SORTING_NUMBER, + R.string.sort_by_upload_date to Manga.CHAPTER_SORTING_UPLOAD_DATE, + ).map { (titleRes, mode) -> + SortItem( + label = stringResource(titleRes), + sortDescending = sortDescending.takeIf { sortingMode == mode }, + onClick = { onItemSelected(mode) }, + ) + } +} + +@Composable +private fun ColumnScope.DisplayPage( + displayMode: Long, + onItemSelected: (Long) -> Unit, +) { + listOf( + R.string.show_title to Manga.CHAPTER_DISPLAY_NAME, + R.string.show_chapter_number to Manga.CHAPTER_DISPLAY_NUMBER, + ).map { (titleRes, mode) -> + RadioItem( + label = stringResource(titleRes), + selected = displayMode == mode, + onClick = { onItemSelected(mode) }, + ) + } +} + @Composable private fun SetAsDefaultDialog( onDismissRequest: () -> Unit, @@ -152,69 +215,3 @@ private fun SetAsDefaultDialog( }, ) } - -@Composable -private fun FilterPage( - downloadFilter: TriStateFilter, - onDownloadFilterChanged: ((TriStateFilter) -> Unit)?, - unreadFilter: TriStateFilter, - onUnreadFilterChanged: (TriStateFilter) -> Unit, - bookmarkedFilter: TriStateFilter, - onBookmarkedFilterChanged: (TriStateFilter) -> Unit, -) { - TriStateItem( - label = stringResource(R.string.label_downloaded), - state = downloadFilter, - onClick = onDownloadFilterChanged, - ) - TriStateItem( - label = stringResource(R.string.action_filter_unread), - state = unreadFilter, - onClick = onUnreadFilterChanged, - ) - TriStateItem( - label = stringResource(R.string.action_filter_bookmarked), - state = bookmarkedFilter, - onClick = onBookmarkedFilterChanged, - ) -} - -@Composable -private fun SortPage( - sortingMode: Long, - sortDescending: Boolean, - onItemSelected: (Long) -> Unit, -) { - SortItem( - label = stringResource(R.string.sort_by_source), - sortDescending = sortDescending.takeIf { sortingMode == Manga.CHAPTER_SORTING_SOURCE }, - onClick = { onItemSelected(Manga.CHAPTER_SORTING_SOURCE) }, - ) - SortItem( - label = stringResource(R.string.sort_by_number), - sortDescending = sortDescending.takeIf { sortingMode == Manga.CHAPTER_SORTING_NUMBER }, - onClick = { onItemSelected(Manga.CHAPTER_SORTING_NUMBER) }, - ) - SortItem( - label = stringResource(R.string.sort_by_upload_date), - sortDescending = sortDescending.takeIf { sortingMode == Manga.CHAPTER_SORTING_UPLOAD_DATE }, - onClick = { onItemSelected(Manga.CHAPTER_SORTING_UPLOAD_DATE) }, - ) -} - -@Composable -private fun DisplayPage( - displayMode: Long, - onItemSelected: (Long) -> Unit, -) { - RadioItem( - label = stringResource(R.string.show_title), - selected = displayMode == Manga.CHAPTER_DISPLAY_NAME, - onClick = { onItemSelected(Manga.CHAPTER_DISPLAY_NAME) }, - ) - RadioItem( - label = stringResource(R.string.show_chapter_number), - selected = displayMode == Manga.CHAPTER_DISPLAY_NUMBER, - onClick = { onItemSelected(Manga.CHAPTER_DISPLAY_NUMBER) }, - ) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index 2f3e3d502..821a46c29 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -114,9 +114,9 @@ object Migrations { fun convertBooleanPrefToTriState(key: String): Int { val oldPrefValue = prefs.getBoolean(key, false) return if (oldPrefValue) { - ExtendedNavigationView.Item.TriStateGroup.State.INCLUDE.value + ExtendedNavigationView.Item.TriStateGroup.State.ENABLED_IS.value } else { - ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value + ExtendedNavigationView.Item.TriStateGroup.State.DISABLED.value } } prefs.edit { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 279be90f6..8c13b4a85 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -149,8 +149,8 @@ class LibraryScreenModel( prefs.filterStarted or prefs.filterBookmarked or prefs.filterCompleted - ) != TriStateGroup.State.IGNORE.value - val b = trackFilter.values.any { it != TriStateGroup.State.IGNORE.value } + ) != TriStateGroup.State.DISABLED.value + val b = trackFilter.values.any { it != TriStateGroup.State.DISABLED.value } a || b } .distinctUntilChanged() @@ -179,17 +179,17 @@ class LibraryScreenModel( val isNotLoggedInAnyTrack = loggedInTrackServices.isEmpty() - val excludedTracks = loggedInTrackServices.mapNotNull { if (it.value == TriStateGroup.State.EXCLUDE.value) it.key else null } - val includedTracks = loggedInTrackServices.mapNotNull { if (it.value == TriStateGroup.State.INCLUDE.value) it.key else null } + val excludedTracks = loggedInTrackServices.mapNotNull { if (it.value == TriStateGroup.State.ENABLED_NOT.value) it.key else null } + val includedTracks = loggedInTrackServices.mapNotNull { if (it.value == TriStateGroup.State.ENABLED_IS.value) it.key else null } val trackFiltersIsIgnored = includedTracks.isEmpty() && excludedTracks.isEmpty() val filterFnDownloaded: (LibraryItem) -> Boolean = downloaded@{ - if (!downloadedOnly && filterDownloaded == TriStateGroup.State.IGNORE.value) return@downloaded true + if (!downloadedOnly && filterDownloaded == TriStateGroup.State.DISABLED.value) return@downloaded true val isDownloaded = it.libraryManga.manga.isLocal() || it.downloadCount > 0 || downloadManager.getDownloadCount(it.libraryManga.manga) > 0 - return@downloaded if (downloadedOnly || filterDownloaded == TriStateGroup.State.INCLUDE.value) { + return@downloaded if (downloadedOnly || filterDownloaded == TriStateGroup.State.ENABLED_IS.value) { isDownloaded } else { !isDownloaded @@ -197,10 +197,10 @@ class LibraryScreenModel( } val filterFnUnread: (LibraryItem) -> Boolean = unread@{ - if (filterUnread == TriStateGroup.State.IGNORE.value) return@unread true + if (filterUnread == TriStateGroup.State.DISABLED.value) return@unread true val isUnread = it.libraryManga.unreadCount > 0 - return@unread if (filterUnread == TriStateGroup.State.INCLUDE.value) { + return@unread if (filterUnread == TriStateGroup.State.ENABLED_IS.value) { isUnread } else { !isUnread @@ -208,10 +208,10 @@ class LibraryScreenModel( } val filterFnStarted: (LibraryItem) -> Boolean = started@{ - if (filterStarted == TriStateGroup.State.IGNORE.value) return@started true + if (filterStarted == TriStateGroup.State.DISABLED.value) return@started true val hasStarted = it.libraryManga.hasStarted - return@started if (filterStarted == TriStateGroup.State.INCLUDE.value) { + return@started if (filterStarted == TriStateGroup.State.ENABLED_IS.value) { hasStarted } else { !hasStarted @@ -219,10 +219,10 @@ class LibraryScreenModel( } val filterFnBookmarked: (LibraryItem) -> Boolean = bookmarked@{ - if (filterBookmarked == TriStateGroup.State.IGNORE.value) return@bookmarked true + if (filterBookmarked == TriStateGroup.State.DISABLED.value) return@bookmarked true val hasBookmarks = it.libraryManga.hasBookmarks - return@bookmarked if (filterBookmarked == TriStateGroup.State.INCLUDE.value) { + return@bookmarked if (filterBookmarked == TriStateGroup.State.ENABLED_IS.value) { hasBookmarks } else { !hasBookmarks @@ -230,10 +230,10 @@ class LibraryScreenModel( } val filterFnCompleted: (LibraryItem) -> Boolean = completed@{ - if (filterCompleted == TriStateGroup.State.IGNORE.value) return@completed true + if (filterCompleted == TriStateGroup.State.DISABLED.value) return@completed true val isCompleted = it.libraryManga.manga.status.toInt() == SManga.COMPLETED - return@completed if (filterCompleted == TriStateGroup.State.INCLUDE.value) { + return@completed if (filterCompleted == TriStateGroup.State.ENABLED_IS.value) { isCompleted } else { !isCompleted diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt index b642ce902..8db1fc347 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt @@ -96,7 +96,7 @@ class LibrarySettingsSheet( * Returns true if there's at least one filter from [FilterGroup] active. */ fun hasActiveFilters(): Boolean { - return filterGroup.items.filterIsInstance().any { it.state != State.IGNORE.value } + return filterGroup.items.filterIsInstance().any { it.state != State.DISABLED.value } } inner class FilterGroup : Group { @@ -132,7 +132,7 @@ class LibrarySettingsSheet( override fun initModels() { if (preferences.downloadedOnly().get()) { - downloaded.state = State.INCLUDE.value + downloaded.state = State.ENABLED_IS.value downloaded.enabled = false } else { downloaded.state = libraryPreferences.filterDownloaded().get() @@ -151,9 +151,9 @@ class LibrarySettingsSheet( override fun onItemClicked(item: Item) { item as Item.TriStateGroup val newState = when (item.state) { - State.IGNORE.value -> State.INCLUDE.value - State.INCLUDE.value -> State.EXCLUDE.value - State.EXCLUDE.value -> State.IGNORE.value + State.DISABLED.value -> State.ENABLED_IS.value + State.ENABLED_IS.value -> State.ENABLED_NOT.value + State.ENABLED_NOT.value -> State.DISABLED.value else -> throw Exception("Unknown State") } item.state = newState @@ -212,7 +212,7 @@ class LibrarySettingsSheet( override val footer = null override fun initModels() { - val sort = currentCategory?.sort ?: LibrarySort.default + val sort = currentCategory.sort val order = if (sort.isAscending) Item.MultiSort.SORT_ASC else Item.MultiSort.SORT_DESC alphabetically.state = @@ -306,7 +306,7 @@ class LibrarySettingsSheet( // Gets user preference of currently selected display mode at current category private fun getDisplayModePreference(): LibraryDisplayMode { - return currentCategory?.display ?: LibraryDisplayMode.default + return currentCategory.display } inner class DisplayGroup : Group { diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt index 294de85e9..d8cb3bf87 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt @@ -115,16 +115,16 @@ open class ExtendedNavigationView @JvmOverloads constructor( class TriStateGroup(resId: Int, group: Group) : MultiStateGroup(resId, group) { enum class State(val value: Int) { - IGNORE(0), - INCLUDE(1), - EXCLUDE(2), + DISABLED(0), + ENABLED_IS(1), + ENABLED_NOT(2), } override fun getStateDrawable(context: Context): Drawable? { return when (state) { - State.IGNORE.value -> tintVector(context, R.drawable.ic_check_box_outline_blank_24dp, R.attr.colorControlNormal) - State.INCLUDE.value -> tintVector(context, R.drawable.ic_check_box_24dp) - State.EXCLUDE.value -> tintVector(context, R.drawable.ic_check_box_x_24dp) + State.DISABLED.value -> tintVector(context, R.drawable.ic_check_box_outline_blank_24dp, R.attr.colorControlNormal) + State.ENABLED_IS.value -> tintVector(context, R.drawable.ic_check_box_24dp) + State.ENABLED_NOT.value -> tintVector(context, R.drawable.ic_check_box_x_24dp) else -> throw Exception("Unknown state") } } diff --git a/domain/src/main/java/tachiyomi/domain/library/model/LibraryDisplayMode.kt b/domain/src/main/java/tachiyomi/domain/library/model/LibraryDisplayMode.kt index 236d00235..9cefa81c9 100644 --- a/domain/src/main/java/tachiyomi/domain/library/model/LibraryDisplayMode.kt +++ b/domain/src/main/java/tachiyomi/domain/library/model/LibraryDisplayMode.kt @@ -55,5 +55,5 @@ sealed class LibraryDisplayMode( } } -val Category.display: LibraryDisplayMode - get() = LibraryDisplayMode.valueOf(flags) +val Category?.display: LibraryDisplayMode + get() = LibraryDisplayMode.valueOf(this?.flags) diff --git a/domain/src/main/java/tachiyomi/domain/library/model/LibrarySort.kt b/domain/src/main/java/tachiyomi/domain/library/model/LibrarySort.kt index 1d133724c..db95259e0 100644 --- a/domain/src/main/java/tachiyomi/domain/library/model/LibrarySort.kt +++ b/domain/src/main/java/tachiyomi/domain/library/model/LibrarySort.kt @@ -69,7 +69,8 @@ data class LibrarySort( val directions = setOf(Direction.Ascending, Direction.Descending) val default = LibrarySort(Type.Alphabetical, Direction.Ascending) - fun valueOf(flag: Long): LibrarySort { + fun valueOf(flag: Long?): LibrarySort { + if (flag == null) return default return LibrarySort( Type.valueOf(flag), Direction.valueOf(flag), @@ -115,5 +116,5 @@ data class LibrarySort( } } -val Category.sort: LibrarySort - get() = LibrarySort.valueOf(flags) +val Category?.sort: LibrarySort + get() = LibrarySort.valueOf(this?.flags)