From 18d45aa1a3a7b543481a1f1f804d66369691351d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 19 Jul 2022 10:29:39 +0300 Subject: [PATCH] Chapters range selection --- .../kotatsu/details/ui/ChaptersFragment.kt | 36 +++++++++++++++++-- app/src/main/res/drawable/ic_select_range.xml | 15 ++++++++ app/src/main/res/menu/mode_chapters.xml | 6 ++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_select_range.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 04e79d18d..9f1ad93e9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -135,6 +135,26 @@ class ChaptersFragment : mode.finish() true } + R.id.action_select_range -> { + val controller = selectionController ?: return false + val items = chaptersAdapter?.items ?: return false + val ids = HashSet(controller.peekCheckedIds()) + val buffer = HashSet() + var isAdding = false + for (x in items) { + if (x.chapter.id in ids) { + isAdding = true + if (buffer.isNotEmpty()) { + ids.addAll(buffer) + buffer.clear() + } + } else if (isAdding) { + buffer.add(x.chapter.id) + } + } + controller.addAll(ids) + true + } R.id.action_select_all -> { val ids = chaptersAdapter?.items?.map { it.chapter.id } ?: return false selectionController?.addAll(ids) @@ -158,14 +178,24 @@ class ChaptersFragment : override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { val selectedIds = selectionController?.peekCheckedIds() ?: return false - val items = chaptersAdapter?.items?.filter { x -> x.chapter.id in selectedIds }.orEmpty() - menu.findItem(R.id.action_save).isVisible = items.none { x -> + val allItems = chaptersAdapter?.items.orEmpty() + val items = allItems.withIndex().filter { (_, x) -> x.chapter.id in selectedIds } + menu.findItem(R.id.action_save).isVisible = items.none { (_, x) -> x.chapter.source == MangaSource.LOCAL } - menu.findItem(R.id.action_delete).isVisible = items.all { x -> + menu.findItem(R.id.action_delete).isVisible = items.all { (_, x) -> x.chapter.source == MangaSource.LOCAL } + menu.findItem(R.id.action_select_all).isVisible = items.size < allItems.size mode.title = items.size.toString() + var hasGap = false + for (i in 0 until items.size - 1) { + if (items[i].index + 1 != items[i + 1].index) { + hasGap = true + break + } + } + menu.findItem(R.id.action_select_range).isVisible = hasGap return true } diff --git a/app/src/main/res/drawable/ic_select_range.xml b/app/src/main/res/drawable/ic_select_range.xml new file mode 100644 index 000000000..617fdc0cb --- /dev/null +++ b/app/src/main/res/drawable/ic_select_range.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/menu/mode_chapters.xml b/app/src/main/res/menu/mode_chapters.xml index 8e3d52bab..6b5169c05 100644 --- a/app/src/main/res/menu/mode_chapters.xml +++ b/app/src/main/res/menu/mode_chapters.xml @@ -15,6 +15,12 @@ android:title="@string/delete" app:showAsAction="ifRoom|withText" /> + + Can help in case of some issues. All authorizations will be invalidated Show all Invalid domain + Select range \ No newline at end of file