This commit is contained in:
Horis
2025-04-30 14:58:01 +08:00
parent 5d981808bf
commit a5457661ac
20 changed files with 83 additions and 77 deletions

View File

@@ -68,7 +68,7 @@ class ChangeBookSourceAdapter(
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"name" -> tvOrigin.text = item.originName
"latest" -> tvLast.text = item.getDisplayLastChapterTitle()

View File

@@ -38,12 +38,12 @@ import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.ColorUtils
import io.legado.app.utils.StartActivityContract
import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare
import io.legado.app.utils.dpToPx
import io.legado.app.utils.getCompatDrawable
import io.legado.app.utils.observeEvent
import io.legado.app.utils.setLayout
import io.legado.app.utils.startActivity
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.delay
@@ -407,14 +407,12 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_
*/
private fun upGroupMenu() {
binding.toolBar.menu.findItem(R.id.menu_group)?.run {
subMenu?.let { menu ->
subMenu?.transaction { menu ->
val selectedGroup = AppConfig.searchGroup
menu.removeGroup(R.id.source_group)
val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
var hasSelectedGroup = false
groups.sortedWith { o1, o2 ->
o1.cnCompare(o2)
}.forEach { group ->
groups.forEach { group ->
menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let {
if (group == selectedGroup) {
it.isChecked = true

View File

@@ -65,7 +65,7 @@ class ChangeChapterSourceAdapter(
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"name" -> tvOrigin.text = item.originName
"latest" -> tvLast.text = item.getDisplayLastChapterTitle()

View File

@@ -37,13 +37,13 @@ import io.legado.app.ui.book.source.manage.BookSourceActivity
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.StartActivityContract
import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare
import io.legado.app.utils.dpToPx
import io.legado.app.utils.gone
import io.legado.app.utils.observeEvent
import io.legado.app.utils.setLayout
import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers.IO
@@ -376,14 +376,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
* 更新分组菜单
*/
private fun upGroupMenu() {
binding.toolBar.menu.findItem(R.id.menu_group)?.subMenu?.let { menu ->
binding.toolBar.menu.findItem(R.id.menu_group)?.subMenu?.transaction { menu ->
val selectedGroup = AppConfig.searchGroup
menu.removeGroup(R.id.source_group)
val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
var hasSelectedGroup = false
groups.sortedWith { o1, o2 ->
o1.cnCompare(o2)
}.forEach { group ->
groups.forEach { group ->
menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let {
if (group == selectedGroup) {
it.isChecked = true

View File

@@ -44,6 +44,7 @@ import io.legado.app.utils.putPrefBoolean
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.startActivity
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers.IO
@@ -109,40 +110,42 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
}
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.removeGroup(R.id.menu_group_1)
menu.removeGroup(R.id.menu_group_2)
var hasChecked = false
val searchScopeNames = viewModel.searchScope.displayNames
if (viewModel.searchScope.isSource()) {
menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, searchScopeNames.first()).apply {
isChecked = true
hasChecked = true
}
}
val allSourceMenu =
menu.add(R.id.menu_group_2, R.id.menu_1, Menu.NONE, getString(R.string.all_source))
.apply {
if (searchScopeNames.isEmpty()) {
isChecked = true
hasChecked = true
}
}
groups?.forEach {
if (searchScopeNames.contains(it)) {
menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, it).apply {
menu.transaction {
menu.removeGroup(R.id.menu_group_1)
menu.removeGroup(R.id.menu_group_2)
var hasChecked = false
val searchScopeNames = viewModel.searchScope.displayNames
if (viewModel.searchScope.isSource()) {
menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, searchScopeNames.first()).apply {
isChecked = true
hasChecked = true
}
} else {
menu.add(R.id.menu_group_2, Menu.NONE, Menu.NONE, it)
}
val allSourceMenu =
menu.add(R.id.menu_group_2, R.id.menu_1, Menu.NONE, getString(R.string.all_source))
.apply {
if (searchScopeNames.isEmpty()) {
isChecked = true
hasChecked = true
}
}
groups?.forEach {
if (searchScopeNames.contains(it)) {
menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, it).apply {
isChecked = true
hasChecked = true
}
} else {
menu.add(R.id.menu_group_2, Menu.NONE, Menu.NONE, it)
}
}
if (!hasChecked) {
viewModel.searchScope.update("")
allSourceMenu.isChecked = true
}
menu.setGroupCheckable(R.id.menu_group_1, true, false)
menu.setGroupCheckable(R.id.menu_group_2, true, true)
}
if (!hasChecked) {
viewModel.searchScope.update("")
allSourceMenu.isChecked = true
}
menu.setGroupCheckable(R.id.menu_group_1, true, false)
menu.setGroupCheckable(R.id.menu_group_2, true, true)
return super.onMenuOpened(featureId, menu)
}

View File

@@ -67,6 +67,7 @@ import io.legado.app.utils.showHelp
import io.legado.app.utils.splitNotBlank
import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
@@ -590,7 +591,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
}
}
private fun upGroupMenu() = groupMenu?.let { menu ->
private fun upGroupMenu() = groupMenu?.transaction { menu ->
menu.removeGroup(R.id.source_group)
groups.forEach {
menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
@@ -648,7 +649,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
adapter.itemCount,
bundleOf(Pair("checkSourceMessage", null))
)
groups.map { group ->
groups.forEach { group ->
if (group.contains("失效") && searchView.query.isEmpty()) {
searchView.setQuery("失效", true)
toastOnUi("发现有失效书源,已为您自动筛选!")

View File

@@ -104,7 +104,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) :
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")
"upName" -> cbBookSource.text = item.getDisPlayNameGroup()

View File

@@ -254,7 +254,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
fun addGroup(group: String) {
execute {
val sources = appDb.bookSourceDao.noGroup
sources.map { source ->
sources.forEach { source ->
source.bookSourceGroup = group
}
appDb.bookSourceDao.update(*sources.toTypedArray())
@@ -264,7 +264,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
fun upGroup(oldGroup: String, newGroup: String?) {
execute {
val sources = appDb.bookSourceDao.getByGroup(oldGroup)
sources.map { source ->
sources.forEach { source ->
source.bookSourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
it.remove(oldGroup)
if (!newGroup.isNullOrEmpty())
@@ -280,7 +280,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
execute {
execute {
val sources = appDb.bookSourceDao.getByGroup(group)
sources.map { source ->
sources.forEach { source ->
source.removeGroup(group)
}
appDb.bookSourceDao.update(*sources.toTypedArray())

View File

@@ -86,7 +86,7 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) :
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"selected" -> cbSource.isChecked = selected.contains(item)
"upName" -> cbSource.text = item.name

View File

@@ -259,7 +259,7 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex),
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"upName" -> rbRegexName.text = item.name
"upExample" -> titleExample.text = item.example

View File

@@ -103,7 +103,7 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"selected" -> cbName.isChecked = selected.contains(item)
"upName" -> cbName.text = item.name

View File

@@ -29,10 +29,10 @@ import io.legado.app.ui.book.search.SearchScope
import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.main.MainFragmentInterface
import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare
import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.startActivity
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO
@@ -171,11 +171,9 @@ class ExploreFragment() : VMBaseFragment<ExploreViewModel>(R.layout.fragment_exp
}
}
private fun upGroupsMenu() = groupsMenu?.let { subMenu ->
private fun upGroupsMenu() = groupsMenu?.transaction { subMenu ->
subMenu.removeGroup(R.id.menu_group_text)
groups.sortedWith { o1, o2 ->
o1.cnCompare(o2)
}.forEach {
groups.forEach {
subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it)
}
}

View File

@@ -28,11 +28,11 @@ import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
import io.legado.app.ui.rss.source.manage.RssSourceActivity
import io.legado.app.ui.rss.subscription.RuleSubActivity
import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare
import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
import io.legado.app.utils.openUrl
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.startActivity
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
@@ -100,11 +100,9 @@ class RssFragment() : VMBaseFragment<RssViewModel>(R.layout.fragment_rss),
searchView.clearFocus()
}
private fun upGroupsMenu() = groupsMenu?.let { subMenu ->
private fun upGroupsMenu() = groupsMenu?.transaction { subMenu ->
subMenu.removeGroup(R.id.menu_group_text)
groups.sortedWith { o1, o2 ->
o1.cnCompare(o2)
}.forEach {
groups.forEach {
subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it)
}
}

View File

@@ -49,6 +49,7 @@ import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.showHelp
import io.legado.app.utils.splitNotBlank
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
@@ -282,10 +283,10 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
return false
}
private fun upGroupMenu() {
groupMenu?.removeGroup(R.id.replace_group)
groups.map {
groupMenu?.add(R.id.replace_group, Menu.NONE, Menu.NONE, it)
private fun upGroupMenu() = groupMenu?.transaction { menu ->
menu.removeGroup(R.id.replace_group)
groups.forEach {
menu.add(R.id.replace_group, Menu.NONE, Menu.NONE, it)
}
}

View File

@@ -111,7 +111,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"selected" -> cbName.isChecked = selected.contains(item)
"upName" -> cbName.text = item.getDisplayNameGroup()

View File

@@ -96,7 +96,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
fun addGroup(group: String) {
execute {
val sources = appDb.replaceRuleDao.noGroup
sources.map { source ->
sources.forEach { source ->
source.group = group
}
appDb.replaceRuleDao.update(*sources.toTypedArray())
@@ -106,7 +106,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
fun upGroup(oldGroup: String, newGroup: String?) {
execute {
val sources = appDb.replaceRuleDao.getByGroup(oldGroup)
sources.map { source ->
sources.forEach { source ->
source.group?.splitNotBlank(",")?.toHashSet()?.let {
it.remove(oldGroup)
if (!newGroup.isNullOrEmpty())
@@ -122,7 +122,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
execute {
execute {
val sources = appDb.replaceRuleDao.getByGroup(group)
sources.map { source ->
sources.forEach { source ->
source.group?.splitNotBlank(",")?.toHashSet()?.let {
it.remove(group)
source.group = TextUtils.join(",", it)

View File

@@ -32,7 +32,6 @@ import io.legado.app.ui.widget.recycler.ItemTouchCallback
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.ACache
import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare
import io.legado.app.utils.dpToPx
import io.legado.app.utils.hideSoftInput
import io.legado.app.utils.isAbsUrl
@@ -47,6 +46,7 @@ import io.legado.app.utils.showHelp
import io.legado.app.utils.splitNotBlank
import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.transaction
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
@@ -308,11 +308,9 @@ class RssSourceActivity : VMBaseActivity<ActivityRssSourceBinding, RssSourceView
}
}
private fun upGroupMenu() = groupMenu?.let { menu ->
private fun upGroupMenu() = groupMenu?.transaction { menu ->
menu.removeGroup(R.id.source_group)
groups.sortedWith { o1, o2 ->
o1.cnCompare(o2)
}.map {
groups.forEach {
menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
}
}

View File

@@ -81,7 +81,7 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) :
} else {
for (i in payloads.indices) {
val bundle = payloads[i] as Bundle
bundle.keySet().map {
bundle.keySet().forEach {
when (it) {
"upName" -> cbSource.text = item.getDisplayNameGroup()
"enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")

View File

@@ -113,7 +113,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
fun addGroup(group: String) {
execute {
val sources = appDb.rssSourceDao.noGroup
sources.map { source ->
sources.forEach { source ->
source.sourceGroup = group
}
appDb.rssSourceDao.update(*sources.toTypedArray())
@@ -123,7 +123,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
fun upGroup(oldGroup: String, newGroup: String?) {
execute {
val sources = appDb.rssSourceDao.getByGroup(oldGroup)
sources.map { source ->
sources.forEach { source ->
source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
it.remove(oldGroup)
if (!newGroup.isNullOrEmpty())
@@ -139,7 +139,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
execute {
execute {
val sources = appDb.rssSourceDao.getByGroup(group)
sources.map { source ->
sources.forEach { source ->
source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
it.remove(group)
source.sourceGroup = TextUtils.join(",", it)

View File

@@ -80,6 +80,17 @@ fun Menu.iconItemOnLongClick(id: Int, function: (view: View) -> Unit) {
}
}
@SuppressLint("RestrictedApi")
inline fun Menu.transaction(block: (Menu) -> Unit) {
val menuBuilder = this as? MenuBuilder
menuBuilder?.stopDispatchingItemsChanged()
try {
block(this)
} finally {
menuBuilder?.startDispatchingItemsChanged()
}
}
object MenuExtensions {
fun getMenuColor(