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 202374a36f.

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

Co-authored-by: arkon <arkon@users.noreply.github.com>

* cleanup

Co-authored-by: arkon <arkon@users.noreply.github.com>
This commit is contained in:
d-najd 2022-10-14 21:30:19 +02:00 committed by GitHub
parent 4e544005fe
commit e1adb89ff8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 3 deletions

View file

@ -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) },

View file

@ -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(

View file

@ -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)
}