Alow passing deck/notetype ID on AddCards init

This commit is contained in:
Abdo 2025-08-27 03:53:04 +03:00
parent 60f7df7210
commit 603b12967c
4 changed files with 49 additions and 22 deletions

View file

@ -23,7 +23,12 @@ from aqt.utils import (
class NewAddCards(QMainWindow): class NewAddCards(QMainWindow):
def __init__(self, mw: AnkiQt) -> None: def __init__(
self,
mw: AnkiQt,
deck_id: DeckId | None = None,
notetype_id: NotetypeId | None = None,
) -> None:
super().__init__(None, Qt.WindowType.Window) super().__init__(None, Qt.WindowType.Window)
self._close_event_has_cleaned_up = False self._close_event_has_cleaned_up = False
self._close_callback: Callable[[], None] = self._close self._close_callback: Callable[[], None] = self._close
@ -37,7 +42,7 @@ class NewAddCards(QMainWindow):
self.setMinimumWidth(400) self.setMinimumWidth(400)
self.setupEditor() self.setupEditor()
add_close_shortcut(self) add_close_shortcut(self)
self._load_new_note() self._load_new_note(deck_id, notetype_id)
restoreGeom(self, "add") restoreGeom(self, "add")
gui_hooks.add_cards_did_init(self) gui_hooks.add_cards_did_init(self)
if not is_mac: if not is_mac:
@ -62,15 +67,23 @@ class NewAddCards(QMainWindow):
editor_mode=aqt.editor.EditorMode.ADD_CARDS, editor_mode=aqt.editor.EditorMode.ADD_CARDS,
) )
def reopen(self, mw: AnkiQt) -> None: def reopen(
self.editor.reload_note_if_empty() self,
mw: AnkiQt,
deck_id: DeckId | None = None,
notetype_id: NotetypeId | None = None,
) -> None:
self.editor.reload_note_if_empty(deck_id, notetype_id)
def helpRequested(self) -> None: def helpRequested(self) -> None:
openHelp(HelpPage.ADDING_CARD_AND_NOTE) openHelp(HelpPage.ADDING_CARD_AND_NOTE)
def _load_new_note(self) -> None: def _load_new_note(
self, deck_id: DeckId | None = None, notetype_id: NotetypeId | None = None
) -> None:
self.editor.load_note( self.editor.load_note(
mid=self.mw.col.models.current()["id"], mid=notetype_id,
deck_id=deck_id,
focus_to=0, focus_to=0,
) )

View file

@ -8,7 +8,7 @@ import json
import math import math
import re import re
from collections.abc import Callable, Sequence from collections.abc import Callable, Sequence
from typing import Any, cast from typing import Any
from markdown import markdown from markdown import markdown
@ -79,7 +79,6 @@ from aqt.utils import (
tr, tr,
) )
from ..addcards import NewAddCards as AddCards
from ..changenotetype import change_notetype_dialog from ..changenotetype import change_notetype_dialog
from .card_info import BrowserCardInfo from .card_info import BrowserCardInfo
from .find_and_replace import FindAndReplaceDialog from .find_and_replace import FindAndReplaceDialog
@ -269,11 +268,10 @@ class Browser(QMainWindow):
return None return None
def add_card(self, deck_id: DeckId): def add_card(self, deck_id: DeckId):
add_cards = cast(AddCards, aqt.dialogs.open("NewAddCards", self.mw)) args = [self.mw, deck_id]
add_cards.set_deck(deck_id)
if note_type_id := self.get_active_note_type_id(): if note_type_id := self.get_active_note_type_id():
add_cards.set_note_type(note_type_id) args.append(note_type_id)
aqt.dialogs.open("NewAddCards", *args)
# If in the Browser we open Preview and press Ctrl+W there, # If in the Browser we open Preview and press Ctrl+W there,
# both Preview and Browser windows get closed by Qt out of the box. # both Preview and Browser windows get closed by Qt out of the box.

View file

