mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-15 05:27:28 +01:00
Edit mangas' Categories in Library using TriState list (#5422)
* Use QuadState Categories to edit mangas in Library Add updateMangasToCategories to build build correct Categories list for each manga using Common and Mix list Update QuadState Multi-Choice to either Action or Display List Display list would have different state sequece from Action Uncheck-> Indeterminate (only if initial so)-> Check fixup manga categories logic as Windows and push request comments * fixup: Use QuadStateTextView.State enum Update function to use QuadStateTextView.State enum that missed in last change * fixup: missing closing bracket and type cast Co-authored-by: quangkieu <quangkieu1993@gmail.com>
This commit is contained in:
@@ -39,6 +39,7 @@ fun MaterialAlertDialogBuilder.setTextInput(
|
||||
*/
|
||||
fun MaterialAlertDialogBuilder.setQuadStateMultiChoiceItems(
|
||||
@StringRes message: Int? = null,
|
||||
isActionList: Boolean = true,
|
||||
items: List<CharSequence>,
|
||||
initialSelected: IntArray,
|
||||
disabledIndices: IntArray? = null,
|
||||
@@ -50,6 +51,7 @@ fun MaterialAlertDialogBuilder.setQuadStateMultiChoiceItems(
|
||||
items = items,
|
||||
disabledItems = disabledIndices,
|
||||
initialSelected = initialSelected,
|
||||
isActionList = isActionList,
|
||||
listener = selection
|
||||
)
|
||||
val updateScrollIndicators = {
|
||||
|
||||
@@ -8,14 +8,18 @@ import eu.kanade.tachiyomi.databinding.DialogQuadstatemultichoiceItemBinding
|
||||
private object CheckPayload
|
||||
private object InverseCheckPayload
|
||||
private object UncheckPayload
|
||||
private object IndeterminatePayload
|
||||
|
||||
typealias QuadStateMultiChoiceListener = (indices: IntArray) -> Unit
|
||||
|
||||
// isAction state: Uncheck-> Check-> Invert else Uncheck-> Indeterminate (only if initial so)-> Check
|
||||
// isAction for list of action to operate on like filter include, exclude
|
||||
internal class QuadStateMultiChoiceDialogAdapter(
|
||||
internal var items: List<CharSequence>,
|
||||
disabledItems: IntArray?,
|
||||
initialSelected: IntArray,
|
||||
internal var listener: QuadStateMultiChoiceListener
|
||||
private var initialSelected: IntArray,
|
||||
internal var listener: QuadStateMultiChoiceListener,
|
||||
val isActionList: Boolean = true
|
||||
) : RecyclerView.Adapter<QuadStateMultiChoiceViewHolder>() {
|
||||
|
||||
private val states = QuadStateTextView.State.values()
|
||||
@@ -39,12 +43,15 @@ internal class QuadStateMultiChoiceDialogAdapter(
|
||||
// This value was unselected
|
||||
notifyItemChanged(index, UncheckPayload)
|
||||
}
|
||||
current == QuadStateTextView.State.INDETERMINATE.ordinal && previous != QuadStateTextView.State.INDETERMINATE.ordinal -> {
|
||||
// This value was set back to Indeterminate
|
||||
notifyItemChanged(index, IndeterminatePayload)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private var disabledIndices: IntArray = disabledItems ?: IntArray(0)
|
||||
|
||||
internal fun itemClicked(index: Int) {
|
||||
internal fun itemActionClicked(index: Int) {
|
||||
val newSelection = this.currentSelection.toMutableList()
|
||||
newSelection[index] = when (currentSelection[index]) {
|
||||
QuadStateTextView.State.CHECKED.ordinal -> QuadStateTextView.State.INVERSED.ordinal
|
||||
@@ -56,6 +63,21 @@ internal class QuadStateMultiChoiceDialogAdapter(
|
||||
listener(currentSelection)
|
||||
}
|
||||
|
||||
internal fun itemDisplayClicked(index: Int) {
|
||||
val newSelection = this.currentSelection.toMutableList()
|
||||
newSelection[index] = when (currentSelection[index]) {
|
||||
QuadStateTextView.State.UNCHECKED.ordinal -> QuadStateTextView.State.CHECKED.ordinal
|
||||
QuadStateTextView.State.CHECKED.ordinal -> when (initialSelected[index]) {
|
||||
QuadStateTextView.State.INDETERMINATE.ordinal -> QuadStateTextView.State.INDETERMINATE.ordinal
|
||||
else -> QuadStateTextView.State.UNCHECKED.ordinal
|
||||
}
|
||||
// INDETERMINATE or UNCHECKED
|
||||
else -> QuadStateTextView.State.UNCHECKED.ordinal
|
||||
}
|
||||
this.currentSelection = newSelection.toIntArray()
|
||||
listener(currentSelection)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(
|
||||
parent: ViewGroup,
|
||||
viewType: Int
|
||||
@@ -96,6 +118,10 @@ internal class QuadStateMultiChoiceDialogAdapter(
|
||||
holder.controlView.state = QuadStateTextView.State.UNCHECKED
|
||||
return
|
||||
}
|
||||
IndeterminatePayload -> {
|
||||
holder.controlView.state = QuadStateTextView.State.INDETERMINATE
|
||||
return
|
||||
}
|
||||
}
|
||||
super.onBindViewHolder(holder, position, payloads)
|
||||
}
|
||||
|
||||
@@ -21,5 +21,8 @@ internal class QuadStateMultiChoiceViewHolder(
|
||||
controlView.isEnabled = value
|
||||
}
|
||||
|
||||
override fun onClick(view: View) = adapter.itemClicked(bindingAdapterPosition)
|
||||
override fun onClick(view: View) = when (adapter.isActionList) {
|
||||
true -> adapter.itemActionClicked(bindingAdapterPosition)
|
||||
false -> adapter.itemDisplayClicked(bindingAdapterPosition)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user