-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Expand file tree
/
Copy pathWidgetConfigScreenAdapter.kt
More file actions
103 lines (90 loc) · 3.51 KB
/
WidgetConfigScreenAdapter.kt
File metadata and controls
103 lines (90 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* Copyright (c) 2024 Anoop <xenonnn4w@gmail.com>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.ichi2.widget
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.ichi2.anki.common.utils.ext.indexOfOrNull
import com.ichi2.anki.databinding.ItemWidgetDeckConfigBinding
import com.ichi2.anki.libanki.DeckId
import com.ichi2.anki.model.SelectableDeck
import com.ichi2.widget.bridge.WidgetDependencies
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/**
* Adapter class for displaying and managing a list of selectable decks in a RecyclerView.
*
* @property decks the list of selectable decks to display
* @property onDeleteDeck a function to call when a deck is removed
*/
class WidgetConfigScreenAdapter(
private val onDeleteDeck: (SelectableDeck.Deck, Int) -> Unit,
) : RecyclerView.Adapter<WidgetConfigScreenAdapter.DeckViewHolder>() {
private val decks: MutableList<SelectableDeck.Deck> = mutableListOf()
private val coroutineScope = CoroutineScope(Dispatchers.Main)
// Property to get the list of deck IDs
val deckIds: List<Long> get() = decks.map { it.deckId }
class DeckViewHolder(
val binding: ItemWidgetDeckConfigBinding,
) : RecyclerView.ViewHolder(binding.root)
/** Creates and inflates the view for each item in the RecyclerView
* @param parent the parent ViewGroup
* @param viewType the type of the view
*/
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): DeckViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return DeckViewHolder(ItemWidgetDeckConfigBinding.inflate(layoutInflater, parent, false))
}
override fun onBindViewHolder(
holder: DeckViewHolder,
position: Int,
) {
val deck = decks[position]
coroutineScope.launch {
val deckName =
withContext(Dispatchers.IO) {
WidgetDependencies.collectionAccess.withCol { decks.getLegacy(deck.deckId)!!.name }
}
holder.binding.deckNameTextView.text = deckName
}
holder.binding.removeDeckButton.setOnClickListener {
onDeleteDeck(deck, position)
}
}
override fun getItemCount(): Int = decks.size
fun addDeck(deck: SelectableDeck.Deck) {
decks.add(deck)
notifyItemInserted(decks.size - 1)
}
fun removeDeck(deckId: DeckId) {
val position = decks.indexOfOrNull { it.deckId == deckId } ?: return
decks.removeAt(position)
notifyItemRemoved(position)
}
fun moveDeck(
fromPosition: Int,
toPosition: Int,
) {
val deck = decks.removeAt(fromPosition)
decks.add(toPosition, deck)
notifyItemMoved(fromPosition, toPosition)
}
}