
(cherry picked from commit 87bdee59908c73f340c892e43b522727e07b33d2) # Conflicts: # app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt # app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt # domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt # domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt # presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt
260 lines
8.9 KiB
Kotlin
260 lines
8.9 KiB
Kotlin
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
|
|
import androidx.compose.foundation.rememberScrollState
|
|
import androidx.compose.foundation.verticalScroll
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.outlined.PeopleAlt
|
|
import androidx.compose.material3.AlertDialog
|
|
import androidx.compose.material3.Checkbox
|
|
import androidx.compose.material3.DropdownMenuItem
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.MaterialTheme
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.material3.TextButton
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.saveable.rememberSaveable
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.unit.dp
|
|
import eu.kanade.domain.manga.model.downloadedFilter
|
|
import eu.kanade.domain.manga.model.forceDownloaded
|
|
import eu.kanade.presentation.components.TabbedDialog
|
|
import eu.kanade.presentation.components.TabbedDialogPaddings
|
|
import eu.kanade.tachiyomi.R
|
|
import tachiyomi.core.preference.TriState
|
|
import tachiyomi.domain.manga.model.Manga
|
|
import tachiyomi.presentation.core.components.RadioItem
|
|
import tachiyomi.presentation.core.components.SortItem
|
|
import tachiyomi.presentation.core.components.TriStateItem
|
|
|
|
@Composable
|
|
fun ChapterSettingsDialog(
|
|
onDismissRequest: () -> Unit,
|
|
manga: Manga? = null,
|
|
onDownloadFilterChanged: (TriState) -> Unit,
|
|
onUnreadFilterChanged: (TriState) -> Unit,
|
|
onBookmarkedFilterChanged: (TriState) -> Unit,
|
|
onSortModeChanged: (Long) -> Unit,
|
|
onDisplayModeChanged: (Long) -> Unit,
|
|
onSetAsDefault: (applyToExistingManga: Boolean) -> Unit,
|
|
onClickShowScanlatorSelection: (() -> Unit)?,
|
|
) {
|
|
var showSetAsDefaultDialog by rememberSaveable { mutableStateOf(false) }
|
|
if (showSetAsDefaultDialog) {
|
|
SetAsDefaultDialog(
|
|
onDismissRequest = { showSetAsDefaultDialog = false },
|
|
onConfirmed = onSetAsDefault,
|
|
)
|
|
}
|
|
|
|
TabbedDialog(
|
|
onDismissRequest = onDismissRequest,
|
|
tabTitles = listOf(
|
|
stringResource(R.string.action_filter),
|
|
stringResource(R.string.action_sort),
|
|
stringResource(R.string.action_display),
|
|
),
|
|
tabOverflowMenuContent = { closeMenu ->
|
|
DropdownMenuItem(
|
|
text = { Text(stringResource(R.string.set_chapter_settings_as_default)) },
|
|
onClick = {
|
|
showSetAsDefaultDialog = true
|
|
closeMenu()
|
|
},
|
|
)
|
|
},
|
|
) { page ->
|
|
Column(
|
|
modifier = Modifier
|
|
.padding(vertical = TabbedDialogPaddings.Vertical)
|
|
.verticalScroll(rememberScrollState()),
|
|
) {
|
|
when (page) {
|
|
0 -> {
|
|
FilterPage(
|
|
downloadFilter = manga?.downloadedFilter ?: TriState.DISABLED,
|
|
onDownloadFilterChanged = onDownloadFilterChanged.takeUnless { manga?.forceDownloaded() == true },
|
|
unreadFilter = manga?.unreadFilter ?: TriState.DISABLED,
|
|
onUnreadFilterChanged = onUnreadFilterChanged,
|
|
bookmarkedFilter = manga?.bookmarkedFilter ?: TriState.DISABLED,
|
|
onBookmarkedFilterChanged = onBookmarkedFilterChanged,
|
|
// SY -->
|
|
onClickShowScanlatorSelection = onClickShowScanlatorSelection,
|
|
// SY <--
|
|
)
|
|
}
|
|
1 -> {
|
|
SortPage(
|
|
sortingMode = manga?.sorting ?: 0,
|
|
sortDescending = manga?.sortDescending() ?: false,
|
|
onItemSelected = onSortModeChanged,
|
|
)
|
|
}
|
|
2 -> {
|
|
DisplayPage(
|
|
displayMode = manga?.displayMode ?: 0,
|
|
onItemSelected = onDisplayModeChanged,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun ColumnScope.FilterPage(
|
|
downloadFilter: TriState,
|
|
onDownloadFilterChanged: ((TriState) -> Unit)?,
|
|
unreadFilter: TriState,
|
|
onUnreadFilterChanged: (TriState) -> Unit,
|
|
bookmarkedFilter: TriState,
|
|
onBookmarkedFilterChanged: (TriState) -> Unit,
|
|
// SY -->
|
|
onClickShowScanlatorSelection: (() -> Unit)?,
|
|
// SY <--
|
|
) {
|
|
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,
|
|
)
|
|
// SY -->
|
|
if (onClickShowScanlatorSelection != null) {
|
|
SetScanlatorsItem(onClickShowScanlatorSelection)
|
|
}
|
|
// SY <--
|
|
}
|
|
|
|
// SY -->
|
|
@Composable
|
|
private fun SetScanlatorsItem(
|
|
onClickShowScanlatorSelection: () -> Unit,
|
|
) {
|
|
Row(
|
|
modifier = Modifier
|
|
.clickable(
|
|
onClick = onClickShowScanlatorSelection,
|
|
)
|
|
.fillMaxWidth()
|
|
.padding(horizontal = TabbedDialogPaddings.Horizontal, vertical = 12.dp),
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
horizontalArrangement = Arrangement.spacedBy(24.dp),
|
|
) {
|
|
Icon(
|
|
imageVector = Icons.Outlined.PeopleAlt,
|
|
contentDescription = null,
|
|
)
|
|
Text(
|
|
text = stringResource(R.string.scanlator),
|
|
style = MaterialTheme.typography.bodyMedium,
|
|
)
|
|
}
|
|
}
|
|
// SY <--
|
|
|
|
@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,
|
|
onConfirmed: (optionalChecked: Boolean) -> Unit,
|
|
) {
|
|
var optionalChecked by rememberSaveable { mutableStateOf(false) }
|
|
AlertDialog(
|
|
onDismissRequest = onDismissRequest,
|
|
title = { Text(text = stringResource(R.string.chapter_settings)) },
|
|
text = {
|
|
Column(
|
|
verticalArrangement = Arrangement.spacedBy(12.dp),
|
|
) {
|
|
Text(text = stringResource(R.string.confirm_set_chapter_settings))
|
|
|
|
Row(
|
|
modifier = Modifier
|
|
.clickable { optionalChecked = !optionalChecked }
|
|
.padding(vertical = 8.dp)
|
|
.fillMaxWidth(),
|
|
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
) {
|
|
Checkbox(
|
|
checked = optionalChecked,
|
|
onCheckedChange = null,
|
|
)
|
|
Text(text = stringResource(R.string.also_set_chapter_settings_for_library))
|
|
}
|
|
}
|
|
},
|
|
dismissButton = {
|
|
TextButton(onClick = onDismissRequest) {
|
|
Text(text = stringResource(android.R.string.cancel))
|
|
}
|
|
},
|
|
confirmButton = {
|
|
TextButton(
|
|
onClick = {
|
|
onConfirmed(optionalChecked)
|
|
onDismissRequest()
|
|
},
|
|
) {
|
|
Text(text = stringResource(R.string.action_ok))
|
|
}
|
|
},
|
|
)
|
|
}
|