Skip to content

Commit f6be3a4

Browse files
committed
BulkSelection: “Select all” for all screens
(cherry picked from commit bddcc089df738e23331b351cc20c8425cb316c74)
1 parent 45553eb commit f6be3a4

File tree

13 files changed

+97
-7
lines changed

13 files changed

+97
-7
lines changed

app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.material3.SnackbarHostState
1212
import androidx.compose.material3.SnackbarResult
1313
import androidx.compose.runtime.Composable
1414
import androidx.compose.runtime.LaunchedEffect
15+
import androidx.compose.runtime.collectAsState
1516
import androidx.compose.ui.Modifier
1617
import androidx.compose.ui.platform.LocalContext
1718
import androidx.paging.LoadState
@@ -23,6 +24,7 @@ import eu.kanade.presentation.browse.components.BrowseSourceList
2324
import eu.kanade.presentation.components.AppBar
2425
import eu.kanade.presentation.util.formattedMessage
2526
import eu.kanade.tachiyomi.source.Source
27+
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel
2628
import exh.metadata.metadata.RaisedSearchMetadata
2729
import exh.source.isEhBasedSource
2830
import kotlinx.collections.immutable.persistentListOf
@@ -60,6 +62,7 @@ fun BrowseSourceContent(
6062
onMangaLongClick: (Manga) -> Unit,
6163
// KMK -->
6264
selection: List<Manga>,
65+
browseSourceState: BrowseSourceScreenModel.State,
6366
// KMK <--
6467
) {
6568
val context = LocalContext.current
@@ -135,9 +138,22 @@ fun BrowseSourceContent(
135138
LoadingScreen(
136139
modifier = Modifier.padding(contentPadding),
137140
)
141+
// KMK -->
142+
browseSourceState.mangaDisplayingList.clear()
143+
// KMK <--
138144
return
139145
}
140146

147+
// KMK -->
148+
for (idx in browseSourceState.mangaDisplayingList.size..<mangaList.itemCount) {
149+
mangaList[idx]?.collectAsState()?.value?.first?.let { manga ->
150+
if (!browseSourceState.mangaDisplayingList.map { it.id }.contains(manga.id)) {
151+
browseSourceState.mangaDisplayingList.add(manga)
152+
}
153+
}
154+
}
155+
// KMK <--
156+
141157
// SY -->
142158
if (source?.isEhBasedSource() == true && ehentaiBrowseDisplayMode) {
143159
BrowseSourceEHentaiList(

app/src/main/java/eu/kanade/presentation/browse/MigrateSearchScreen.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import eu.kanade.presentation.browse.components.GlobalSearchToolbar
88
import eu.kanade.presentation.components.SelectionToolbar
99
import eu.kanade.tachiyomi.source.CatalogueSource
1010
import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel
11+
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchItemResult
1112
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SearchScreenModel
1213
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SourceFilter
1314
import tachiyomi.domain.manga.model.Manga
@@ -42,6 +43,19 @@ fun MigrateSearchScreen(
4243
selectedCount = bulkFavoriteState.selection.size,
4344
onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode,
4445
onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite,
46+
onSelectAll = {
47+
state.filteredItems.forEach { (_, result) ->
48+
when (result) {
49+
is SearchItemResult.Success -> {
50+
result.result.forEach { manga ->
51+
if (!bulkFavoriteState.selection.contains(manga))
52+
bulkFavoriteScreenModel.select(manga)
53+
}
54+
}
55+
else -> {}
56+
}
57+
}
58+
},
4559
)
4660
} else {
4761
// KMK <--

app/src/main/java/eu/kanade/presentation/browse/SourceFeedScreen.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ fun SourceFeedScreen(
122122
selectedCount = bulkFavoriteState.selection.size,
123123
onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode,
124124
onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite,
125+
onSelectAll = {
126+
items.forEach {
127+
it.results?.forEach { manga ->
128+
if (!bulkFavoriteState.selection.contains(manga))
129+
bulkFavoriteScreenModel.select(manga)
130+
}
131+
}
132+
},
125133
)
126134
} else {
127135
// KMK <--

app/src/main/java/eu/kanade/presentation/components/SelectionToolbar.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fun SelectionToolbar(
2929
title = stringResource(MR.strings.action_select_all),
3030
icon = Icons.Filled.SelectAll,
3131
onClick = {
32-
onSelectAll.invoke()
32+
onSelectAll()
3333
},
3434
),
3535
)

app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.ui.platform.LocalLayoutDirection
2525
import androidx.compose.ui.zIndex
2626
import dev.icerock.moko.resources.StringResource
2727
import eu.kanade.tachiyomi.ui.browse.BulkFavoriteScreenModel
28+
import eu.kanade.tachiyomi.ui.browse.feed.FeedScreenModel
2829
import kotlinx.collections.immutable.ImmutableList
2930
import kotlinx.collections.immutable.persistentListOf
3031
import kotlinx.coroutines.launch
@@ -40,6 +41,7 @@ fun TabbedScreen(
4041
searchQuery: String? = null,
4142
onChangeSearchQuery: (String?) -> Unit = {},
4243
// KMK -->
44+
feedScreenModel: FeedScreenModel,
4345
bulkFavoriteScreenModel: BulkFavoriteScreenModel,
4446
// KMK <--
4547
) {
@@ -48,6 +50,7 @@ fun TabbedScreen(
4850
val snackbarHostState = remember { SnackbarHostState() }
4951

5052
// KMK -->
53+
val feedState by feedScreenModel.state.collectAsState()
5154
val bulkFavoriteState by bulkFavoriteScreenModel.state.collectAsState()
5255
// KMK <--
5356

@@ -67,6 +70,14 @@ fun TabbedScreen(
6770
selectedCount = bulkFavoriteState.selection.size,
6871
onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode,
6972
onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite,
73+
onSelectAll = {
74+
feedState.items?.forEach {
75+
it.results?.forEach { manga ->
76+
if (!bulkFavoriteState.selection.contains(manga))
77+
bulkFavoriteScreenModel.select(manga)
78+
}
79+
}
80+
},
7081
)
7182
} else {
7283
// KMK <--

app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import eu.kanade.presentation.util.Tab
2121
import eu.kanade.tachiyomi.R
2222
import eu.kanade.tachiyomi.ui.browse.extension.ExtensionsScreenModel
2323
import eu.kanade.tachiyomi.ui.browse.extension.extensionsTab
24+
import eu.kanade.tachiyomi.ui.browse.feed.FeedScreenModel
2425
import eu.kanade.tachiyomi.ui.browse.feed.feedTab
2526
import eu.kanade.tachiyomi.ui.browse.migration.sources.migrateSourceTab
2627
import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchScreen
@@ -66,6 +67,7 @@ data class BrowseTab(
6667
val extensionsState by extensionsScreenModel.state.collectAsState()
6768

6869
// KMK -->
70+
val feedScreenModel = rememberScreenModel { FeedScreenModel() }
6971
val bulkFavoriteScreenModel = rememberScreenModel { BulkFavoriteScreenModel() }
7072
// KMK <--
7173

@@ -80,15 +82,15 @@ data class BrowseTab(
8082
)
8183
} else if (feedTabInFront) {
8284
persistentListOf(
83-
feedTab(bulkFavoriteScreenModel),
85+
feedTab(/* KMK --> */feedScreenModel, bulkFavoriteScreenModel/* KMK <-- */),
8486
sourcesTab(),
8587
extensionsTab(extensionsScreenModel),
8688
migrateSourceTab(),
8789
)
8890
} else {
8991
persistentListOf(
9092
sourcesTab(),
91-
feedTab(bulkFavoriteScreenModel),
93+
feedTab(/* KMK --> */feedScreenModel, bulkFavoriteScreenModel/* KMK <-- */),
9294
extensionsTab(extensionsScreenModel),
9395
migrateSourceTab(),
9496
)
@@ -98,6 +100,7 @@ data class BrowseTab(
98100
searchQuery = extensionsState.searchQuery,
99101
onChangeSearchQuery = extensionsScreenModel::search,
100102
// KMK -->
103+
feedScreenModel = feedScreenModel,
101104
bulkFavoriteScreenModel = bulkFavoriteScreenModel,
102105
// KMK <--
103106
)

app/src/main/java/eu/kanade/tachiyomi/ui/browse/feed/FeedTab.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import androidx.compose.runtime.LaunchedEffect
99
import androidx.compose.runtime.collectAsState
1010
import androidx.compose.runtime.getValue
1111
import androidx.compose.ui.platform.LocalHapticFeedback
12-
import cafe.adriel.voyager.core.model.rememberScreenModel
13-
import cafe.adriel.voyager.core.screen.Screen
1412
import cafe.adriel.voyager.core.stack.StackEvent
1513
import cafe.adriel.voyager.navigator.LocalNavigator
1614
import cafe.adriel.voyager.navigator.currentOrThrow
@@ -39,13 +37,13 @@ import tachiyomi.i18n.sy.SYMR
3937
import tachiyomi.presentation.core.i18n.stringResource
4038

4139
@Composable
42-
fun Screen.feedTab(
40+
fun feedTab(
4341
// KMK -->
42+
screenModel: FeedScreenModel,
4443
bulkFavoriteScreenModel: BulkFavoriteScreenModel,
4544
// KMK <--
4645
): TabContent {
4746
val navigator = LocalNavigator.currentOrThrow
48-
val screenModel = rememberScreenModel { FeedScreenModel() }
4947
val state by screenModel.state.collectAsState()
5048

5149
// KMK -->

app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ data class SourceSearchScreen(
7575
selectedCount = bulkFavoriteState.selection.size,
7676
onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode,
7777
onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite,
78+
onSelectAll = {
79+
state.mangaDisplayingList.forEach { manga ->
80+
if (!bulkFavoriteState.selection.contains(manga))
81+
bulkFavoriteScreenModel.select(manga)
82+
}
83+
},
7884
)
7985
} else {
8086
// KMK <--
@@ -150,6 +156,7 @@ data class SourceSearchScreen(
150156
onMangaLongClick = { navigator.push(MangaScreen(it.id, true)) },
151157
// KMK -->
152158
selection = bulkFavoriteState.selection,
159+
browseSourceState = state,
153160
// KMK <--
154161
)
155162
}

app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,12 @@ data class BrowseSourceScreen(
171171
selectedCount = bulkFavoriteState.selection.size,
172172
onClickClearSelection = bulkFavoriteScreenModel::toggleSelectionMode,
173173
onChangeCategoryClicked = bulkFavoriteScreenModel::addFavorite,
174+
onSelectAll = {
175+
state.mangaDisplayingList.forEach { manga ->
176+
if (!bulkFavoriteState.selection.contains(manga))
177+
bulkFavoriteScreenModel.select(manga)
178+
}
179+
},
174180
)
175181
} else {
176182
// KMK <--
@@ -317,6 +323,7 @@ data class BrowseSourceScreen(
317323
},
318324
// KMK -->
319325
selection = bulkFavoriteState.selection,
326+
browseSourceState = state,
320327
// KMK <--
321328
)
322329
}

app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,9 @@ open class BrowseSourceScreenModel(
473473
val savedSearches: ImmutableList<EXHSavedSearch> = persistentListOf(),
474474
val filterable: Boolean = true,
475475
// SY <--
476+
// KMK -->
477+
val mangaDisplayingList: MutableSet<Manga> = emptySet<Manga>().toMutableSet()
478+
// KMK <--
476479
) {
477480
val isUserQuery get() = listing is Listing.Search && !listing.query.isNullOrEmpty()
478481
}

0 commit comments

Comments
 (0)