This commit is contained in:
Horis
2025-02-27 17:15:35 +08:00
parent 351ca63486
commit bf118ad0ea
6 changed files with 117 additions and 11 deletions
@@ -88,6 +88,10 @@ class ContentProcessor private constructor(
return contentReplaceRules
}
fun getAllReplaceRules(): List<ReplaceRule> {
return titleReplaceRules + contentReplaceRules
}
fun getContent(
book: Book,
chapter: BookChapter,
@@ -1165,7 +1165,11 @@ class ReadBookActivity : BaseReadBookActivity(),
* 替换
*/
override fun openReplaceRule() {
replaceActivity.launch(Intent(this, ReplaceRuleActivity::class.java))
val intent = Intent(this, ReplaceRuleActivity::class.java).apply {
val showApplied = ReadBook.book?.getUseReplaceRule() == true
putExtra("showApplied", showApplied)
}
replaceActivity.launch(intent)
}
/**
@@ -1,7 +1,6 @@
package io.legado.app.ui.replace
import android.annotation.SuppressLint
import android.app.Activity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
@@ -122,8 +121,10 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
initRecyclerView()
initSearchView()
initSelectActionView()
observeReplaceRuleData()
observeGroupData()
viewModel.initData(intent) {
observeReplaceRuleData()
}
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
@@ -215,6 +216,7 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
val key = searchKey.substringAfter("group:")
appDb.replaceRuleDao.flowGroupSearch("%$key%")
}
else -> {
appDb.replaceRuleDao.flowSearch("%$searchKey%")
}
@@ -222,7 +224,7 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
AppLog.put("替换规则管理界面更新数据出错", it)
}.flowOn(IO).conflate().collect {
if (dataInit) {
setResult(Activity.RESULT_OK)
setResult(RESULT_OK)
}
adapter.setItems(it, adapter.diffItemCallBack)
dataInit = true
@@ -245,6 +247,7 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
when (item.itemId) {
R.id.menu_add_replace_rule ->
editActivity.launch(ReplaceEditActivity.startIntent(this))
R.id.menu_group_manage -> showDialogFragment<GroupManageDialog>()
R.id.menu_del_selection -> viewModel.delSelection(adapter.selection)
R.id.menu_import_onLine -> showImportDialog()
@@ -252,11 +255,13 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
mode = HandleFileContract.FILE
allowExtensions = arrayOf("txt", "json")
}
R.id.menu_import_qr -> qrCodeResult.launch()
R.id.menu_help -> showHelp("replaceRuleHelp")
R.id.menu_group_null -> {
searchView.setQuery(getString(R.string.no_group), true)
}
else -> if (item.groupId == R.id.replace_group) {
searchView.setQuery("group:${item.title}", true)
}
@@ -343,6 +348,14 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
)
}
override fun isEnabledForBook(rule: ReplaceRule): Boolean {
return viewModel.isEnabledForBook(rule)
}
override fun isAppliedForBook(rule: ReplaceRule): Boolean {
return viewModel.isAppliedForBook(rule)
}
override fun update(vararg rule: ReplaceRule) {
setResult(RESULT_OK)
viewModel.update(*rule)
@@ -1,9 +1,11 @@
package io.legado.app.ui.replace
import android.content.Context
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.PopupMenu
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.DiffUtil
@@ -17,6 +19,8 @@ import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback
import io.legado.app.utils.ColorUtils
import io.legado.app.utils.invisible
import io.legado.app.utils.visible
class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
@@ -120,6 +124,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
}
}
}
upShowApplied(ivApplied, item)
}
}
@@ -172,6 +177,23 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
popupMenu.show()
}
private fun upShowApplied(iv: ImageView, rule: ReplaceRule) {
val isEnabledForBook = callBack.isEnabledForBook(rule)
val isAppliedForBook = callBack.isAppliedForBook(rule)
if (!isEnabledForBook && !isAppliedForBook) {
iv.invisible()
} else {
iv.visible()
}
if (isEnabledForBook) {
iv.setColorFilter(Color.RED)
}
if (isAppliedForBook) {
iv.setColorFilter(Color.GREEN)
}
}
override fun swap(srcPosition: Int, targetPosition: Int): Boolean {
val srcItem = getItem(srcPosition)
val targetItem = getItem(targetPosition)
@@ -232,5 +254,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
fun toBottom(rule: ReplaceRule)
fun upOrder()
fun upCountView()
fun isEnabledForBook(rule: ReplaceRule): Boolean
fun isAppliedForBook(rule: ReplaceRule): Boolean
}
}
@@ -1,10 +1,13 @@
package io.legado.app.ui.replace
import android.app.Application
import android.content.Intent
import android.text.TextUtils
import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb
import io.legado.app.data.entities.ReplaceRule
import io.legado.app.help.book.ContentProcessor
import io.legado.app.model.ReadBook
import io.legado.app.utils.splitNotBlank
/**
@@ -13,6 +16,34 @@ import io.legado.app.utils.splitNotBlank
*/
class ReplaceRuleViewModel(application: Application) : BaseViewModel(application) {
var showApplied = false
var enabledForBookRules = emptySet<ReplaceRule>()
var appliedForBookRules = emptySet<ReplaceRule>()
fun initData(intent: Intent, block: () -> Unit) {
execute {
showApplied = intent.getBooleanExtra("showApplied", false)
if (showApplied) {
val book = ReadBook.book ?: return@execute
val textChapter = ReadBook.curTextChapter ?: return@execute
enabledForBookRules = ContentProcessor.get(book).getAllReplaceRules().toSet()
textChapter.effectiveReplaceRules?.let {
appliedForBookRules = it.toSet()
}
}
}.onFinally {
block.invoke()
}
}
fun isEnabledForBook(rule: ReplaceRule): Boolean {
return showApplied && enabledForBookRules.contains(rule)
}
fun isAppliedForBook(rule: ReplaceRule): Boolean {
return showApplied && appliedForBookRules.contains(rule)
}
fun update(vararg rule: ReplaceRule) {
execute {
appDb.replaceRuleDao.update(*rule)