Skip to content

Commit a8821f1

Browse files
committed
Introduce ChangeNoteType Dialog
1 parent 235e376 commit a8821f1

File tree

14 files changed

+1325
-1
lines changed

14 files changed

+1325
-1
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import com.ichi2.anki.dialogs.CardBrowserMySearchesDialog
7878
import com.ichi2.anki.dialogs.CardBrowserMySearchesDialog.Companion.newInstance
7979
import com.ichi2.anki.dialogs.CardBrowserMySearchesDialog.MySearchesDialogListener
8080
import com.ichi2.anki.dialogs.CardBrowserOrderDialog
81+
import com.ichi2.anki.dialogs.ChangeNoteTypeDialog
8182
import com.ichi2.anki.dialogs.CreateDeckDialog
8283
import com.ichi2.anki.dialogs.DeckSelectionDialog
8384
import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.newInstance
@@ -789,6 +790,11 @@ open class CardBrowser :
789790
searchForMarkedNotes()
790791
return true
791792
}
793+
if (event.isCtrlPressed && event.isShiftPressed) {
794+
Timber.i("Ctrl+Shift+M: Change Note Type")
795+
showChangeNoteType()
796+
return true
797+
}
792798
}
793799
KeyEvent.KEYCODE_Z -> {
794800
if (event.isCtrlPressed) {
@@ -1217,6 +1223,10 @@ open class CardBrowser :
12171223
toggleBury()
12181224
return true
12191225
}
1226+
R.id.action_change_note_type -> {
1227+
showChangeNoteType()
1228+
return true
1229+
}
12201230
R.id.action_change_deck -> {
12211231
showChangeDeckDialog()
12221232
return true
@@ -1468,6 +1478,21 @@ open class CardBrowser :
14681478
}
14691479
}
14701480

1481+
private fun getChangeNoteTypeDialog(noteIds: List<Long>): ChangeNoteTypeDialog = ChangeNoteTypeDialog.newInstance(noteIds)
1482+
1483+
private fun showChangeNoteType() =
1484+
launchCatchingTask {
1485+
if (!viewModel.canChangeNoteType() && viewModel.allSelectedNotesOfSameType()) {
1486+
Timber.i("All notes are not of the same type")
1487+
showSnackbar(R.string.different_note_types_selected)
1488+
return@launchCatchingTask
1489+
}
1490+
if (viewModel.canChangeNoteType()) {
1491+
val dialog = getChangeNoteTypeDialog(viewModel.queryAllSelectedNoteIds())
1492+
showDialogFragment(dialog)
1493+
}
1494+
}
1495+
14711496
@KotlinCleanup("DeckSelectionListener is almost certainly a bug - deck!!")
14721497
fun getChangeDeckDialog(selectableDecks: List<SelectableDeck>?): DeckSelectionDialog {
14731498
val dialog =

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,28 @@ class CardBrowserViewModel(
233233

234234
suspend fun queryAllSelectedNoteIds() = selectedRows.queryNoteIds(this.cardsOrNotes)
235235

236+
suspend fun allSelectedNotesOfSameType(): Boolean {
237+
val selectedNoteIds = queryAllSelectedNoteIds()
238+
if (selectedNoteIds.isEmpty()) {
239+
return false
240+
}
241+
return withCol { notetypes.nids(getNote(selectedNoteIds.first()).noteTypeId) }.toSet().let { set ->
242+
selectedNoteIds.all { set.contains(it) }
243+
}
244+
}
245+
246+
suspend fun canChangeNoteType(): Boolean {
247+
if (!hasSelectedAnyRows()) {
248+
Timber.i("Not showing Change Note Type - No Cards")
249+
return false
250+
}
251+
if (!allSelectedNotesOfSameType()) {
252+
Timber.i("All notes are not of the same type")
253+
return false
254+
}
255+
return true
256+
}
257+
236258
@VisibleForTesting
237259
internal suspend fun queryAllCardIds() = cards.queryCardIds()
238260

0 commit comments

Comments
 (0)