diff --git a/qt/aqt/addcards.py b/qt/aqt/addcards.py index b84cd11a839..ae9249a0712 100644 --- a/qt/aqt/addcards.py +++ b/qt/aqt/addcards.py @@ -1,6 +1,8 @@ # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +from __future__ import annotations + from typing import Callable, Optional import aqt.editor @@ -54,12 +56,12 @@ def __init__(self, mw: AnkiQt) -> None: gui_hooks.add_cards_did_init(self) self.show() - def set_note(self, note: Note) -> None: - """Set tags, field contents and notetype (and its deck) - according to `note`. + def set_note(self, note: Note, deck_id: DeckId | None = None) -> None: + """Set tags, field contents and notetype according to `note`. Deck is set + to `deck_id` or the deck last used with the notetype. """ self.notetype_chooser.selected_notetype_id = note.mid - if deck_id := self.col.default_deck_for_notetype(note.mid): + if deck_id or (deck_id := self.col.default_deck_for_notetype(note.mid)): self.deck_chooser.selected_deck_id = deck_id new_note = self._new_note() diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 358ffe8c956..6eca263b34e 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -591,7 +591,8 @@ def onHelp(self) -> None: def on_create_copy(self) -> None: if note := self.table.get_current_note(): - aqt.dialogs.open("AddCards", self.mw).set_note(note) + deck_id = self.table.get_current_card().did + aqt.dialogs.open("AddCards", self.mw).set_note(note, deck_id) @no_arg_trigger @skip_if_selection_is_empty diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py index e81e726e53a..b22e1dc3e84 100644 --- a/qt/aqt/reviewer.py +++ b/qt/aqt/reviewer.py @@ -13,6 +13,7 @@ from enum import Enum, auto from typing import Any, Callable, Literal, Match, Sequence, cast +import aqt from anki import hooks from anki.cards import Card, CardId from anki.collection import Config, OpChanges, OpChangesWithCount @@ -458,6 +459,7 @@ def _shortcutKeys( ("-", self.bury_current_card), ("!", self.suspend_current_note), ("@", self.suspend_current_card), + ("Ctrl+Alt+E", self.on_create_copy), ("Ctrl+Delete", self.delete_current_note), ("Ctrl+Shift+D", self.on_set_due), ("v", self.onReplayRecorded), @@ -913,7 +915,11 @@ def _contextMenu(self) -> list[Any]: ], ], [tr.studying_bury_card(), "-", self.bury_current_card], - [tr.actions_set_due_date(), "Ctrl+Shift+D", self.on_set_due], + [ + tr.actions_with_ellipsis(action=tr.actions_set_due_date()), + "Ctrl+Shift+D", + self.on_set_due, + ], [tr.actions_suspend_card(), "@", self.suspend_current_card], [tr.actions_options(), "O", self.onOptions], [tr.actions_card_info(), "I", self.on_card_info], @@ -922,6 +928,11 @@ def _contextMenu(self) -> list[Any]: [tr.studying_mark_note(), "*", self.toggle_mark_on_current_note], [tr.studying_bury_note(), "=", self.bury_current_note], [tr.studying_suspend_note(), "!", self.suspend_current_note], + [ + tr.actions_with_ellipsis(action=tr.actions_create_copy()), + "Ctrl+Alt+E", + self.on_create_copy, + ], [tr.studying_delete_note(), "Ctrl+Delete", self.delete_current_note], None, [tr.actions_replay_audio(), "R", self.replayAudio], @@ -1042,6 +1053,12 @@ def bury_current_card(self) -> None: lambda res: tooltip(tr.studying_cards_buried(count=res.count)) ).run_in_background() + def on_create_copy(self) -> None: + if self.card: + aqt.dialogs.open("AddCards", self.mw).set_note( + self.card.note(), self.card.did + ) + def delete_current_note(self) -> None: # need to check state because the shortcut is global to the main # window