diff --git a/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt index 0883f87f0..a2d1f5c0d 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt @@ -57,13 +57,10 @@ fun GlobalSearchScreen( onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.filteredItems.forEach { (_, result) -> - when (result) { - is SearchItemResult.Success -> { - result.result.forEach { manga -> - bulkFavoriteScreenModel.select(manga) - } + if (result is SearchItemResult.Success) { + result.result.forEach { manga -> + bulkFavoriteScreenModel.select(manga) } - else -> {} } } }, diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt index e0154153f..3ca1aa983 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceSimpleToolbar.kt @@ -25,7 +25,7 @@ import tachiyomi.presentation.core.i18n.stringResource fun BrowseSourceSimpleToolbar( navigateUp: () -> Unit, title: String, - displayMode: LibraryDisplayMode, + displayMode: LibraryDisplayMode?, onDisplayModeChange: (LibraryDisplayMode) -> Unit, scrollBehavior: TopAppBarScrollBehavior, // KMK --> @@ -38,25 +38,30 @@ fun BrowseSourceSimpleToolbar( title = title, actions = { var selectingDisplayMode by remember { mutableStateOf(false) } + // KMK --> AppBarActions( - // SY --> - actions = persistentListOf( - AppBar.Action( - title = stringResource(MR.strings.action_display_mode), - // KMK --> - icon = if (displayMode == LibraryDisplayMode.List) { - Icons.AutoMirrored.Filled.ViewList - } else { - Icons.Filled.ViewModule - }, - // KMK <-- - onClick = { selectingDisplayMode = true }, - ), - // KMK --> - bulkSelectionButton(isRunning, toggleSelectionMode), - // KMK <-- - ), + actions = persistentListOf().builder() + .apply { + displayMode?.let { + add( + AppBar.Action( + title = stringResource(MR.strings.action_display_mode), + icon = if (displayMode == LibraryDisplayMode.List) { + Icons.AutoMirrored.Filled.ViewList + } else { + Icons.Filled.ViewModule + }, + onClick = { selectingDisplayMode = true }, + ), + ) + add( + bulkSelectionButton(isRunning, toggleSelectionMode), + ) + } + } + .build(), ) + // KMK <-- DropdownMenu( expanded = selectingDisplayMode, onDismissRequest = { selectingDisplayMode = false }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt index edf0743b0..49fa8af42 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateSearchScreen.kt @@ -35,7 +35,7 @@ class MigrateSearchScreen(private val mangaId: Long, private val validSources: L val bulkFavoriteState by bulkFavoriteScreenModel.state.collectAsState() BackHandler(enabled = bulkFavoriteState.selectionMode) { - bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteScreenModel.backHandler() } // KMK <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt index 1054a1c13..bc70c141c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt @@ -75,7 +75,7 @@ data class SourceSearchScreen( val bulkFavoriteState by bulkFavoriteScreenModel.state.collectAsState() BackHandler(enabled = bulkFavoriteState.selectionMode) { - bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteScreenModel.backHandler() } val mangaList = screenModel.mangaPagerFlowFlow.collectAsLazyPagingItems() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index 54e7a16db..b0f947d47 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -50,7 +50,6 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import tachiyomi.core.common.preference.CheckboxState 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 1291a30c7..5b64b3640 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 @@ -87,8 +87,6 @@ import exh.pagepreview.PagePreviewScreen import exh.recs.RecommendsScreen import exh.source.MERGED_SOURCE_ID import exh.source.getMainSource -import exh.source.isMdBasedSource -import exh.ui.ifSourcesLoaded import exh.ui.metadata.MetadataViewScreen import exh.ui.smartsearch.SmartSearchScreen import kotlinx.coroutines.CancellationException @@ -160,7 +158,7 @@ class MangaScreen( BackHandler(enabled = bulkFavoriteState.selectionMode || showingRelatedMangasScreen.value) { when { - bulkFavoriteState.selectionMode -> bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteState.selectionMode -> bulkFavoriteScreenModel.backHandler() showingRelatedMangasScreen.value -> showingRelatedMangasScreen.value = false } } diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 00c1a52e5..196687d48 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -59,7 +59,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { val bulkFavoriteState by bulkFavoriteScreenModel.state.collectAsState() BackHandler(enabled = bulkFavoriteState.selectionMode) { - bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteScreenModel.backHandler() } // KMK <-- diff --git a/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt b/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt index c21f573f8..eb185fd9b 100644 --- a/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt +++ b/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt @@ -28,7 +28,6 @@ import eu.kanade.tachiyomi.ui.browse.RemoveMangaDialog import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.webview.WebViewActivity -import exh.ui.ifSourcesLoaded import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.manga.model.Manga @@ -65,7 +64,7 @@ class BrowseRecommendsScreen( val haptic = LocalHapticFeedback.current BackHandler(enabled = bulkFavoriteState.selectionMode) { - bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteScreenModel.backHandler() } // KMK <-- diff --git a/app/src/main/java/exh/recs/RecommendsScreen.kt b/app/src/main/java/exh/recs/RecommendsScreen.kt index 7d837e044..0d7aecee4 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -1,25 +1,16 @@ package exh.recs import androidx.activity.compose.BackHandler -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifSourcesLoaded -import eu.kanade.presentation.browse.BrowseSourceContent -import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar -import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.AddDuplicateMangaDialog import eu.kanade.tachiyomi.ui.browse.AllowDuplicateDialog @@ -28,14 +19,11 @@ import eu.kanade.tachiyomi.ui.browse.ChangeMangaCategoryDialog import eu.kanade.tachiyomi.ui.browse.ChangeMangasCategoryDialog import eu.kanade.tachiyomi.ui.browse.RemoveMangaDialog import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen -import mihon.presentation.core.util.collectAsLazyPagingItems -import tachiyomi.core.common.util.lang.launchIO import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.webview.WebViewActivity import exh.recs.components.RecommendsScreen -import exh.ui.ifSourcesLoaded +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.manga.model.Manga -import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.LoadingScreen class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { @@ -63,7 +51,7 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { val haptic = LocalHapticFeedback.current BackHandler(enabled = bulkFavoriteState.selectionMode) { - bulkFavoriteScreenModel.toggleSelectionMode() + bulkFavoriteScreenModel.backHandler() } // KMK <-- @@ -125,8 +113,6 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { }, // KMK --> bulkFavoriteScreenModel = bulkFavoriteScreenModel, - displayMode = screenModel.displayMode, - onDisplayModeChange = { screenModel.displayMode = it }, // KMK <-- ) diff --git a/app/src/main/java/exh/recs/components/RecommendsScreen.kt b/app/src/main/java/exh/recs/components/RecommendsScreen.kt index 14749c1a0..7f5bad1e9 100644 --- a/app/src/main/java/exh/recs/components/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/components/RecommendsScreen.kt @@ -4,13 +4,18 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext +import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar import eu.kanade.presentation.browse.components.GlobalSearchCardRow import eu.kanade.presentation.browse.components.GlobalSearchErrorResultItem import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem import eu.kanade.presentation.browse.components.GlobalSearchResultItem -import eu.kanade.presentation.components.AppBar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.util.formattedMessage +import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel +import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult import exh.recs.RecommendationItemResult import exh.recs.RecommendsScreenModel import exh.recs.sources.RecommendationPagingSource @@ -30,14 +35,52 @@ fun RecommendsScreen( onClickSource: (RecommendationPagingSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, + // KMK --> + bulkFavoriteScreenModel: BulkFavoriteScreenModel, + // KMK <-- ) { + // KMK --> + val bulkFavoriteState by bulkFavoriteScreenModel.state.collectAsState() + // KMK <-- + Scaffold( topBar = { scrollBehavior -> - AppBar( - title = stringResource(SYMR.strings.similar, manga.title), - scrollBehavior = scrollBehavior, - navigateUp = navigateUp, - ) + // KMK --> + if (bulkFavoriteState.selectionMode) { + BulkSelectionToolbar( + selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, + onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, + onSelectAll = { + state.filteredItems.forEach { (_, result) -> + if (result is RecommendationItemResult.Success) { + result.result.forEach { manga -> + bulkFavoriteScreenModel.select(manga) + } + } + } + }, + onReverseSelection = { + bulkFavoriteScreenModel.reverseSelection( + state.filteredItems.values + .filterIsInstance() + .flatMap { it.result }, + ) + }, + ) + } else { + BrowseSourceSimpleToolbar( + displayMode = null, + onDisplayModeChange = {}, + toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, + // KMK <-- + title = stringResource(SYMR.strings.similar, manga.title), + scrollBehavior = scrollBehavior, + navigateUp = navigateUp, + ) + } }, ) { paddingValues -> RecommendsContent( @@ -47,6 +90,9 @@ fun RecommendsScreen( onClickSource = onClickSource, onClickItem = onClickItem, onLongClickItem = onLongClickItem, + // KMK --> + selection = bulkFavoriteState.selection, + // KMK <-- ) } } @@ -59,6 +105,9 @@ internal fun RecommendsContent( onClickSource: (RecommendationPagingSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, + // KMK --> + selection: List, + // KMK <-- ) { LazyColumn( contentPadding = contentPadding, @@ -80,6 +129,9 @@ internal fun RecommendsContent( getManga = getManga, onClick = onClickItem, onLongClick = onLongClickItem, + // KMK --> + selection = selection, + // KMK <-- ) } is RecommendationItemResult.Error -> {