From e874092d3e1565c2f85ec4e210ed34a50754a7f6 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Tue, 22 Oct 2024 18:42:19 +0700 Subject: [PATCH] show duplicating manga cover on Duplicate dialog --- .../manga/DuplicateMangaDialog.kt | 113 +++++++++++++++--- .../ui/browse/BulkFavoriteScreenModel.kt | 4 +- .../source/browse/BrowseSourceScreen.kt | 3 + .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 3 + .../exh/md/follows/MangaDexFollowsScreen.kt | 3 + 5 files changed, 106 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt index 9b6a6b992..b705ae926 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt @@ -2,6 +2,7 @@ package eu.kanade.presentation.manga import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowColumn import androidx.compose.foundation.layout.FlowRow @@ -10,8 +11,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn +import androidx.compose.foundation.layout.widthIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.Book @@ -23,18 +26,27 @@ import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.components.TabbedDialogPaddings +import eu.kanade.presentation.manga.components.MangaCover +import eu.kanade.presentation.manga.components.RatioSwitchToPanorama import eu.kanade.presentation.more.settings.LocalPreferenceMinHeight import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget +import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR import tachiyomi.presentation.core.i18n.stringResource +import tachiyomi.presentation.core.util.collectAsState +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get @Composable fun DuplicateMangaDialog( @@ -42,10 +54,19 @@ fun DuplicateMangaDialog( onConfirm: () -> Unit, onOpenManga: () -> Unit, onMigrate: () -> Unit, + // KMK --> + duplicate: Manga, + // KMK <-- modifier: Modifier = Modifier, ) { val minHeight = LocalPreferenceMinHeight.current + // KMK --> + val usePanoramaCover by Injekt.get().usePanoramaCover().collectAsState() + val coverRatio = remember { mutableFloatStateOf(1f) } + val coverIsWide = coverRatio.floatValue <= RatioSwitchToPanorama + // KMK <-- + AdaptiveSheet( modifier = modifier, onDismissRequest = onDismissRequest, @@ -71,6 +92,37 @@ fun DuplicateMangaDialog( Spacer(Modifier.height(PaddingSize)) + // KMK --> + Box( + modifier = Modifier + .fillMaxWidth(), + ) { + if (usePanoramaCover && coverIsWide) { + MangaCover.Panorama( + modifier = Modifier + .align(Alignment.Center) + .heightIn(max = 150.dp), + data = duplicate, + onCoverLoaded = { _, result -> + val image = result.result.image + coverRatio.floatValue = image.height.toFloat() / image.width + }, + ) + } else { + MangaCover.Book( + modifier = Modifier + .align(Alignment.Center) + .widthIn(max = 150.dp), + data = duplicate, + onCoverLoaded = { _, result -> + val image = result.result.image + coverRatio.floatValue = image.height.toFloat() / image.width + }, + ) + } + } + // KMK <-- + TextPreferenceWidget( title = stringResource(MR.strings.action_show_manga), icon = Icons.Outlined.Book, @@ -141,18 +193,56 @@ fun DuplicateMangasDialog( onAllowDuplicate: () -> Unit, onSkipDuplicate: () -> Unit, stopRunning: () -> Unit, - duplicatedName: String, + mangaName: String, + duplicate: Manga, ) { + val usePanoramaCover by Injekt.get().usePanoramaCover().collectAsState() + val coverRatio = remember { mutableFloatStateOf(1f) } + val coverIsWide = coverRatio.floatValue <= RatioSwitchToPanorama + AlertDialog( onDismissRequest = { stopRunning() onDismissRequest() }, title = { - Text(text = duplicatedName) + Text(text = mangaName) }, text = { - Text(text = stringResource(MR.strings.confirm_add_duplicate_manga)) + Column { + Text(text = stringResource(MR.strings.confirm_add_duplicate_manga)) + + Spacer(Modifier.height(PaddingSize)) + + Box( + modifier = Modifier + .fillMaxWidth(), + ) { + if (usePanoramaCover && coverIsWide) { + MangaCover.Panorama( + modifier = Modifier + .align(Alignment.Center) + .heightIn(max = 150.dp), + data = duplicate, + onCoverLoaded = { _, result -> + val image = result.result.image + coverRatio.floatValue = image.height.toFloat() / image.width + }, + ) + } else { + MangaCover.Book( + modifier = Modifier + .align(Alignment.Center) + .widthIn(max = 150.dp), + data = duplicate, + onCoverLoaded = { _, result -> + val image = result.result.image + coverRatio.floatValue = image.height.toFloat() / image.width + }, + ) + } + } + } }, confirmButton = { FlowRow( @@ -229,19 +319,4 @@ fun DuplicateMangasDialog( }, ) } - -@Preview -@Composable -fun DuplicateMangasDialogPreview() { - DuplicateMangasDialog( - onDismissRequest = { }, - onAllowAllDuplicate = { }, - onSkipAllDuplicate = { }, - onOpenManga = { }, - onAllowDuplicate = { }, - onSkipDuplicate = { }, - duplicatedName = "Berserk", - stopRunning = { }, - ) -} // KMK <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BulkFavoriteScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BulkFavoriteScreenModel.kt index 42d4e9373..4e01390e0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BulkFavoriteScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BulkFavoriteScreenModel.kt @@ -453,6 +453,7 @@ fun AddDuplicateMangaDialog(bulkFavoriteScreenModel: BulkFavoriteScreenModel) { dialog.manga.id, ) }, + duplicate = dialog.duplicate, ) } @@ -525,8 +526,9 @@ fun AllowDuplicateDialog(bulkFavoriteScreenModel: BulkFavoriteScreenModel) { bulkFavoriteScreenModel.removeDuplicateSelectedManga(index = dialog.duplicatedManga.first) bulkFavoriteScreenModel.addFavorite(startIdx = dialog.duplicatedManga.first) }, - duplicatedName = dialog.duplicatedManga.second.title, + mangaName = dialog.duplicatedManga.second.title, stopRunning = bulkFavoriteScreenModel::stopRunning, + duplicate = dialog.duplicatedManga.second, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt index 99c40287a..853004a72 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt @@ -438,6 +438,9 @@ data class BrowseSourceScreen( ) // SY <-- }, + // KMK --> + duplicate = dialog.duplicate, + // KMK <-- ) } is BrowseSourceScreenModel.Dialog.RemoveManga -> { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index c6b15e058..fe61194ff 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -440,6 +440,9 @@ class MangaScreen( migrateManga(navigator, dialog.duplicate, screenModel.manga!!.id) // SY <-- }, + // KMK --> + duplicate = dialog.duplicate, + // KMK <-- ) } diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 1ccfaae82..7ebdbb194 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -173,6 +173,9 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { dialog.manga.id, ) }, + // KMK --> + duplicate = dialog.duplicate, + // KMK <-- ) } is BrowseSourceScreenModel.Dialog.RemoveManga -> {