diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt index d58900d09..acd54556f 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt @@ -12,24 +12,21 @@ import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ActivityTxtTocRuleBinding import io.legado.app.databinding.DialogEditTextBinding -import io.legado.app.databinding.DialogTocRegexEditBinding import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.SelectActionBar import io.legado.app.ui.widget.recycler.DragSelectTouchHelper 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.setEdgeEffectColor -import io.legado.app.utils.splitNotBlank -import io.legado.app.utils.toastOnUi +import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.launch class TxtTocRuleActivity : VMBaseActivity(), TxtTocRuleAdapter.CallBack, - SelectActionBar.CallBack { + SelectActionBar.CallBack, + TxtTocRuleEditDialog.Callback { override val viewModel: TxtTocRuleViewModel by viewModels() override val binding: ActivityTxtTocRuleBinding by viewBinding(ActivityTxtTocRuleBinding::inflate) @@ -80,7 +77,7 @@ class TxtTocRuleActivity : VMBaseActivity edit(TxtTocRule()) + R.id.menu_add -> showDialogFragment(TxtTocRuleEditDialog()) R.id.menu_default -> viewModel.importDefault() R.id.menu_import -> showImportDialog() } @@ -98,24 +95,7 @@ class TxtTocRuleActivity : VMBaseActivity editRule() + R.id.menu_add -> showDialogFragment(TxtTocRuleEditDialog()) R.id.menu_default -> viewModel.importDefault() R.id.menu_import -> showImportDialog() R.id.menu_split_long_chapter -> { @@ -128,6 +128,10 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), return false } + override fun saveTxtTocRule(txtTocRule: TxtTocRule) { + viewModel.save(txtTocRule) + } + @SuppressLint("InflateParams") private fun showImportDialog() { val aCache = ACache.get(cacheDir = false) @@ -164,29 +168,6 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), } } - @SuppressLint("InflateParams") - private fun editRule(rule: TxtTocRule? = null) { - val tocRule = rule?.copy() ?: TxtTocRule() - requireContext().alert(titleResource = R.string.txt_toc_regex) { - val alertBinding = DialogTocRegexEditBinding.inflate(layoutInflater) - alertBinding.apply { - tvRuleName.setText(tocRule.name) - tvRuleRegex.setText(tocRule.rule) - tvRuleExample.setText(tocRule.example) - } - customView { alertBinding.root } - okButton { - alertBinding.apply { - tocRule.name = tvRuleName.text.toString() - tocRule.rule = tvRuleRegex.text.toString() - tocRule.example = tvRuleExample.text.toString() - viewModel.save(tocRule) - } - } - cancelButton() - } - } - inner class TocRegexAdapter(context: Context) : RecyclerAdapter(context), ItemTouchCallback.Callback { @@ -233,7 +214,7 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), } } ivEdit.setOnClickListener { - editRule(getItem(holder.layoutPosition)) + showDialogFragment(TxtTocRuleEditDialog(getItem(holder.layoutPosition)?.id)) } ivDelete.setOnClickListener { getItem(holder.layoutPosition)?.let { item -> diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleEditDialog.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleEditDialog.kt new file mode 100644 index 000000000..c6506c456 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleEditDialog.kt @@ -0,0 +1,108 @@ +package io.legado.app.ui.book.toc.rule + +import android.app.Application +import android.os.Bundle +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.viewModels +import io.legado.app.R +import io.legado.app.base.BaseDialogFragment +import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb +import io.legado.app.data.entities.TxtTocRule +import io.legado.app.databinding.DialogTocRegexEditBinding +import io.legado.app.lib.theme.primaryColor +import io.legado.app.utils.GSON +import io.legado.app.utils.applyTint +import io.legado.app.utils.sendToClip +import io.legado.app.utils.setLayout +import io.legado.app.utils.viewbindingdelegate.viewBinding + +class TxtTocRuleEditDialog() : BaseDialogFragment(R.layout.dialog_toc_regex_edit, true), + Toolbar.OnMenuItemClickListener { + + constructor(id: Long?) : this() { + id ?: return + arguments = Bundle().apply { + putLong("id", id) + } + } + + private val binding by viewBinding(DialogTocRegexEditBinding::bind) + private val viewModel by viewModels() + private val callback get() = (parentFragment as? Callback) ?: activity as? Callback + + override fun onStart() { + super.onStart() + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + binding.toolBar.setBackgroundColor(primaryColor) + initMenu() + viewModel.initData(arguments?.getLong("id")) { + binding.tvRuleName.setText(it?.name) + binding.tvRuleRegex.setText(it?.rule) + binding.tvRuleExample.setText(it?.example) + } + } + + private fun initMenu() { + binding.toolBar.inflateMenu(R.menu.txt_toc_rule_edit) + binding.toolBar.menu.applyTint(requireContext()) + binding.toolBar.setOnMenuItemClickListener(this) + } + + override fun onMenuItemClick(item: MenuItem?): Boolean { + when (item?.itemId) { + R.id.menu_save -> { + callback?.saveTxtTocRule(getRuleFromView()) + dismissAllowingStateLoss() + } + R.id.menu_copy_rule -> context?.sendToClip(GSON.toJson(getRuleFromView())) + R.id.menu_paste_rule -> {} + } + return true + } + + private fun getRuleFromView(): TxtTocRule { + val tocRule = viewModel.tocRule ?: TxtTocRule().apply { + viewModel.tocRule = this + } + binding.run { + tocRule.name = tvRuleName.text.toString() + tocRule.rule = tvRuleRegex.text.toString() + tocRule.example = tvRuleExample.text.toString() + } + return tocRule + } + + class ViewModel(application: Application) : BaseViewModel(application) { + + var tocRule: TxtTocRule? = null + + fun initData(id: Long?, finally: (tocRule: TxtTocRule?) -> Unit) { + execute { + tocRule?.let { + return@execute + } + if (id == null) { + return@execute + } + tocRule = appDb.txtTocRuleDao.get(id) + }.onFinally { + finally.invoke(tocRule) + } + } + + } + + interface Callback { + + fun saveTxtTocRule(txtTocRule: TxtTocRule) + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_toc_regex_edit.xml b/app/src/main/res/layout/dialog_toc_regex_edit.xml index 78b83be76..865b1fd24 100644 --- a/app/src/main/res/layout/dialog_toc_regex_edit.xml +++ b/app/src/main/res/layout/dialog_toc_regex_edit.xml @@ -1,50 +1,85 @@ - + android:padding="16dp"> - + android:layout_gravity="center" + android:background="@drawable/shape_card_view" + android:orientation="vertical" + tools:ignore="UselessParent"> - + android:background="@color/background_menu" + android:elevation="5dp" + android:theme="?attr/actionBarStyle" + app:displayHomeAsUp="false" + app:fitStatusBar="false" + app:popupTheme="@style/AppTheme.PopupOverlay" + app:title="@string/txt_toc_regex" + app:titleTextAppearance="@style/ToolbarTitle" /> - - - - - + android:overScrollMode="ifContentScrolls"> - + - + - + + + + + + + + + + + + + + + + + + + - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/menu/txt_toc_rule_edit.xml b/app/src/main/res/menu/txt_toc_rule_edit.xml new file mode 100644 index 000000000..067e67d26 --- /dev/null +++ b/app/src/main/res/menu/txt_toc_rule_edit.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file