添加批量换源
This commit is contained in:
@@ -21,6 +21,7 @@ import io.legado.app.lib.dialogs.alert
|
|||||||
import io.legado.app.lib.theme.primaryColor
|
import io.legado.app.lib.theme.primaryColor
|
||||||
import io.legado.app.ui.book.group.GroupManageDialog
|
import io.legado.app.ui.book.group.GroupManageDialog
|
||||||
import io.legado.app.ui.book.group.GroupSelectDialog
|
import io.legado.app.ui.book.group.GroupSelectDialog
|
||||||
|
import io.legado.app.ui.theme.AppTheme
|
||||||
import io.legado.app.ui.widget.SelectActionBar
|
import io.legado.app.ui.widget.SelectActionBar
|
||||||
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
|
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
|
||||||
import io.legado.app.ui.widget.recycler.ItemTouchCallback
|
import io.legado.app.ui.widget.recycler.ItemTouchCallback
|
||||||
@@ -109,6 +110,11 @@ class ArrangeBookActivity : VMBaseActivity<ActivityArrangeBookBinding, ArrangeBo
|
|||||||
binding.selectActionBar.inflateMenu(R.menu.arrange_book_sel)
|
binding.selectActionBar.inflateMenu(R.menu.arrange_book_sel)
|
||||||
binding.selectActionBar.setOnMenuItemClickListener(this)
|
binding.selectActionBar.setOnMenuItemClickListener(this)
|
||||||
binding.selectActionBar.setCallBack(this)
|
binding.selectActionBar.setCallBack(this)
|
||||||
|
binding.composeView.setContent {
|
||||||
|
AppTheme {
|
||||||
|
BatchChangeSourceDialog(state = viewModel.batchChangeSourceState)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NotifyDataSetChanged")
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
@@ -232,7 +238,8 @@ class ArrangeBookActivity : VMBaseActivity<ActivityArrangeBookBinding, ArrangeBo
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun sourceOnClick(source: BookSource) {
|
override fun sourceOnClick(source: BookSource) {
|
||||||
viewModel.changeSource(adapter.selectedBooks(), source)
|
//viewModel.changeSource(adapter.selectedBooks(), source)
|
||||||
|
viewModel.batchChangeSourceState.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.legado.app.ui.book.arrange
|
package io.legado.app.ui.book.arrange
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import io.legado.app.base.BaseViewModel
|
import io.legado.app.base.BaseViewModel
|
||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.data.entities.Book
|
import io.legado.app.data.entities.Book
|
||||||
@@ -11,6 +12,8 @@ import io.legado.app.model.webBook.WebBook
|
|||||||
|
|
||||||
class ArrangeBookViewModel(application: Application) : BaseViewModel(application) {
|
class ArrangeBookViewModel(application: Application) : BaseViewModel(application) {
|
||||||
|
|
||||||
|
val batchChangeSourceState = mutableStateOf(false)
|
||||||
|
|
||||||
fun upCanUpdate(books: Array<Book>, canUpdate: Boolean) {
|
fun upCanUpdate(books: Array<Book>, canUpdate: Boolean) {
|
||||||
execute {
|
execute {
|
||||||
books.forEach {
|
books.forEach {
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package io.legado.app.ui.book.arrange
|
||||||
|
|
||||||
|
import androidx.compose.material.AlertDialog
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.TextButton
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import io.legado.app.R
|
||||||
|
import splitties.init.appCtx
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BatchChangeSourceDialog(state: MutableState<Boolean>) {
|
||||||
|
val value = remember {
|
||||||
|
mutableStateOf(0)
|
||||||
|
}
|
||||||
|
if (state.value) {
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = { },
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = {
|
||||||
|
state.value = false
|
||||||
|
}, content = {
|
||||||
|
Text(text = "取消")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
title = {
|
||||||
|
Text(text = appCtx.getString(R.string.book_change_source))
|
||||||
|
},
|
||||||
|
text = {
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ import io.legado.app.base.adapter.RecyclerAdapter
|
|||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.data.entities.BookSource
|
import io.legado.app.data.entities.BookSource
|
||||||
import io.legado.app.databinding.DialogSourcePickerBinding
|
import io.legado.app.databinding.DialogSourcePickerBinding
|
||||||
import io.legado.app.databinding.ItemTextBinding
|
import io.legado.app.databinding.Item1lineTextAndDelBinding
|
||||||
import io.legado.app.lib.theme.primaryColor
|
import io.legado.app.lib.theme.primaryColor
|
||||||
import io.legado.app.lib.theme.primaryTextColor
|
import io.legado.app.lib.theme.primaryTextColor
|
||||||
import io.legado.app.utils.applyTint
|
import io.legado.app.utils.applyTint
|
||||||
@@ -81,27 +81,28 @@ class SourcePickerDialog : BaseDialogFragment(R.layout.dialog_source_picker) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inner class SourceAdapter(context: Context) :
|
inner class SourceAdapter(context: Context) :
|
||||||
RecyclerAdapter<BookSource, ItemTextBinding>(context) {
|
RecyclerAdapter<BookSource, Item1lineTextAndDelBinding>(context) {
|
||||||
|
|
||||||
override fun getViewBinding(parent: ViewGroup): ItemTextBinding {
|
override fun getViewBinding(parent: ViewGroup): Item1lineTextAndDelBinding {
|
||||||
return ItemTextBinding.inflate(inflater, parent, false).apply {
|
return Item1lineTextAndDelBinding.inflate(inflater, parent, false).apply {
|
||||||
root.setPadding(16.dpToPx())
|
root.setPadding(16.dpToPx())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun convert(
|
override fun convert(
|
||||||
holder: ItemViewHolder,
|
holder: ItemViewHolder,
|
||||||
binding: ItemTextBinding,
|
binding: Item1lineTextAndDelBinding,
|
||||||
item: BookSource,
|
item: BookSource,
|
||||||
payloads: MutableList<Any>
|
payloads: MutableList<Any>
|
||||||
) {
|
) {
|
||||||
binding.textView.text = item.getDisPlayNameGroup()
|
binding.textView.text = item.getDisPlayNameGroup()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun registerListener(holder: ItemViewHolder, binding: ItemTextBinding) {
|
override fun registerListener(holder: ItemViewHolder, binding: Item1lineTextAndDelBinding) {
|
||||||
binding.root.onClick {
|
binding.root.onClick {
|
||||||
getItemByLayoutPosition(holder.layoutPosition)?.let {
|
getItemByLayoutPosition(holder.layoutPosition)?.let {
|
||||||
callback?.sourceOnClick(it)
|
callback?.sourceOnClick(it)
|
||||||
|
dismissAllowingStateLoss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,19 +5,15 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
|||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material.Card
|
import androidx.compose.material.Card
|
||||||
import androidx.compose.material.Slider
|
import androidx.compose.material.Slider
|
||||||
import androidx.compose.material.SliderDefaults
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.Dialog
|
import androidx.compose.ui.window.Dialog
|
||||||
import io.legado.app.lib.theme.accentColor
|
|
||||||
import io.legado.app.model.AudioPlay
|
import io.legado.app.model.AudioPlay
|
||||||
import io.legado.app.service.AudioPlayService
|
import io.legado.app.service.AudioPlayService
|
||||||
import splitties.init.appCtx
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -37,10 +33,6 @@ fun TimerDialog(state: MutableState<Boolean>, parent: View) {
|
|||||||
AudioPlay.setTimer(it.toInt())
|
AudioPlay.setTimer(it.toInt())
|
||||||
},
|
},
|
||||||
valueRange = 0f..180f,
|
valueRange = 0f..180f,
|
||||||
colors = SliderDefaults.colors(
|
|
||||||
thumbColor = Color(appCtx.accentColor),
|
|
||||||
activeTrackColor = Color(appCtx.accentColor)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,17 +16,17 @@ object AppTheme {
|
|||||||
val colors
|
val colors
|
||||||
get() = if (ThemeConfig.isDarkTheme()) {
|
get() = if (ThemeConfig.isDarkTheme()) {
|
||||||
darkColors(
|
darkColors(
|
||||||
primary = Color(appCtx.primaryColor),
|
primary = Color(appCtx.accentColor),
|
||||||
primaryVariant = Color(ColorUtils.darkenColor(appCtx.primaryColor)),
|
primaryVariant = Color(ColorUtils.darkenColor(appCtx.accentColor)),
|
||||||
secondary = Color(appCtx.accentColor),
|
secondary = Color(appCtx.primaryColor),
|
||||||
secondaryVariant = Color(appCtx.accentColor)
|
secondaryVariant = Color(appCtx.primaryColor)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
lightColors(
|
lightColors(
|
||||||
primary = Color(appCtx.primaryColor),
|
primary = Color(appCtx.accentColor),
|
||||||
primaryVariant = Color(ColorUtils.darkenColor(appCtx.primaryColor)),
|
primaryVariant = Color(ColorUtils.darkenColor(appCtx.accentColor)),
|
||||||
secondary = Color(appCtx.accentColor),
|
secondary = Color(appCtx.primaryColor),
|
||||||
secondaryVariant = Color(appCtx.accentColor)
|
secondaryVariant = Color(appCtx.primaryColor)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -9,17 +9,26 @@
|
|||||||
android:id="@+id/title_bar"
|
android:id="@+id/title_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:title="@string/arrange_bookshelf" />
|
app:title="@string/arrange_bookshelf"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view"
|
android:id="@+id/recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1" />
|
app:layout_constraintTop_toBottomOf="@id/title_bar"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/select_action_bar" />
|
||||||
|
|
||||||
<io.legado.app.ui.widget.SelectActionBar
|
<io.legado.app.ui.widget.SelectActionBar
|
||||||
android:id="@+id/select_action_bar"
|
android:id="@+id/select_action_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
</LinearLayout>
|
<androidx.compose.ui.platform.ComposeView
|
||||||
|
android:id="@+id/compose_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
android:padding="6dp"
|
android:padding="6dp"
|
||||||
tools:ignore="UseCompoundDrawables">
|
tools:ignore="UseCompoundDrawables">
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user