Tab快速选择

This commit is contained in:
HapeLee
2025-11-17 00:40:40 +08:00
parent 341b9c22ee
commit d4163ead56
9 changed files with 186 additions and 42 deletions
@@ -217,6 +217,7 @@ object PreferKey {
const val disableMangaScrollAnimation = "disableMangaScrollAnimation"
const val disableMangaCrossFade = "disableMangaCrossFade"
const val titleBarMode = "titleBarMode"
const val shouldShowExpandButton = "shouldShowExpandButton"
}
@@ -883,5 +883,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
set(value) {
appCtx.putPrefBoolean(PreferKey.isPredictiveBackEnabled, value)
}
var shouldShowExpandButton: Boolean
get() = appCtx.getPrefBoolean(PreferKey.shouldShowExpandButton, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.shouldShowExpandButton, value)
}
}
@@ -31,12 +31,6 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
AppConfig.bookshelfLayoutModePortrait
}
val isList = bookshelfLayout == 0
val isGrid = bookshelfLayout == 1
val isGridCompact = bookshelfLayout == 2
val isGridCover = bookshelfLayout == 3
val isListCompact = bookshelfLayout == 4
val columnCount = requireContext().bookshelfLayoutGrid.takeIf { it > 0 } ?: 1
val bookshelfSort = AppConfig.bookshelfSort
@@ -73,27 +67,36 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
swShowLastUpdateTime.isChecked = AppConfig.showLastUpdateTime
swShowWaitUpBooks.isChecked = AppConfig.showWaitUpCount
swShowBookshelfFastScroller.isChecked = AppConfig.showBookshelfFastScroller
swShowBookshelfTabMenu.isChecked = AppConfig.shouldShowExpandButton
when (bookshelfLayout) {
0 -> chipGroupLayout.check(R.id.chip_list)
1 -> chipGroupLayout.check(R.id.chip_grid)
2 -> chipGroupLayout.check(R.id.chip_grid_compact)
3 -> chipGroupLayout.check(R.id.chip_grid_cover)
4 -> chipGroupLayout.check(R.id.chip_list_compact)
}
chipList.isChecked = isList
chipListCompact.isChecked = isListCompact
chipGrid.isChecked = isGrid
chipGridCompact.isChecked = isGridCompact
chipGridCover.isChecked = isGridCover
sliderGridCount.progress = columnCount
binding.tvValue.text = if (AppConfig.bookshelfRefreshingLimit <= 0) "无限制"
else "${AppConfig.bookshelfRefreshingLimit}"
updateControlsEnableState()
chipGroupLayout.setOnCheckedStateChangeListener { group, checkedIds ->
updateControlsEnableState()
}
chipGroupStyle.setOnCheckedStateChangeListener { group, checkedIds ->
updateControlsEnableState()
}
binding.tvValue.text = if (AppConfig.bookshelfRefreshingLimit <= 0) "无限制"
else "${AppConfig.bookshelfRefreshingLimit}"
binding.tvValue.setOnClickListener {
showNumberPicker()
}
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"
}
showNumberPicker()
}
when (AppConfig.bookshelfSortOrder) {
@@ -128,19 +131,22 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
AppConfig.showBookshelfFastScroller = swShowBookshelfFastScroller.isChecked
postEvent(EventBus.BOOKSHELF_REFRESH, "")
}
if (AppConfig.shouldShowExpandButton != swShowBookshelfTabMenu.isChecked) {
AppConfig.shouldShowExpandButton = swShowBookshelfTabMenu.isChecked
postEvent(EventBus.BOOKSHELF_REFRESH, "")
}
if (bookshelfSort != chipGroupSort.checkedChipId) {
AppConfig.bookshelfSort = chipGroupSort.checkedChipId
(requireParentFragment() as? BaseBookshelfFragment)?.upSort()
}
val selectedColumn = sliderGridCount.progress
val newLayout = when {
chipList.isChecked -> 0
chipGrid.isChecked -> 1
chipGridCompact.isChecked -> 2
chipGridCover.isChecked -> 3
chipListCompact.isChecked -> 4
val newLayout = when (chipGroupLayout.checkedChipId) {
R.id.chip_list -> 0
R.id.chip_grid -> 1
R.id.chip_grid_compact -> 2
R.id.chip_grid_cover -> 3
R.id.chip_list_compact -> 4
else -> 0
}
@@ -187,4 +193,26 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
}
}
}
}
private fun showNumberPicker() {
NumberPickerDialog(requireContext())
.setTitle("书架更新数量限制")
.setMinValue(0) // 0 表示无限制
.setMaxValue(500) // 可根据需求设定最大值
.setValue(AppConfig.bookshelfRefreshingLimit)
.show { selected ->
AppConfig.bookshelfRefreshingLimit = selected
binding.tvValue.text = if (selected <= 0) "无限制" else "$selected"
}
}
private fun updateControlsEnableState() {
val checkedLayoutId = binding.chipGroupLayout.checkedChipId
val isListMode = checkedLayoutId == R.id.chip_list || checkedLayoutId == R.id.chip_list_compact
binding.swShowLastUpdateTime.isEnabled = isListMode
val checkedStyleChip = binding.chipGroupStyle.findViewById<Chip>(binding.chipGroupStyle.checkedChipId)
val isGroupStyle0 = binding.chipGroupStyle.indexOfChild(checkedStyleChip) == 0
binding.swShowBookshelfTabMenu.isEnabled = isGroupStyle0
}
}
@@ -3,9 +3,12 @@
package io.legado.app.ui.main.bookshelf.books
import android.annotation.SuppressLint
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
@@ -21,6 +24,7 @@ import io.legado.app.ui.book.group.GroupEditDialog
import io.legado.app.ui.book.search.SearchActivity
import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.themeColor
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlin.collections.set
@@ -58,6 +62,7 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1)
binding.titleBar.fitsSystemWindows = true
initView()
initBookGroupData()
setupExpandButton()
}
private val selectedGroup: BookGroup?
@@ -71,6 +76,58 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1)
TabLayoutMediator(binding.tabLayout, binding.viewPagerBookshelf) { tab, position ->
tab.text = bookGroups[position].groupName
}.attach()
updateTabFadeEffect()
}
private fun setupExpandButton() {
binding.btnExpandTabs.setOnClickListener {
showTabSelectionMenu()
}
}
private fun updateTabFadeEffect() {
binding.titleBar.addOnOffsetChangedListener({ appBarLayout, verticalOffset ->
if (-verticalOffset >= appBarLayout.totalScrollRange) {
val drawable = binding.tabRightFade.background as? GradientDrawable
drawable?.colors = intArrayOf(Color.TRANSPARENT,
requireContext().themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
} else {
val drawable = binding.tabRightFade.background as? GradientDrawable
drawable?.colors = intArrayOf(Color.TRANSPARENT,
requireContext().themeColor(com.google.android.material.R.attr.colorSurface))
}
})
}
private fun showTabSelectionMenu() {
val popup = PopupMenu(requireContext(), binding.btnExpandTabs)
bookGroups.forEachIndexed { index, bookGroup ->
popup.menu.add(0, index, index, bookGroup.groupName)
}
popup.setOnMenuItemClickListener { item ->
val position = item.itemId
if (position in bookGroups.indices) {
binding.viewPagerBookshelf.setCurrentItem(position, true)
}
true
}
popup.setOnDismissListener {
binding.btnExpandTabs.isChecked = false
}
popup.show()
}
private fun updateExpandButtonVisibility() {
binding.btnExpandTabs.visibility = if (AppConfig.shouldShowExpandButton) {
View.VISIBLE
} else {
View.GONE
}
}
override fun onQueryTextSubmit(query: String?): Boolean {
@@ -99,6 +156,8 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1)
tab.text = bookGroups[position].groupName
}.attach()
updateExpandButtonVisibility()
updateTabFadeEffect()
selectLastTab()
binding.tabLayout.post {