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 2ecdb0387..07caf826f 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/GlobalSearchScreen.kt @@ -13,7 +13,7 @@ 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.browse.components.GlobalSearchToolbar -import eu.kanade.presentation.components.SelectionToolbar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult @@ -49,10 +49,11 @@ fun GlobalSearchScreen( topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.filteredItems.forEach { (_, result) -> when (result) { @@ -84,6 +85,7 @@ fun GlobalSearchScreen( scrollBehavior = scrollBehavior, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } diff --git a/app/src/main/java/eu/kanade/presentation/browse/MigrateSearchScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/MigrateSearchScreen.kt index 3624c73ad..57600595f 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/MigrateSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/MigrateSearchScreen.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import eu.kanade.presentation.browse.components.GlobalSearchToolbar -import eu.kanade.presentation.components.SelectionToolbar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult @@ -39,10 +39,11 @@ fun MigrateSearchScreen( topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.filteredItems.forEach { (_, result) -> when (result) { @@ -74,6 +75,7 @@ fun MigrateSearchScreen( scrollBehavior = scrollBehavior, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt index 8aa8c89dc..ddf41ed7e 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt @@ -20,8 +20,8 @@ import eu.kanade.presentation.browse.components.GlobalSearchResultItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarTitle +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.components.SearchToolbar -import eu.kanade.presentation.components.SelectionToolbar import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel import eu.kanade.tachiyomi.ui.browse.bulkSelectionButton import kotlinx.collections.immutable.ImmutableList @@ -118,10 +118,11 @@ fun SourceFeedScreen( topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { items.forEach { it.results?.forEach { manga -> @@ -146,6 +147,7 @@ fun SourceFeedScreen( onSourceSettingClick = onSourceSettingClick, onSortFeedClick = onSortFeedClick, toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } @@ -302,6 +304,7 @@ fun SourceFeedToolbar( onSourceSettingClick: (() -> Unit?)?, onSortFeedClick: (() -> Unit)?, toggleSelectionMode: () -> Unit, + isRunning: Boolean, // KMK <-- ) { SearchToolbar( @@ -320,7 +323,7 @@ fun SourceFeedToolbar( AppBarActions( actions = persistentListOf().builder() .apply { - add(bulkSelectionButton(toggleSelectionMode)) + add(bulkSelectionButton(isRunning, toggleSelectionMode)) onWebViewClick?.let { add( 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 41a52e788..e628b1df6 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 @@ -34,6 +34,7 @@ fun BrowseSourceSimpleToolbar( scrollBehavior: TopAppBarScrollBehavior, // KMK --> toggleSelectionMode: () -> Unit, + isRunning: Boolean, // KMK <-- ) { AppBar( @@ -56,7 +57,7 @@ fun BrowseSourceSimpleToolbar( onClick = { selectingDisplayMode = true }, ), // KMK --> - bulkSelectionButton(toggleSelectionMode), + bulkSelectionButton(isRunning, toggleSelectionMode), // KMK <-- ), ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt index b57fc6840..6e56c0dfc 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt @@ -48,6 +48,7 @@ fun BrowseSourceToolbar( scrollBehavior: TopAppBarScrollBehavior? = null, // KMK --> toggleSelectionMode: () -> Unit, + isRunning: Boolean, // KMK <-- ) { // Avoid capturing unstable source in actions lambda @@ -82,7 +83,7 @@ fun BrowseSourceToolbar( ) } // KMK --> - add(bulkSelectionButton(toggleSelectionMode)) + add(bulkSelectionButton(isRunning, toggleSelectionMode)) // KMK <-- if (isLocalSource) { if (isConfigurableSource && displayMode != null) { diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/GlobalSearchToolbar.kt b/app/src/main/java/eu/kanade/presentation/browse/components/GlobalSearchToolbar.kt index ee18bcd4f..62484e8ef 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/GlobalSearchToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/GlobalSearchToolbar.kt @@ -50,6 +50,7 @@ fun GlobalSearchToolbar( scrollBehavior: TopAppBarScrollBehavior, // KMK --> toggleSelectionMode: () -> Unit, + isRunning: Boolean, // KMK <-- ) { Column(modifier = Modifier.background(MaterialTheme.colorScheme.surface)) { @@ -65,7 +66,7 @@ fun GlobalSearchToolbar( actions = { AppBarActions( actions = persistentListOf( - bulkSelectionButton(toggleSelectionMode), + bulkSelectionButton(isRunning, toggleSelectionMode), ), ) }, diff --git a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt index 2315e0050..f7d16d7c9 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt @@ -2,9 +2,11 @@ package eu.kanade.presentation.components import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions @@ -26,6 +28,7 @@ import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.rememberTooltipState import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable @@ -35,6 +38,7 @@ import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester @@ -215,6 +219,29 @@ fun AppBarActions( } } + // KMK --> + actions.filterIsInstance().map { + TooltipBox( + positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), + tooltip = { + PlainTooltip { + Text(it.title) + } + }, + state = rememberTooltipState(), + ) { + Box( + modifier = Modifier + .minimumInteractiveComponentSize() + .size(40.dp), + contentAlignment = Alignment.Center, + ) { + it.content() + } + } + } + // KMK <-- + val overflowActions = actions.filterIsInstance() if (overflowActions.isNotEmpty()) { TooltipBox( @@ -419,6 +446,13 @@ sealed interface AppBar { val enabled: Boolean = true, ) : AppBarAction + // KMK --> + data class ActionCompose( + val title: String, + val content: @Composable () -> Unit, + ) : AppBarAction + // KMK <-- + data class OverflowAction( val title: String, val onClick: () -> Unit, diff --git a/app/src/main/java/eu/kanade/presentation/components/BulkSelectionToolbar.kt b/app/src/main/java/eu/kanade/presentation/components/BulkSelectionToolbar.kt new file mode 100644 index 000000000..0534c8852 --- /dev/null +++ b/app/src/main/java/eu/kanade/presentation/components/BulkSelectionToolbar.kt @@ -0,0 +1,95 @@ +package eu.kanade.presentation.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BookmarkAdd +import androidx.compose.material.icons.filled.SelectAll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import kotlinx.collections.immutable.persistentListOf +import tachiyomi.i18n.MR +import tachiyomi.i18n.kmk.KMR +import tachiyomi.presentation.core.i18n.stringResource + +@Composable +fun BulkSelectionToolbar( + selectedCount: Int, + isRunning: Boolean, + onClickClearSelection: () -> Unit, + onChangeCategoryClick: () -> Unit, + onSelectAll: (() -> Unit)? = null, +) { + AppBar( + titleContent = { Text(text = "$selectedCount") }, + actions = { + AppBarActions( + actions = persistentListOf() + .builder() + .apply { + if (onSelectAll != null) { + add( + AppBar.Action( + title = stringResource(MR.strings.action_select_all), + icon = Icons.Filled.SelectAll, + onClick = { + onSelectAll() + }, + ), + ) + } + if (isRunning) { + add( + AppBar.ActionCompose( + title = stringResource(KMR.strings.action_bulk_select), + ) { + CircularProgressIndicator( + modifier = Modifier + .size(24.dp), + strokeWidth = 2.dp, + ) + }, + ) + } else { + add( + AppBar.Action( + title = stringResource(MR.strings.action_bookmark), + icon = Icons.Filled.BookmarkAdd, + onClick = { + if (selectedCount > 0) { + onChangeCategoryClick() + } + }, + ), + ) + } + }.build(), + ) + }, + isActionMode = true, + onCancelActionMode = onClickClearSelection, + ) +} + +@Preview +@Composable +private fun SelectionToolbarPreview() { + Column { + BulkSelectionToolbar( + selectedCount = 9, + isRunning = false, + onClickClearSelection = {}, + onChangeCategoryClick = {}, + ) + BulkSelectionToolbar( + selectedCount = 9, + isRunning = true, + onClickClearSelection = {}, + onChangeCategoryClick = {}, + ) + } +} diff --git a/app/src/main/java/eu/kanade/presentation/components/SelectionToolbar.kt b/app/src/main/java/eu/kanade/presentation/components/SelectionToolbar.kt deleted file mode 100644 index 258c5aa71..000000000 --- a/app/src/main/java/eu/kanade/presentation/components/SelectionToolbar.kt +++ /dev/null @@ -1,65 +0,0 @@ -package eu.kanade.presentation.components - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.BookmarkAdd -import androidx.compose.material.icons.filled.SelectAll -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview -import kotlinx.collections.immutable.persistentListOf -import tachiyomi.i18n.MR -import tachiyomi.presentation.core.i18n.stringResource - -@Composable -fun SelectionToolbar( - selectedCount: Int, - onClickClearSelection: () -> Unit, - onChangeCategoryClicked: () -> Unit, - onSelectAll: (() -> Unit)? = null, -) { - AppBar( - titleContent = { Text(text = "$selectedCount") }, - actions = { - AppBarActions( - actions = persistentListOf().builder() - .apply { - if (onSelectAll != null) { - add( - AppBar.Action( - title = stringResource(MR.strings.action_select_all), - icon = Icons.Filled.SelectAll, - onClick = { - onSelectAll() - }, - ), - ) - } - add( - AppBar.Action( - title = stringResource(MR.strings.action_bookmark), - icon = Icons.Filled.BookmarkAdd, - onClick = { - if (selectedCount > 0) { - onChangeCategoryClicked() - } - }, - ), - ) - } - .build(), - ) - }, - isActionMode = true, - onCancelActionMode = onClickClearSelection, - ) -} - -@Preview -@Composable -fun SelectionToolbarPreview() { - SelectionToolbar( - selectedCount = 9, - {}, - {}, - ) -} diff --git a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt index 78d5fee08..46494c645 100644 --- a/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt @@ -66,10 +66,11 @@ fun TabbedScreen( val searchEnabled = tab.searchEnabled // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { feedState.items?.forEach { it.results?.forEach { manga -> 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 35dd8840b..9b6a6b992 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt @@ -140,10 +140,14 @@ fun DuplicateMangasDialog( onOpenManga: () -> Unit, onAllowDuplicate: () -> Unit, onSkipDuplicate: () -> Unit, + stopRunning: () -> Unit, duplicatedName: String, ) { AlertDialog( - onDismissRequest = onDismissRequest, + onDismissRequest = { + stopRunning() + onDismissRequest() + }, title = { Text(text = duplicatedName) }, @@ -202,6 +206,7 @@ fun DuplicateMangasDialog( FlowColumn { TextButton( onClick = { + stopRunning() onDismissRequest() onOpenManga() }, @@ -212,6 +217,7 @@ fun DuplicateMangasDialog( TextButton( onClick = { + stopRunning() onDismissRequest() }, Modifier.align(Alignment.CenterHorizontally), @@ -235,6 +241,7 @@ fun DuplicateMangasDialogPreview() { 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 1b6e53d4c..339717018 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 @@ -2,13 +2,13 @@ package eu.kanade.tachiyomi.ui.browse import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Checklist +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.hapticfeedback.HapticFeedback import androidx.compose.ui.hapticfeedback.HapticFeedbackType -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastForEachIndexed @@ -21,6 +21,7 @@ import eu.kanade.domain.track.interactor.AddTracks import eu.kanade.presentation.browse.components.RemoveMangaDialog import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.components.AppBar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.manga.DuplicateMangaDialog import eu.kanade.presentation.manga.DuplicateMangasDialog import eu.kanade.tachiyomi.data.cache.CoverCache @@ -112,8 +113,15 @@ class BulkFavoriteScreenModel( } } + /** + * Called when user click on [BulkSelectionToolbar]'s `Favorite` button. + * It will then look for any duplicated mangas. + * - If there is any, it will show the [DuplicateMangasDialog]. + * - If not then it will call the [addFavoriteDuplicate]. + */ fun addFavorite(startIdx: Int = 0) { screenModelScope.launch { + startRunning() val mangaWithDup = getDuplicateLibraryManga(startIdx) if (mangaWithDup != null) { setDialog(Dialog.AllowDuplicate(mangaWithDup)) @@ -123,10 +131,15 @@ class BulkFavoriteScreenModel( } } + /** + * Add mangas to library if there is default category or no category exists. + * If not, it shows the categories list. + */ fun addFavoriteDuplicate(skipAllDuplicates: Boolean = false) { screenModelScope.launch { val mangaList = if (skipAllDuplicates) getNotDuplicateLibraryMangas() else state.value.selection if (mangaList.isEmpty()) { + stopRunning() toggleSelectionMode() return@launch } @@ -137,11 +150,13 @@ class BulkFavoriteScreenModel( when { // Default category set defaultCategory != null -> { + stopRunning() setMangasCategories(mangaList, listOf(defaultCategory.id), emptyList()) } // Automatic 'Default' or no categories defaultCategoryId == 0 || categories.isEmpty() -> { + stopRunning() // Automatic 'Default' or no categories setMangasCategories(mangaList, emptyList(), emptyList()) } @@ -160,6 +175,7 @@ class BulkFavoriteScreenModel( } } .toImmutableList() + stopRunning() setDialog(Dialog.ChangeMangasCategory(mangaList, preselected)) } } @@ -201,6 +217,7 @@ class BulkFavoriteScreenModel( */ fun setMangasCategories(mangaList: List, addCategories: List, removeCategories: List) { screenModelScope.launchNonCancellable { + startRunning() mangaList.fastForEach { manga -> val categoryIds = getCategories.await(manga.id) .map { it.id } @@ -210,6 +227,7 @@ class BulkFavoriteScreenModel( moveMangaToCategoriesAndAddToLibrary(manga, categoryIds) } + stopRunning() } toggleSelectionMode() } @@ -374,6 +392,18 @@ class BulkFavoriteScreenModel( } } + private fun startRunning() { + mutableState.update { + it.copy(isRunning = true) + } + } + + fun stopRunning() { + mutableState.update { + it.copy(isRunning = false) + } + } + interface Dialog { data class RemoveManga(val manga: Manga) : Dialog data class AddDuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog @@ -393,6 +423,7 @@ class BulkFavoriteScreenModel( val dialog: Dialog? = null, val selection: PersistentList = persistentListOf(), val selectionMode: Boolean = false, + val isRunning: Boolean = false, ) } @@ -487,19 +518,17 @@ fun AllowDuplicateDialog(bulkFavoriteScreenModel: BulkFavoriteScreenModel) { bulkFavoriteScreenModel.addFavorite(startIdx = dialog.duplicatedManga.first) }, duplicatedName = dialog.duplicatedManga.second.title, + stopRunning = bulkFavoriteScreenModel::stopRunning, ) } @Composable -fun bulkSelectionButton(toggleSelectionMode: () -> Unit) = - AppBar.Action( - title = stringResource(KMR.strings.action_bulk_select), - icon = Icons.Outlined.Checklist, - onClick = toggleSelectionMode, - ) - -@Preview -@Composable -fun BulkSelectionButtonPreview() { - bulkSelectionButton { } -} +fun bulkSelectionButton( + isRunning: Boolean, + toggleSelectionMode: () -> Unit, +) = AppBar.Action( + title = stringResource(KMR.strings.action_bulk_select), + icon = Icons.Outlined.Checklist, + iconTint = MaterialTheme.colorScheme.primary.takeIf { isRunning }, + onClick = toggleSelectionMode, +) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt index 7a2a1fd4e..f4697d243 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt @@ -122,7 +122,10 @@ fun feedTab( icon = Icons.Outlined.SwapVert, onClick = { showingFeedOrderScreen.value = true }, ), - bulkSelectionButton(bulkFavoriteScreenModel::toggleSelectionMode), + bulkSelectionButton( + isRunning = bulkFavoriteState.isRunning, + toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + ), // 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 6846382a7..448295283 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 @@ -16,8 +16,8 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.BrowseSourceContent import eu.kanade.presentation.browse.components.BrowseSourceFloatingActionButton import eu.kanade.presentation.components.AppBarActions +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.components.SearchToolbar -import eu.kanade.presentation.components.SelectionToolbar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.browse.AllowDuplicateDialog @@ -76,10 +76,11 @@ data class SourceSearchScreen( topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.mangaDisplayingList.forEach { manga -> if (!bulkFavoriteState.selection.contains(manga)) { @@ -100,7 +101,10 @@ data class SourceSearchScreen( actions = { AppBarActions( actions = persistentListOf( - bulkSelectionButton(bulkFavoriteScreenModel::toggleSelectionMode), + bulkSelectionButton( + isRunning = bulkFavoriteState.isRunning, + toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + ), ), ) }, 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 037a5cda0..98a5739aa 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 @@ -44,7 +44,7 @@ import eu.kanade.presentation.browse.components.RemoveMangaDialog import eu.kanade.presentation.browse.components.SavedSearchCreateDialog import eu.kanade.presentation.browse.components.SavedSearchDeleteDialog import eu.kanade.presentation.category.components.ChangeCategoryDialog -import eu.kanade.presentation.components.SelectionToolbar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.manga.DuplicateMangaDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen @@ -176,10 +176,11 @@ data class BrowseSourceScreen( Column(modifier = Modifier.background(MaterialTheme.colorScheme.surface)) { // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.mangaDisplayingList.forEach { manga -> if (!bulkFavoriteState.selection.contains(manga)) { @@ -208,6 +209,7 @@ data class BrowseSourceScreen( onSearch = screenModel::search, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/RelatedMangasScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/RelatedMangasScreen.kt index 74bf36906..80f6e08cb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/RelatedMangasScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/RelatedMangasScreen.kt @@ -17,7 +17,7 @@ import eu.kanade.core.preference.asState import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.browse.RelatedMangasContent import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar -import eu.kanade.presentation.components.SelectionToolbar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchScreen @@ -48,10 +48,11 @@ fun RelatedMangasScreen( Scaffold( topBar = { scrollBehavior -> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { successState.relatedMangasSorted?.forEach { val relatedManga = it as RelatedManga.Success @@ -71,6 +72,7 @@ fun RelatedMangasScreen( onDisplayModeChange = { displayMode = it }, scrollBehavior = scrollBehavior, toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, ) } }, diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index b163a710d..50c24d11b 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -19,7 +19,7 @@ import eu.kanade.presentation.browse.BrowseSourceContent import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar import eu.kanade.presentation.browse.components.RemoveMangaDialog import eu.kanade.presentation.category.components.ChangeCategoryDialog -import eu.kanade.presentation.components.SelectionToolbar +import eu.kanade.presentation.components.BulkSelectionToolbar import eu.kanade.presentation.manga.DuplicateMangaDialog import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.AllowDuplicateDialog @@ -69,10 +69,11 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.mangaDisplayingList.forEach { manga -> if (!bulkFavoriteState.selection.contains(manga)) { @@ -91,6 +92,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { scrollBehavior = scrollBehavior, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } diff --git a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt index 192faaa7d..9c9664477 100644 --- a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt +++ b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt @@ -15,7 +15,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.BrowseSourceContent import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar -import eu.kanade.presentation.components.SelectionToolbar +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 @@ -65,10 +65,11 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.mangaDisplayingList.forEach { manga -> if (!bulkFavoriteState.selection.contains(manga)) { @@ -87,6 +88,7 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { scrollBehavior = scrollBehavior, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) } diff --git a/app/src/main/java/exh/recs/RecommendsScreen.kt b/app/src/main/java/exh/recs/RecommendsScreen.kt index ba1ea8b5b..43bb14596 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -16,7 +16,7 @@ import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.BrowseSourceContent import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar -import eu.kanade.presentation.components.SelectionToolbar +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 @@ -64,10 +64,11 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { topBar = { scrollBehavior -> // KMK --> if (bulkFavoriteState.selectionMode) { - SelectionToolbar( + BulkSelectionToolbar( selectedCount = bulkFavoriteState.selection.size, + isRunning = bulkFavoriteState.isRunning, onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode, - onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite, + onChangeCategoryClick = bulkFavoriteScreenModel::addFavorite, onSelectAll = { state.mangaDisplayingList.forEach { manga -> if (!bulkFavoriteState.selection.contains(manga)) { @@ -86,6 +87,7 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { scrollBehavior = scrollBehavior, // KMK --> toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, + isRunning = bulkFavoriteState.isRunning, // KMK <-- ) }