fix(merged-entries): Fix manga folder opening and source click (#1115)

* Fix open manga folder

* Fix source click

* fix null

* warning
This commit is contained in:
Cuong-Tran 2025-08-29 17:46:36 +07:00
parent b067690678
commit 8cfab79227
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
2 changed files with 60 additions and 27 deletions

View file

@ -117,6 +117,7 @@ import tachiyomi.domain.source.interactor.GetRemoteManga
import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.model.StubSource
import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.source.service.SourceManager
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.i18n.kmk.KMR
import tachiyomi.i18n.sy.SYMR import tachiyomi.i18n.sy.SYMR
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
@ -421,8 +422,20 @@ class MangaScreen(
} }
}.takeIf { isConfigurableSource }, }.takeIf { isConfigurableSource },
onClearManga = { screenModel.showClearMangaDialog(successState.source is MergedSource) }, onClearManga = { screenModel.showClearMangaDialog(successState.source is MergedSource) },
onOpenMangaFolder = { screenModel.openMangaFolder() } onOpenMangaFolder = {
.takeIf { successState.source !is StubSource && successState.source !is MergedSource }, if (successState.mergedData == null) {
screenModel.openMangaFolder(screenModel.source, screenModel.manga)
} else {
mergedMangaAction(
context,
navigator,
successState.mergedData,
action = { _, nav, manga, source -> screenModel.openMangaFolder(source, manga) },
titleRes = KMR.strings.action_open_folder,
)
}
}
.takeIf { successState.source !is StubSource },
onRelatedMangasScreenClick = { onRelatedMangasScreenClick = {
if (successState.isRelatedMangasFetched == null) { if (successState.isRelatedMangasFetched == null) {
scope.launchIO { screenModel.fetchRelatedMangasFromSource(onDemand = true) } scope.launchIO { screenModel.fetchRelatedMangasFromSource(onDemand = true) }
@ -433,28 +446,21 @@ class MangaScreen(
onRelatedMangaLongClick = { bulkFavoriteScreenModel.addRemoveManga(it, haptic) }, onRelatedMangaLongClick = { bulkFavoriteScreenModel.addRemoveManga(it, haptic) },
onSourceClick = { onSourceClick = {
if (successState.source !is StubSource) { if (successState.source !is StubSource) {
val screen = when { // KMK -->
// Clicked on source of an entry being merged with previous entry or if (successState.mergedData == null) {
// source of an recommending entry (to search again) screenModel.source?.let { browseSource(navigator, it, screenModel.useNewSourceNavigation) }
smartSearchConfig != null -> SmartSearchScreen(successState.source.id, smartSearchConfig) } else {
screenModel.useNewSourceNavigation -> SourceFeedScreen(successState.source.id) mergedMangaAction(
else -> BrowseSourceScreen(successState.source.id, GetRemoteManga.QUERY_POPULAR) context,
} navigator,
when (screen) { successState.mergedData,
// When doing a migrate/recommend => replace previous screen to perform search again. action = { _, nav, _, source ->
is SmartSearchScreen -> { source?.let { browseSource(nav, it, screenModel.useNewSourceNavigation) }
navigator.popUntil { it is SmartSearchScreen } },
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) titleRes = MR.strings.browse,
} )
is SourceFeedScreen -> {
navigator.popUntil { it is SourceFeedScreen }
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen)
}
else -> {
navigator.popUntil { it is BrowseSourceScreen }
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen)
}
} }
// KMK <--
} else { } else {
navigator.push(ExtensionsScreen(searchSource = successState.source.name)) navigator.push(ExtensionsScreen(searchSource = successState.source.name))
} }
@ -673,7 +679,7 @@ class MangaScreen(
return try { return try {
source.getMangaUrl(manga.toSManga()) source.getMangaUrl(manga.toSManga())
} catch (e: Exception) { } catch (_: Exception) {
null null
} }
} }
@ -855,6 +861,35 @@ class MangaScreen(
.show() .show()
} }
// KMK -->
private fun browseSource(navigator: Navigator, source: Source, useNewSourceNavigation: Boolean) {
val screen = when {
// Clicked on source of an entry being merged with previous entry or
// source of an recommending entry (to search again)
smartSearchConfig != null -> SmartSearchScreen(source.id, smartSearchConfig)
useNewSourceNavigation -> SourceFeedScreen(source.id)
else -> BrowseSourceScreen(source.id, GetRemoteManga.QUERY_POPULAR)
}
when (screen) {
// When doing a migrate/recommend => replace previous screen to perform search again.
is SmartSearchScreen -> {
navigator.popUntil { it is SmartSearchScreen }
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen)
}
is SourceFeedScreen -> {
navigator.popUntil { it is SourceFeedScreen }
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen)
}
else -> {
navigator.popUntil { it is BrowseSourceScreen }
if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen)
}
}
}
// KMK <--
private fun openMorePagePreviews(navigator: Navigator, manga: Manga) { private fun openMorePagePreviews(navigator: Navigator, manga: Manga) {
navigator.push(PagePreviewScreen(manga.id)) navigator.push(PagePreviewScreen(manga.id))
} }

View file

@ -933,10 +933,8 @@ class MangaScreenModel(
/** /**
* Opens manga folder with the system's file manager. * Opens manga folder with the system's file manager.
*/ */
fun openMangaFolder() { fun openMangaFolder(currentSource: Source?, currentManga: Manga?) {
try { try {
val currentManga = manga
val currentSource = source
if (currentManga == null || currentSource == null || currentSource is StubSource) return if (currentManga == null || currentSource == null || currentSource is StubSource) return
val mangaDir = downloadProvider.findMangaDir(/* SY --> */ currentManga.ogTitle /* SY <-- */, currentSource) ?: return val mangaDir = downloadProvider.findMangaDir(/* SY --> */ currentManga.ogTitle /* SY <-- */, currentSource) ?: return