diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index 6ced5ce6f..517b7be7f 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -206,4 +206,5 @@ object PreferKey { const val labelVisibilityMode = "labelVisibilityMode" const val menuAlpha = "menuAlpha" const val colorImage = "colorImage" + const val bookshelfRefreshingLimit = "bookshelfRefreshingLimit" } diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index 2375df320..40a67966a 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -831,5 +831,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { set(value) { appCtx.putPrefString(PreferKey.readSliderMode, value) } + + var bookshelfRefreshingLimit: Int + get() = appCtx.getPrefInt(PreferKey.bookshelfRefreshingLimit, 0) + set(value) { + appCtx.putPrefInt(PreferKey.bookshelfRefreshingLimit, value) + } } diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BookshelfConfigBottomSheet.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BookshelfConfigBottomSheet.kt index d75debb6c..90b928a13 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BookshelfConfigBottomSheet.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BookshelfConfigBottomSheet.kt @@ -11,6 +11,7 @@ import io.legato.kazusa.constant.EventBus import io.legato.kazusa.databinding.DialogBookshelfConfigBinding import io.legato.kazusa.help.config.AppConfig import io.legato.kazusa.ui.main.MainViewModel +import io.legato.kazusa.ui.widget.number.NumberPickerDialog import io.legato.kazusa.utils.bookshelfLayoutGrid import io.legato.kazusa.utils.postEvent import io.legato.kazusa.utils.viewbindingdelegate.viewBinding @@ -38,7 +39,6 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog val columnCount = requireContext().bookshelfLayoutGrid.takeIf { it > 0 } ?: 1 - val bookshelfSort = AppConfig.bookshelfSort binding.apply { @@ -79,8 +79,22 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog chipGrid.isChecked = isGrid chipGridCompact.isChecked = isGridCompact chipGridCover.isChecked = isGridCover - sliderGridCount.value = columnCount.toFloat() + sliderGridCount.progress = columnCount + binding.tvValue.text = if (AppConfig.bookshelfRefreshingLimit <= 0) "无限制" + else "${AppConfig.bookshelfRefreshingLimit} 本" + + binding.layoutRefreshLimit.setOnClickListener { + NumberPickerDialog(requireContext()) + .setTitle("书架更新数量限制") + .setMinValue(0) // 0 表示无限制 + .setMaxValue(500) // 可根据需求设定最大值 + .setValue(AppConfig.bookshelfRefreshingLimit) + .show { selected -> + AppConfig.bookshelfRefreshingLimit = selected + tvValue.text = if (selected <= 0) "无限制" else "$selected 本" + } + } when (AppConfig.bookshelfSortOrder) { 0 -> binding.chipGroupOrder.check(binding.chipAsc.id) @@ -120,7 +134,7 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog (requireParentFragment() as? BaseBookshelfFragment)?.upSort() } - val selectedColumn = sliderGridCount.value.toInt() + val selectedColumn = sliderGridCount.progress val newLayout = when { chipList.isChecked -> 0 chipGrid.isChecked -> 1 diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BooksFragment.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BooksFragment.kt index 237ca9954..d6d07baa4 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BooksFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BooksFragment.kt @@ -129,8 +129,14 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), upFastScrollerBar() //binding.refreshLayout.setColorSchemeColors(accentColor) binding.refreshLayout.setOnRefreshListener { + val books = booksAdapter.getItems() + val refreshList = if (AppConfig.bookshelfRefreshingLimit > 0) { + books.take(AppConfig.bookshelfRefreshingLimit) + } else { + books + } binding.refreshLayout.isRefreshing = false - activityViewModel.upToc(booksAdapter.getItems()) + activityViewModel.upToc(refreshList) } binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayoutGrid) binding.rvBookshelf.setRecycledViewPool(activityViewModel.booksGridRecycledViewPool) diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BookshelfFragment2.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BookshelfFragment2.kt index dd232f58f..a7630d505 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BookshelfFragment2.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/books/BookshelfFragment2.kt @@ -121,10 +121,21 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2) initBooksData() } + @Suppress("UNCHECKED_CAST") + fun BaseBooksAdapter<*>.getBookItems(): List { + return getItems() as List + } + private fun initRecyclerView() { binding.refreshLayout.setOnRefreshListener { + val books = booksAdapter.getBookItems() + val refreshList = if (AppConfig.bookshelfRefreshingLimit > 0) { + books.take(AppConfig.bookshelfRefreshingLimit) + } else { + books + } binding.refreshLayout.isRefreshing = false - activityViewModel.upToc(books) + activityViewModel.upToc(refreshList) } binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayoutGrid) diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt index 36934bc63..443deb020 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt @@ -61,6 +61,7 @@ class DetailSeekBar @JvmOverloads constructor( TooltipCompat.setTooltipText(this, title) } + binding.slider.valueFrom = typedArray.getInteger(R.styleable.DetailSeekBar_min, 0).toFloat() binding.slider.valueTo = typedArray.getInteger(R.styleable.DetailSeekBar_max, 0).toFloat() typedArray.recycle() diff --git a/app/src/main/res/layout/dialog_bookshelf_config.xml b/app/src/main/res/layout/dialog_bookshelf_config.xml index b4ca2b8a4..b739a5e7f 100644 --- a/app/src/main/res/layout/dialog_bookshelf_config.xml +++ b/app/src/main/res/layout/dialog_bookshelf_config.xml @@ -47,30 +47,48 @@ android:id="@+id/sw_show_unread" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/show_unread" - tools:ignore="TouchTargetSizeCheck" /> + android:text="@string/show_unread" /> + android:text="@string/show_last_update_time" /> + android:text="@string/show_wait_up_count" /> + android:text="@string/show_bookshelf_fast_scroller" /> + + + + + + - - - + app:max="9" + app:min="1"/> + android:clickable="true" + app:chipIcon="@drawable/ic_arrow_up" /> + android:clickable="true" + app:chipIcon="@drawable/ic_arrow_down" /> + diff --git a/app/src/main/res/layout/view_detail_seek_bar.xml b/app/src/main/res/layout/view_detail_seek_bar.xml index 597c2b273..b6509de9f 100644 --- a/app/src/main/res/layout/view_detail_seek_bar.xml +++ b/app/src/main/res/layout/view_detail_seek_bar.xml @@ -4,7 +4,6 @@ android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - android:layout_marginVertical="8dp" android:orientation="vertical"> + android:paddingVertical="4dp"> 长按保存图片 长按设置为全局默认模式 滑动条显示样式 + 书架更新数量限制 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67cb8fa3c..9d7e2a76c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1305,4 +1305,5 @@ 长按保存图片 长按设置为全局默认模式 滑动条显示样式 + 书架更新数量限制