@ -14,6 +14,7 @@ from random import randrange
from typing import Any from typing import Any
from anki.cards import Card from anki.cards import Card
from anki.decks import DeckId
from anki.hooks import runFilter from anki.hooks import runFilter
from anki.models import NotetypeId from anki.models import NotetypeId
from anki.notes import Note, NoteId from anki.notes import Note, NoteId
@ -411,7 +412,8 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
@on_editor_ready @on_editor_ready
def load_note( def load_note(
self, self,
mid: int, mid: int | None = None,
deck_id: DeckId | None = None,
original_note_id: NoteId | None = None, original_note_id: NoteId | None = None,
focus_to: int | None = None, focus_to: int | None = None,
) -> None: ) -> None:
@ -433,6 +435,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
focusTo=focus_to, focusTo=focus_to,
originalNoteId=original_note_id, originalNoteId=original_note_id,
reviewerCardId=self.mw.reviewer.card.id if self.mw.reviewer.card else None, reviewerCardId=self.mw.reviewer.card.id if self.mw.reviewer.card else None,
deckId=deck_id,
initial=True, initial=True,
) )
js = f"loadNote({json.dumps(load_args)});" js = f"loadNote({json.dumps(load_args)});"
@ -443,8 +446,12 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
def reload_note(self) -> None: def reload_note(self) -> None:
self.web.eval("reloadNote();") self.web.eval("reloadNote();")
def reload_note_if_empty(self) -> None: def reload_note_if_empty(
self.web.eval("reloadNoteIfEmpty();") self, deck_id: DeckId | None = None, notetype_id: NotetypeId | None = None
) -> None:
self.web.eval(
f"reloadNoteIfEmpty({json.dumps(deck_id)}, {json.dumps(notetype_id)});"
)
def call_after_note_saved( def call_after_note_saved(
self, callback: Callable, keepFocus: bool = False self, callback: Callable, keepFocus: bool = False

View file

@ -31,6 +31,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
interface LoadNoteArgs { interface LoadNoteArgs {
nid: bigint | null; nid: bigint | null;
notetypeId: bigint | null; notetypeId: bigint | null;
deckId: bigint | null;
focusTo: number; focusTo: number;
originalNoteId: bigint | null; originalNoteId: bigint | null;
reviewerCardId: bigint | null; reviewerCardId: bigint | null;
@ -959,6 +960,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
async function loadNoteInner({ async function loadNoteInner({
nid, nid,
notetypeId, notetypeId,
deckId,
focusTo, focusTo,
originalNoteId, originalNoteId,
reviewerCardId, reviewerCardId,
@ -970,13 +972,18 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
reviewerCard = await getCard({ cid: reviewerCardId }); reviewerCard = await getCard({ cid: reviewerCardId });
homeDeckId = reviewerCard.originalDeckId || reviewerCard.deckId; homeDeckId = reviewerCard.originalDeckId || reviewerCard.deckId;
} }
if (initial) { if (initial && mode === "add") {
const chooserDefaults = await defaultsForAdding({ const chooserDefaults = await defaultsForAdding({
homeDeckOfCurrentReviewCard: homeDeckId, homeDeckOfCurrentReviewCard: homeDeckId,
}); });
notetypeChooser.select(chooserDefaults.notetypeId); if (!deckId) {
deckChooser.select(chooserDefaults.deckId); deckId = chooserDefaults.deckId;
notetypeId = chooserDefaults.notetypeId; }
if (!notetypeId) {
notetypeId = chooserDefaults.notetypeId;
}
deckChooser.select(deckId);
notetypeChooser.select(notetypeId);
} }
const notetype = await getNotetype({ const notetype = await getNotetype({
@ -1131,7 +1138,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
async function loadNote({ async function loadNote({
nid = note?.id, nid = note?.id,
notetypeId = notetypeMeta?.id, notetypeId = notetypeMeta ? notetypeMeta.id : null,
deckId = null,
focusTo = 0, focusTo = 0,
originalNoteId = null, originalNoteId = null,
reviewerCardId = reviewerCard ? reviewerCard.id : null, reviewerCardId = reviewerCard ? reviewerCard.id : null,
@ -1142,6 +1150,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
await loadNoteInner({ await loadNoteInner({
nid, nid,
notetypeId, notetypeId,
deckId,
focusTo, focusTo,
originalNoteId, originalNoteId,
reviewerCardId, reviewerCardId,
@ -1155,11 +1164,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
await loadNote(); await loadNote();
} }
async function reloadNoteIfEmpty() { async function reloadNoteIfEmpty(deckId: bigint | null, notetypeId: bigint | null) {
const isEmpty = const isEmpty =
(await noteFieldsCheck(note!)).state == NoteFieldsCheckResponse_State.EMPTY; (await noteFieldsCheck(note!)).state == NoteFieldsCheckResponse_State.EMPTY;
if (isEmpty) { if (isEmpty) {
await loadNote({ initial: true }); await loadNote({ initial: true, deckId, notetypeId });
} }
} }