Browse Source

Range selection in library (#8186)

* logic and a bit of cleanup

* cleanup done

* grammar fix

* fixing format

* Auto stash before checking out "HEAD"

* Revert "Auto stash before checking out "HEAD""

This reverts commit 202374a36ff444b7da3fcdb2a9859ca71a7c046e.

* Update app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt

Co-authored-by: arkon <[email protected]>

* cleanup

Co-authored-by: arkon <[email protected]>
d-najd 2 năm trước cách đây
mục cha
commit
e1adb89ff8

+ 1 - 0
app/src/main/java/eu/kanade/presentation/library/LibraryScreen.kt

@@ -96,6 +96,7 @@ fun LibraryScreen(
                     onChangeCurrentPage = { presenter.activeCategory = it },
                     onMangaClicked = onMangaClicked,
                     onToggleSelection = { presenter.toggleSelection(it) },
+                    onToggleRangeSelection = { presenter.toggleRangeSelection(it) },
                     onRefresh = onClickRefresh,
                     onGlobalSearchClicked = onGlobalSearchClicked,
                     getNumberOfMangaForCategory = { presenter.getMangaCountForCategory(it) },

+ 2 - 1
app/src/main/java/eu/kanade/presentation/library/components/LibraryContent.kt

@@ -40,6 +40,7 @@ fun LibraryContent(
     onChangeCurrentPage: (Int) -> Unit,
     onMangaClicked: (Long) -> Unit,
     onToggleSelection: (LibraryManga) -> Unit,
+    onToggleRangeSelection: (LibraryManga) -> Unit,
     onRefresh: (Category?) -> Boolean,
     onGlobalSearchClicked: () -> Unit,
     getNumberOfMangaForCategory: @Composable (Long) -> State<Int?>,
@@ -80,7 +81,7 @@ fun LibraryContent(
             }
         }
         val onLongClickManga = { manga: LibraryManga ->
-            onToggleSelection(manga)
+            onToggleRangeSelection(manga)
         }
 
         SwipeRefresh(

+ 30 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt

@@ -662,10 +662,38 @@ class LibraryPresenter(
         state.selection = emptyList()
     }
 
+    private fun removeSelected(mutableList: MutableList<LibraryManga>, manga: LibraryManga): Boolean {
+        if (selection.fastAny { it.manga.id == manga.manga.id }) {
+            return mutableList.remove(manga)
+        }
+        return false
+    }
+
     fun toggleSelection(manga: LibraryManga) {
         val mutableList = state.selection.toMutableList()
-        if (selection.fastAny { it.manga.id == manga.manga.id }) {
-            mutableList.remove(manga)
+        if (!removeSelected(mutableList, manga)) {
+            mutableList.add(manga)
+        }
+        state.selection = mutableList
+    }
+
+    /**
+     * Selects all mangas between and including the given manga and the last pressed manga from the
+     * same category as the given manga
+     */
+    fun toggleRangeSelection(manga: LibraryManga) {
+        val mutableList = state.selection.toMutableList()
+        if (!removeSelected(mutableList, manga) && mutableList.fastAny
+            { it.category == manga.category }
+        ) {
+            val items = (loadedManga[manga.category] ?: emptyList()).map { it.libraryManga }
+            val lastMangaIndex = items.indexOf(mutableList.findLast { it.category == manga.category })
+            val curMangaIndex = items.indexOf(manga)
+            val newList = when (lastMangaIndex >= curMangaIndex + 1) {
+                true -> items.subList(curMangaIndex, lastMangaIndex)
+                false -> items.subList(lastMangaIndex, curMangaIndex + 1)
+            }
+            mutableList.addAll(newList.filterNot { it in selection })
         } else {
             mutableList.add(manga)
         }