HapeLee 1 год назад
Родитель
Сommit
339570d12a

+ 1 - 0
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"
 }

+ 6 - 0
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)
+        }
 }
 

+ 18 - 4
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

+ 7 - 1
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)

+ 12 - 1
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<Book> {
+        return getItems() as List<Book>
+    }
+
     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)

+ 1 - 0
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()
 

+ 37 - 26
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" />
 
             <com.google.android.material.materialswitch.MaterialSwitch
                 android:id="@+id/sw_show_last_update_time"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/show_last_update_time"
-                tools:ignore="TouchTargetSizeCheck" />
+                android:text="@string/show_last_update_time" />
 
             <com.google.android.material.materialswitch.MaterialSwitch
                 android:id="@+id/sw_show_wait_up_books"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/show_wait_up_count"
-                tools:ignore="TouchTargetSizeCheck" />
+                android:text="@string/show_wait_up_count" />
 
             <com.google.android.material.materialswitch.MaterialSwitch
                 android:id="@+id/sw_show_bookshelf_fast_scroller"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/show_bookshelf_fast_scroller"
-                tools:ignore="TouchTargetSizeCheck" />
+                android:text="@string/show_bookshelf_fast_scroller" />
 
+            <LinearLayout
+                android:id="@+id/layout_refresh_limit"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingHorizontal="2dp"
+                android:orientation="horizontal"
+                android:clickable="true"
+                android:background="?attr/selectableItemBackground">
+
+                <TextView
+                    android:id="@+id/tv_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:paddingVertical="16dp"
+                    android:text="@string/bookshelf_update_limit" />
+
+                <TextView
+                    android:id="@+id/tv_value"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+            </LinearLayout>
 
             <TextView
                 android:layout_width="match_parent"
@@ -142,24 +160,14 @@
                     android:text="@string/cover_grid" />
             </com.google.android.material.chip.ChipGroup>
 
-            <TextView
-                android:id="@+id/slider_text"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="8dp"
-                android:text="@string/number_rows_columns"
-                android:textSize="14sp"
-                android:textStyle="bold" />
-
-            <com.google.android.material.slider.Slider
+            <io.legato.kazusa.ui.widget.DetailSeekBar
                 android:id="@+id/slider_grid_count"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingVertical="8dp"
+                app:title="@string/number_rows_columns"
                 android:stepSize="1"
-                android:value="3"
-                android:valueFrom="1"
-                android:valueTo="9" />
+                app:max="9"
+                app:min="1"/>
 
             <LinearLayout
                 android:layout_width="match_parent"
@@ -188,17 +196,20 @@
 
                     <com.google.android.material.chip.Chip
                         android:id="@+id/chip_asc"
-                        android:layout_width="wrap_content"
+                        android:layout_width="34dp"
                         android:layout_height="wrap_content"
                         android:checkable="true"
-                        android:text="@string/ascending_order" />
+                        android:clickable="true"
+                        app:chipIcon="@drawable/ic_arrow_up" />
 
                     <com.google.android.material.chip.Chip
                         android:id="@+id/chip_desc"
-                        android:layout_width="wrap_content"
+                        android:layout_width="34dp"
                         android:layout_height="wrap_content"
                         android:checkable="true"
-                        android:text="@string/descending_order" />
+                        android:clickable="true"
+                        app:chipIcon="@drawable/ic_arrow_down" />
+
                 </com.google.android.material.chip.ChipGroup>
             </LinearLayout>
 

+ 1 - 4
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">
 
     <LinearLayout
@@ -12,9 +11,7 @@
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:gravity="center_vertical"
-
-        android:paddingTop="8dp"
-        android:paddingBottom="4dp">
+        android:paddingVertical="4dp">
 
         <TextView
             android:id="@+id/tv_seek_title"

+ 1 - 0
app/src/main/res/values-zh/strings.xml

@@ -1304,4 +1304,5 @@
     <string name="manga_long_click">长按保存图片</string>
     <string name="read_type_long">长按设置为全局默认模式</string>
     <string name="read_slider_mode">滑动条显示样式</string>
+    <string name="bookshelf_update_limit">书架更新数量限制</string>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1305,4 +1305,5 @@
     <string name="manga_long_click">长按保存图片</string>
     <string name="read_type_long">长按设置为全局默认模式</string>
     <string name="read_slider_mode">滑动条显示样式</string>
+    <string name="bookshelf_update_limit">书架更新数量限制</string>
 </resources>