From b73ae950ad296206acefbb30e8cb310f9ef1d9ae Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 5 Dec 2019 21:50:36 -0800 Subject: [PATCH] Implement long hold selection for Manga Chapters and library Co-Authored-By: zhuoyang --- .../ui/library/LibraryCategoryView.kt | 28 ++++++++++++++++++- .../ui/manga/chapter/ChaptersController.kt | 24 +++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt index c8a51dbcdc..96c9e9d7c1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt @@ -63,6 +63,8 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att private var lastTouchUpY = 0f + private var lastClickPosition = -1 + fun onCreate(controller: LibraryController) { this.controller = controller @@ -188,6 +190,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att } is LibrarySelectionEvent.Unselected -> { findAndToggleSelection(event.manga) + if (adapter.indexOf(event.manga) != -1) lastClickPosition = -1 if (controller.selectedMangas.isEmpty()) { adapter.mode = SelectableAdapter.Mode.SINGLE } @@ -195,6 +198,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att is LibrarySelectionEvent.Cleared -> { adapter.mode = SelectableAdapter.Mode.SINGLE adapter.clearSelection() + lastClickPosition = -1 } } } @@ -222,6 +226,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att // If the action mode is created and the position is valid, toggle the selection. val item = adapter.getItem(position) ?: return false if (adapter.mode == SelectableAdapter.Mode.MULTI) { + lastClickPosition = position toggleSelection(position) return true } else { @@ -244,7 +249,15 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att */ override fun onItemLongClick(position: Int) { controller.createActionModeIfNeeded() - toggleSelection(position) + when { + lastClickPosition == -1 -> setSelection(position) + lastClickPosition > position -> for (i in position until lastClickPosition) + setSelection(i) + lastClickPosition < position -> for (i in lastClickPosition + 1..position) + setSelection(i) + else -> setSelection(position) + } + lastClickPosition = position } /** @@ -268,4 +281,17 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att controller.invalidateActionMode() } + + /** + * Tells the presenter to set the selection for the given position. + * + * @param position the position to toggle. + */ + private fun setSelection(position: Int) { + val item = adapter.getItem(position) ?: return + + controller.setSelection(item.manga, true) + controller.invalidateActionMode() + } + } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt index 7232cdda9d..fedd3f11d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt @@ -70,6 +70,8 @@ class ChaptersController() : NucleusController(), */ private val selectedItems = mutableSetOf() + private var lastClickPosition = -1 + init { setHasOptionsMenu(true) setOptionsMenuHidden(true) @@ -294,6 +296,7 @@ class ChaptersController() : NucleusController(), val adapter = adapter ?: return false val item = adapter.getItem(position) ?: return false if (actionMode != null && adapter.mode == SelectableAdapter.Mode.MULTI) { + lastClickPosition = position toggleSelection(position) return true } else { @@ -304,7 +307,15 @@ class ChaptersController() : NucleusController(), override fun onItemLongClick(position: Int) { createActionModeIfNeeded() - toggleSelection(position) + when { + lastClickPosition == -1 -> setSelection(position) + lastClickPosition > position -> for (i in position until lastClickPosition) + setSelection(i) + lastClickPosition < position -> for (i in lastClickPosition + 1..position) + setSelection(i) + else -> setSelection(position) + } + lastClickPosition = position } // SELECTIONS & ACTION MODE @@ -321,6 +332,16 @@ class ChaptersController() : NucleusController(), actionMode?.invalidate() } + private fun setSelection(position: Int) { + val adapter = adapter ?: return + val item = adapter.getItem(position) ?: return + if (!adapter.isSelected(position)) { + adapter.toggleSelection(position) + selectedItems.add(item) + actionMode?.invalidate() + } + } + private fun getSelectedChapters(): List { val adapter = adapter ?: return emptyList() return adapter.selectedPositions.mapNotNull { adapter.getItem(it) } @@ -333,6 +354,7 @@ class ChaptersController() : NucleusController(), } private fun destroyActionModeIfNeeded() { + lastClickPosition = -1 actionMode?.finish() }