diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 9d19ac3a0..deed02a2b 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -217,6 +217,7 @@ object PreferKey { const val disableMangaScrollAnimation = "disableMangaScrollAnimation" const val disableMangaCrossFade = "disableMangaCrossFade" - const val titleBarMode = "titleBarMode" + + const val shouldShowExpandButton = "shouldShowExpandButton" } diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 564f04e2f..9ee3fc903 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -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) + } + } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigBottomSheet.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigBottomSheet.kt index 69c89be46..ef2463123 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigBottomSheet.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfConfigBottomSheet.kt @@ -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(binding.chipGroupStyle.checkedChipId) + val isGroupStyle0 = binding.chipGroupStyle.indexOfChild(checkedStyleChip) == 0 + binding.swShowBookshelfTabMenu.isEnabled = isGroupStyle0 + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment1.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment1.kt index 3c809ee70..1884e3f0a 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment1.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment1.kt @@ -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 { diff --git a/app/src/main/res/layout/dialog_bookshelf_config.xml b/app/src/main/res/layout/dialog_bookshelf_config.xml index c863ef71e..60b7a6d1a 100644 --- a/app/src/main/res/layout/dialog_bookshelf_config.xml +++ b/app/src/main/res/layout/dialog_bookshelf_config.xml @@ -1,6 +1,5 @@ + + + android:clickable="true"> - + android:layout_height="wrap_content" + android:clickable="true" + android:minWidth="0dp" + android:minHeight="0dp" + android:paddingHorizontal="0dp" + android:paddingVertical="8dp" + style="@style/Widget.Material3Expressive.Button.OutlinedButton"/> + - + android:orientation="horizontal" + android:gravity="center_vertical" + android:paddingStart="16dp" + android:paddingEnd="10dp"> + + + + + + + + + + + + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c30156d92..ebf9227f1 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1348,4 +1348,5 @@ 是否确认开始缓存? 计数替换净化 渐变 + 显示更多分组按钮 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ff981746..f3b6c0659 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1349,4 +1349,5 @@ 是否确认开始缓存? 计数替换净化 渐变 + 显示更多分组按钮 diff --git a/app/version.properties b/app/version.properties index 3014db1fe..4b3e2d928 100644 --- a/app/version.properties +++ b/app/version.properties @@ -1,4 +1,4 @@ VERSION_MAJOR=3 VERSION_MINOR=26 VERSION_PATCH=3 -VERSION_SUFFIX=-beta.5 \ No newline at end of file +VERSION_SUFFIX=-beta.6 \ No newline at end of file