From a9c122b144c00b775e0d047cbb78c7cb2a3ab902 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 9 Jan 2023 16:34:18 +0200 Subject: [PATCH] Option to mark chapter as current #56 --- .../kotatsu/details/ui/ChaptersFragment.kt | 25 ++++++++++++++----- .../kotatsu/details/ui/DetailsViewModel.kt | 11 ++++++++ app/src/main/res/drawable/ic_eye_check.xml | 12 +++++++++ app/src/main/res/menu/mode_chapters.xml | 8 +++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/ic_eye_check.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 d966135ca..35e96aac7 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 @@ -1,15 +1,16 @@ package org.koitharu.kotatsu.details.ui import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import androidx.appcompat.view.ActionMode -import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels -import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.snackbar.Snackbar -import kotlin.math.roundToInt import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseFragment import org.koitharu.kotatsu.base.ui.list.ListSelectionController @@ -24,8 +25,8 @@ import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.utils.RecyclerViewScrollCallback -import org.koitharu.kotatsu.utils.ext.parents import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf +import kotlin.math.roundToInt class ChaptersFragment : BaseFragment(), @@ -102,6 +103,7 @@ class ChaptersFragment : mode.finish() true } + R.id.action_delete -> { val ids = selectionController?.peekCheckedIds() val manga = viewModel.manga.value @@ -120,6 +122,7 @@ class ChaptersFragment : mode.finish() true } + R.id.action_select_range -> { val items = chaptersAdapter?.items ?: return false val ids = HashSet(controller.peekCheckedIds()) @@ -139,11 +142,20 @@ class ChaptersFragment : controller.addAll(ids) true } + R.id.action_select_all -> { val ids = chaptersAdapter?.items?.map { it.chapter.id } ?: return false - selectionController?.addAll(ids) + controller.addAll(ids) true } + + R.id.action_mark_current -> { + val id = controller.peekCheckedIds().singleOrNull() ?: return false + viewModel.markChapterAsCurrent(id) + mode.finish() + true + } + else -> false } } @@ -164,6 +176,7 @@ class ChaptersFragment : x.chapter.source == MangaSource.LOCAL } menu.findItem(R.id.action_select_all).isVisible = items.size < allItems.size + menu.findItem(R.id.action_mark_current).isVisible = items.size == 1 mode.title = items.size.toString() var hasGap = false for (i in 0 until items.size - 1) { diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 0693690a6..a47290ad0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -281,6 +281,17 @@ class DetailsViewModel @AssistedInject constructor( } } + fun markChapterAsCurrent(chapterId: Long) { + launchJob(Dispatchers.Default) { + val manga = checkNotNull(delegate.manga.value) + val chapters = checkNotNull(manga.chapters) + val chapterIndex = chapters.indexOfFirst { it.id == chapterId } + check(chapterIndex in chapters.indices) { "Chapter not found" } + val percent = chapterIndex / chapters.size.toFloat() + historyRepository.addOrUpdate(manga = manga, chapterId = chapterId, page = 0, scroll = 0, percent = percent) + } + } + private fun doLoad() = launchLoadingJob(Dispatchers.Default) { delegate.doLoad() } diff --git a/app/src/main/res/drawable/ic_eye_check.xml b/app/src/main/res/drawable/ic_eye_check.xml new file mode 100644 index 000000000..0e603e83b --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_check.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/menu/mode_chapters.xml b/app/src/main/res/menu/mode_chapters.xml index 6b5169c05..144667c5c 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" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d0c42d0b..99e8a3d69 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -400,4 +400,5 @@ Compact Source disabled Content preloading + Mark as current