pull/1630/head
parent
55e8af89af
commit
400db881ad
@ -0,0 +1,103 @@ |
|||||||
|
package io.legado.app.ui.book.read |
||||||
|
|
||||||
|
import android.app.Application |
||||||
|
import android.os.Bundle |
||||||
|
import android.view.View |
||||||
|
import android.view.ViewGroup |
||||||
|
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.databinding.DialogContentEditBinding |
||||||
|
import io.legado.app.help.BookHelp |
||||||
|
import io.legado.app.help.ContentProcessor |
||||||
|
import io.legado.app.lib.theme.primaryColor |
||||||
|
import io.legado.app.model.ReadBook |
||||||
|
import io.legado.app.model.webBook.WebBook |
||||||
|
import io.legado.app.utils.applyTint |
||||||
|
import io.legado.app.utils.setLayout |
||||||
|
import io.legado.app.utils.viewbindingdelegate.viewBinding |
||||||
|
import kotlinx.coroutines.Dispatchers.IO |
||||||
|
import kotlinx.coroutines.launch |
||||||
|
import kotlinx.coroutines.withContext |
||||||
|
|
||||||
|
/** |
||||||
|
* 内容编辑 |
||||||
|
*/ |
||||||
|
class ContentEditDialog : BaseDialogFragment(R.layout.dialog_content_edit) { |
||||||
|
|
||||||
|
val binding by viewBinding(DialogContentEditBinding::bind) |
||||||
|
val viewModel by viewModels<ContentEditViewModel>() |
||||||
|
|
||||||
|
override fun onStart() { |
||||||
|
super.onStart() |
||||||
|
setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 0.9f) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { |
||||||
|
binding.toolBar.setBackgroundColor(primaryColor) |
||||||
|
binding.toolBar.title = ReadBook.curTextChapter?.title |
||||||
|
initMenu() |
||||||
|
viewModel.initContent { |
||||||
|
binding.contentView.setText(it) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun initMenu() { |
||||||
|
binding.toolBar.inflateMenu(R.menu.content_edit) |
||||||
|
binding.toolBar.menu.applyTint(requireContext()) |
||||||
|
binding.toolBar.setOnMenuItemClickListener { |
||||||
|
when (it.itemId) { |
||||||
|
R.id.menu_save -> launch { |
||||||
|
binding.contentView.text?.toString()?.let { content -> |
||||||
|
withContext(IO) { |
||||||
|
val book = ReadBook.book ?: return@withContext |
||||||
|
val chapter = appDb.bookChapterDao |
||||||
|
.getChapter(book.bookUrl, ReadBook.durChapterIndex) |
||||||
|
?: return@withContext |
||||||
|
BookHelp.saveText(book, chapter, content) |
||||||
|
} |
||||||
|
} |
||||||
|
ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
R.id.menu_reset -> viewModel.initContent(true) { content -> |
||||||
|
binding.contentView.setText(content) |
||||||
|
} |
||||||
|
} |
||||||
|
return@setOnMenuItemClickListener true |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ContentEditViewModel(application: Application) : BaseViewModel(application) { |
||||||
|
|
||||||
|
var content: String? = null |
||||||
|
|
||||||
|
fun initContent(reset: Boolean = false, success: (String) -> Unit) { |
||||||
|
execute { |
||||||
|
val book = ReadBook.book ?: return@execute null |
||||||
|
val chapter = appDb.bookChapterDao |
||||||
|
.getChapter(book.bookUrl, ReadBook.durChapterIndex) |
||||||
|
?: return@execute null |
||||||
|
if (reset) { |
||||||
|
content = null |
||||||
|
BookHelp.delContent(book, chapter) |
||||||
|
if (!book.isLocalBook()) ReadBook.bookSource?.let { bookSource -> |
||||||
|
WebBook.getContentAwait(this, bookSource, book, chapter) |
||||||
|
} |
||||||
|
} |
||||||
|
return@execute content ?: let { |
||||||
|
val contentProcessor = ContentProcessor.get(book.name, book.origin) |
||||||
|
val content = BookHelp.getContent(book, chapter) ?: return@let null |
||||||
|
contentProcessor.getContent(book, chapter, content, includeTitle = false) |
||||||
|
.joinToString("\n") |
||||||
|
} |
||||||
|
}.onSuccess { |
||||||
|
success.invoke(it ?: "") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||||
|
android:background="@color/background" |
||||||
|
android:orientation="vertical"> |
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar |
||||||
|
android:id="@+id/tool_bar" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:theme="?attr/actionBarStyle" |
||||||
|
app:title="code edit" |
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay" |
||||||
|
app:titleTextAppearance="@style/ToolbarTitle" /> |
||||||
|
|
||||||
|
<io.legado.app.lib.theme.view.ThemeEditText |
||||||
|
android:id="@+id/content_view" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:padding="12dp" |
||||||
|
android:textIsSelectable="true" /> |
||||||
|
|
||||||
|
</LinearLayout> |
@ -0,0 +1,18 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||||
|
xmlns:tools="http://schemas.android.com/tools" |
||||||
|
tools:ignore="AlwaysShowAction"> |
||||||
|
|
||||||
|
<item |
||||||
|
android:id="@+id/menu_save" |
||||||
|
android:icon="@drawable/ic_save" |
||||||
|
android:title="@string/action_save" |
||||||
|
app:showAsAction="always" /> |
||||||
|
|
||||||
|
<item |
||||||
|
android:id="@+id/menu_reset" |
||||||
|
android:title="@string/reset" |
||||||
|
app:showAsAction="never" /> |
||||||
|
|
||||||
|
</menu> |
Loading…
Reference in new issue