Skip to content

Commit 46bc823

Browse files
david-allisonlukstbit
authored andcommitted
improvement(new-card-browser): deck selection chip
Adds a Chip control for selecting the current deck For issue 18709: Material Search View
1 parent 991b3ac commit 46bc823

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragment.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ import com.ichi2.anki.dialogs.BrowserOptionsDialog
7676
import com.ichi2.anki.dialogs.CardBrowserOrderDialog
7777
import com.ichi2.anki.dialogs.CreateDeckDialog
7878
import com.ichi2.anki.dialogs.DeckSelectionDialog
79-
import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.newInstance
8079
import com.ichi2.anki.dialogs.DeckSelectionDialog.DeckSelectionListener
8180
import com.ichi2.anki.dialogs.SimpleMessageDialog
8281
import com.ichi2.anki.dialogs.tags.TagsDialog
@@ -102,6 +101,7 @@ import com.ichi2.anki.utils.ext.ifNotZero
102101
import com.ichi2.anki.utils.ext.setFragmentResultListener
103102
import com.ichi2.anki.utils.ext.showDialogFragment
104103
import com.ichi2.anki.utils.ext.visibleItemPositions
104+
import com.ichi2.anki.utils.showDialogFragmentImpl
105105
import com.ichi2.anki.withProgress
106106
import com.ichi2.utils.HandlerUtils
107107
import com.ichi2.utils.TagsUtil.getUpdatedTags
@@ -219,7 +219,10 @@ class CardBrowserFragment :
219219

220220
progressIndicator = view.findViewById(R.id.browser_progress)
221221

222-
deckChip = view.findViewById<Chip>(R.id.chip_decks)
222+
deckChip =
223+
view.findViewById<Chip>(R.id.chip_decks)?.apply {
224+
setOnClickListener { viewModel.openDeckSelectionDialog() }
225+
}
223226
searchBar =
224227
view.findViewById<SearchBar>(R.id.search_bar)?.apply {
225228
setNavigationOnClickListener {
@@ -436,6 +439,21 @@ class CardBrowserFragment :
436439
)
437440
}
438441

442+
fun onSearchForDecks(decks: List<SelectableDeck>) {
443+
val dialog =
444+
DeckSelectionDialog.newInstance(
445+
title = getString(R.string.search_deck),
446+
summaryMessage = null,
447+
keepRestoreDefaultButton = false,
448+
decks = decks,
449+
)
450+
showDialogFragmentImpl(childFragmentManager, dialog)
451+
}
452+
453+
fun onDeckChanged(deck: SelectableDeck?) {
454+
deckChip?.text = deck?.getDisplayName(requireContext())
455+
}
456+
439457
activityViewModel.flowOfIsTruncated.launchCollectionInLifecycleScope(::onIsTruncatedChanged)
440458
activityViewModel.flowOfSelectedRows.launchCollectionInLifecycleScope(::onSelectedRowsChanged)
441459
activityViewModel.flowOfActiveColumns.launchCollectionInLifecycleScope(::onColumnsChanged)
@@ -445,6 +463,8 @@ class CardBrowserFragment :
445463
activityViewModel.flowOfColumnHeadings.launchCollectionInLifecycleScope(::onColumnNamesChanged)
446464
activityViewModel.flowOfCardStateChanged.launchCollectionInLifecycleScope(::onCardsMarkedEvent)
447465
activityViewModel.flowOfToggleSelectionState.launchCollectionInLifecycleScope(::onToggleSelectionStateUpdated)
466+
viewModel.flowOfSearchForDecks.launchCollectionInLifecycleScope(::onSearchForDecks)
467+
activityViewModel.flowOfDeckSelection.launchCollectionInLifecycleScope(::onDeckChanged)
448468
}
449469

450470
private fun setupFragmentResultListeners() {
@@ -847,7 +867,7 @@ class CardBrowserFragment :
847867
@VisibleForTesting
848868
internal fun getChangeDeckDialog(selectableDecks: List<SelectableDeck>?): DeckSelectionDialog {
849869
val dialog =
850-
newInstance(
870+
DeckSelectionDialog.newInstance(
851871
getString(R.string.move_all_to_deck),
852872
null,
853873
false,

AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragmentViewModel.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,19 @@
1717
package com.ichi2.anki.browser
1818

1919
import androidx.lifecycle.ViewModel
20+
import androidx.lifecycle.viewModelScope
21+
import com.ichi2.anki.common.annotations.NeedsTest
22+
import com.ichi2.anki.model.SelectableDeck
23+
import kotlinx.coroutines.flow.MutableSharedFlow
24+
import kotlinx.coroutines.launch
2025

21-
class CardBrowserFragmentViewModel : ViewModel()
26+
class CardBrowserFragmentViewModel : ViewModel() {
27+
val flowOfSearchForDecks = MutableSharedFlow<List<SelectableDeck>>()
28+
29+
@NeedsTest("default usage")
30+
fun openDeckSelectionDialog() =
31+
viewModelScope.launch {
32+
val decks = listOf(SelectableDeck.AllDecks) + SelectableDeck.fromCollection(includeFiltered = true)
33+
flowOfSearchForDecks.emit(decks)
34+
}
35+
}

AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,9 +307,19 @@ class CardBrowserViewModel(
307307
flowOfDeckId.update { deckId }
308308
}
309309

310+
// TODO: replace with flowOfDeckSelection
310311
val flowOfDeckId = MutableStateFlow(lastDeckId)
311312
val deckId get() = flowOfDeckId.value
312313

314+
val flowOfDeckSelection =
315+
flowOfDeckId.map { did ->
316+
when (did) {
317+
ALL_DECKS_ID -> return@map SelectableDeck.AllDecks
318+
null -> return@map null
319+
else -> return@map SelectableDeck.Deck.fromId(did)
320+
}
321+
}
322+
313323
suspend fun queryCardInfoDestination(): CardInfoDestination? {
314324
val firstSelectedCard = selectedRows.firstOrNull()?.toCardId(cardsOrNotes) ?: return null
315325
return CardInfoDestination(firstSelectedCard)

AnkiDroid/src/main/java/com/ichi2/anki/model/SelectableDeck.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.ichi2.anki.model
1919
import android.content.Context
2020
import android.os.Parcelable
2121
import com.ichi2.anki.CollectionManager
22+
import com.ichi2.anki.CollectionManager.withCol
2223
import com.ichi2.anki.R
2324
import com.ichi2.anki.libanki.DeckId
2425
import com.ichi2.anki.libanki.DeckNameId
@@ -37,6 +38,10 @@ sealed class SelectableDeck : Parcelable {
3738
val name: String,
3839
) : SelectableDeck() {
3940
constructor(d: DeckNameId) : this(d.id, d.name)
41+
42+
companion object {
43+
suspend fun fromId(id: DeckId): Deck = Deck(deckId = id, name = withCol { decks.name(id) })
44+
}
4045
}
4146

4247
/**

0 commit comments

Comments
 (0)