diff --git a/qt/aqt/addcards.py b/qt/aqt/addcards.py index d4d94f0d4..f1b1cdbcf 100644 --- a/qt/aqt/addcards.py +++ b/qt/aqt/addcards.py @@ -11,26 +11,21 @@ from anki._legacy import deprecated from anki.collection import OpChanges, SearchNode from anki.decks import DeckId from anki.models import NotetypeId -from anki.notes import Note, NoteFieldsCheckResult, NoteId +from anki.notes import Note, NoteId from anki.utils import html_to_text_line, is_mac from aqt import AnkiQt, gui_hooks from aqt.deckchooser import DeckChooser from aqt.notetypechooser import NotetypeChooser -from aqt.operations.note import add_note from aqt.qt import * -from aqt.sound import av_player from aqt.utils import ( HelpPage, add_close_shortcut, ask_user_dialog, - askUser, downArrow, openHelp, restoreGeom, saveGeom, shortcut, - showWarning, - tooltip, tr, ) @@ -228,59 +223,6 @@ class AddCards(QMainWindow): def add_current_note(self) -> None: self.editor.web.eval(f"addCurrentNote({self.deck_chooser.selected_deck_id})") - def _add_current_note(self) -> None: - note = self.editor.note - - if not self._note_can_be_added(note): - return - - target_deck_id = self.deck_chooser.selected_deck_id - - def on_success(changes: OpChanges) -> None: - # only used for detecting changed sticky fields on close - self._last_added_note = note - - self.addHistory(note) - - tooltip(tr.adding_added(), period=500) - av_player.stop_and_clear_queue() - self._load_new_note(sticky_fields_from=note) - gui_hooks.add_cards_did_add_note(note) - - add_note(parent=self, note=note, target_deck_id=target_deck_id).success( - on_success - ).run_in_background() - - def _note_can_be_added(self, note: Note) -> bool: - result = note.fields_check() - # no problem, duplicate, and confirmed cloze cases - problem = None - if result == NoteFieldsCheckResult.EMPTY: - if self.editor.current_notetype_is_image_occlusion(): - problem = tr.notetypes_no_occlusion_created2() - else: - problem = tr.adding_the_first_field_is_empty() - elif result == NoteFieldsCheckResult.MISSING_CLOZE: - if not askUser(tr.adding_you_have_a_cloze_deletion_note()): - return False - elif result == NoteFieldsCheckResult.NOTETYPE_NOT_CLOZE: - problem = tr.adding_cloze_outside_cloze_notetype() - elif result == NoteFieldsCheckResult.FIELD_NOT_CLOZE: - problem = tr.adding_cloze_outside_cloze_field() - - # filter problem through add-ons - problem = gui_hooks.add_cards_will_add_note(problem, note) - if problem is not None: - showWarning(problem, help=HelpPage.ADDING_CARD_AND_NOTE) - return False - - optional_problems: list[str] = [] - gui_hooks.add_cards_might_add_note(optional_problems, note) - if not all(askUser(op) for op in optional_problems): - return False - - return True - def keyPressEvent(self, evt: QKeyEvent) -> None: if evt.key() == Qt.Key.Key_Escape: self.close() @@ -340,10 +282,6 @@ class AddCards(QMainWindow): print("deckChooser is deprecated; use deck_chooser instead") return self.deck_chooser - addCards = add_current_note - _addCards = _add_current_note - onModelChange = on_notetype_change - @deprecated(info="obsolete") def addNote(self, note: Note) -> None: pass diff --git a/qt/aqt/browser/browser.py b/qt/aqt/browser/browser.py index 2ef8d3ed9..6e7af72cd 100644 --- a/qt/aqt/browser/browser.py +++ b/qt/aqt/browser/browser.py @@ -20,7 +20,6 @@ from anki.cards import Card, CardId from anki.collection import Collection, Config, OpChanges, SearchNode from anki.consts import * from anki.decks import DeckId -from anki.errors import NotFoundError from anki.lang import without_unicode_isolation from anki.models import NotetypeId from anki.notes import NoteId @@ -190,15 +189,7 @@ class Browser(QMainWindow): # fixme: this will leave the splitter shown, but with no current # note being edited assert self.editor is not None - - note = self.editor.note - if note: - try: - note.load() - except NotFoundError: - self.editor.set_note(None) - return - self.editor.set_note(note) + self.editor.reload_note() if changes.browser_table and changes.card: self.card = self.table.get_single_selected_card() @@ -839,7 +830,7 @@ class Browser(QMainWindow): if self._previewer: self._previewer.close() - elif self.editor.note: + else: self._previewer = PreviewDialog(self, self.mw, self._on_preview_closed) self._previewer.open() self.toggle_preview_button_state(True) @@ -1261,7 +1252,7 @@ class Browser(QMainWindow): def cb(): assert self.editor is not None and self.editor.web is not None self.editor.web.setFocus() - self.editor.loadNote(focusTo=0) + self.editor.reload_note() assert self.editor is not None self.editor.call_after_note_saved(cb) diff --git a/qt/aqt/editcurrent.py b/qt/aqt/editcurrent.py index 6ec4938b7..d8007c75c 100644 --- a/qt/aqt/editcurrent.py +++ b/qt/aqt/editcurrent.py @@ -6,7 +6,6 @@ from collections.abc import Callable import aqt.editor from anki.collection import OpChanges -from anki.errors import NotFoundError from aqt import gui_hooks from aqt.qt import * from aqt.utils import add_close_shortcut, restoreGeom, saveGeom, tr @@ -47,18 +46,7 @@ class EditCurrent(QMainWindow): self, changes: OpChanges, handler: object | None ) -> None: if changes.note_text and handler is not self.editor: - # reload note - note = self.editor.note - try: - assert note is not None - note.load() - except NotFoundError: - # note's been deleted - self.cleanup() - self.close() - return - - self.editor.set_note(note) + self.editor.reload_note() def cleanup(self) -> None: gui_hooks.operation_did_execute.remove(self.on_operation_did_execute) diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index 496d893a7..4ae96f0cd 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -17,11 +17,10 @@ from typing import Any from anki._legacy import deprecated from anki.cards import Card from anki.hooks import runFilter -from anki.models import NotetypeDict, NotetypeId, StockNotetype +from anki.models import NotetypeId from anki.notes import Note, NoteId from anki.utils import is_win from aqt import AnkiQt, gui_hooks -from aqt.operations.notetype import update_notetype_legacy from aqt.qt import * from aqt.sound import av_player from aqt.utils import shortcut, showWarning @@ -119,7 +118,6 @@ class Editor: self.mw = mw self.widget = widget self.parentWindow = parentWindow - self.mid: NotetypeId | None = None # legacy argument provided? if addMode is not None: editor_mode = EditorMode.ADD_CARDS if addMode else EditorMode.EDIT_CURRENT @@ -341,9 +339,9 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too from aqt.fields import FieldDialog def on_note_info(note_info: NoteInfo) -> None: - FieldDialog( - self.mw, self.mw.col.models.get(note_info.mid), parent=self.parentWindow - ) + note_type = self.mw.col.models.get(note_info.mid) + assert note_type is not None + FieldDialog(self.mw, note_type, parent=self.parentWindow) self.get_note_info(on_note_info) @@ -456,9 +454,6 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too elif hide: self.widget.hide() - def loadNoteKeepingFocus(self) -> None: - self.loadNote(self.currentField) - @on_editor_ready def load_note(self, mid: int, focus_to: int | None = None) -> None: @@ -479,6 +474,9 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too f'require("anki/ui").loaded.then(() => {{ {js} }})', oncallback ) + def reload_note(self) -> None: + self.web.eval("reloadNote();") + def call_after_note_saved( self, callback: Callable, keepFocus: bool = False ) -> None: diff --git a/ts/routes/editor/NoteEditor.svelte b/ts/routes/editor/NoteEditor.svelte index d7634ad94..af55c0f0e 100644 --- a/ts/routes/editor/NoteEditor.svelte +++ b/ts/routes/editor/NoteEditor.svelte @@ -844,6 +844,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html return note!.id; } + async function reloadNote() { + await loadNote(note!.id, notetypeMeta.id, 0, null); + } + $: signalEditorState($editorState); $: $editorState = getEditorState( @@ -871,6 +875,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html Object.assign(globalThis, { loadNote, + reloadNote, saveSession, setFields, setCollapsed,