diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py index cb5b0cfd7..cdcf4d164 100644 --- a/qt/aqt/browser.py +++ b/qt/aqt/browser.py @@ -18,6 +18,8 @@ from anki.cards import Card from anki.collection import _Collection from anki.consts import * from anki.lang import _, ngettext +from anki.notes import Note +from anki.types import NoteType from anki.utils import ( bodyClass, fmtTimeSpan, @@ -656,7 +658,7 @@ class Browser(QMainWindow): m.addSeparator() for act in self.form.menu_Notes.actions(): m.addAction(act) - gui_hooks.browser_will_show_context_menu(self) + gui_hooks.browser_will_show_context_menu(self, m) qtMenuShortcutWorkaround(m) m.exec_(QCursor.pos()) @@ -844,13 +846,13 @@ class Browser(QMainWindow): else: self.editor.setNote(self.card.note(reload=True), focusTo=self.focusTo) self.focusTo = None - self.editor.card = self.card # type: ignore + self.editor.card = self.card # type: ignore self.singleCard = True self._updateFlagsMenu() gui_hooks.browser_did_change_row(self) self._renderPreview(True) - def refreshCurrentCard(self, note): + def refreshCurrentCard(self, note: Note) -> None: self.model.refreshNote(note) self._renderPreview(False) @@ -1533,7 +1535,7 @@ where id in %s""" ###################################################################### _previewTimer = None - _lastPreviewRender: Union[int,float] = 0 + _lastPreviewRender: Union[int, float] = 0 _lastPreviewState = None _previewCardChanged = False @@ -2019,7 +2021,7 @@ update cards set usn=?, mod=?, did=? where id in """ self.form.tableView.selectAll() sm.select(items, QItemSelectionModel.Deselect | QItemSelectionModel.Rows) - # Edit: undo + # Hooks ###################################################################### def setupHooks(self) -> None: @@ -2027,20 +2029,27 @@ update cards set usn=?, mod=?, did=? where id in """ gui_hooks.state_did_reset.append(self.onReset) gui_hooks.editor_did_fire_typing_timer.append(self.refreshCurrentCard) gui_hooks.editor_did_load_note.append(self.onLoadNote) - gui_hooks.editor_did_unfocus_field.append(self.refreshCurrentCard) - hooks.tag_added.append(self.maybeRefreshSidebar) - hooks.note_type_added.append(self.maybeRefreshSidebar) - hooks.deck_added.append(self.maybeRefreshSidebar) + gui_hooks.editor_did_unfocus_field.append(self.on_unfocus_field) + hooks.tag_added.append(self.on_item_added) + hooks.note_type_added.append(self.on_item_added) + hooks.deck_added.append(self.on_item_added) def teardownHooks(self) -> None: gui_hooks.undo_state_did_change.remove(self.onUndoState) gui_hooks.state_did_reset.remove(self.onReset) gui_hooks.editor_did_fire_typing_timer.remove(self.refreshCurrentCard) gui_hooks.editor_did_load_note.remove(self.onLoadNote) - gui_hooks.editor_did_unfocus_field.remove(self.refreshCurrentCard) - hooks.tag_added.remove(self.maybeRefreshSidebar) - hooks.note_type_added.remove(self.maybeRefreshSidebar) - hooks.deck_added.remove(self.maybeRefreshSidebar) + gui_hooks.editor_did_unfocus_field.remove(self.on_unfocus_field) + hooks.tag_added.remove(self.on_item_added) + hooks.note_type_added.remove(self.on_item_added) + hooks.deck_added.remove(self.on_item_added) + + def onUnfocusCard(self, changed: bool, note: Note, field_idx: int): + self.refreshCurrentCard(note) + + # covers the tag, note and deck case + def on_item_added(self, item): + self.maybeRefreshSidebar() def onUndoState(self, on): self.form.actionUndo.setEnabled(on) @@ -2275,9 +2284,12 @@ class ChangeModel(QDialog): self.setup() restoreGeom(self, "changeModel") gui_hooks.state_did_reset.append(self.onReset) - gui_hooks.current_note_type_did_change.append(self.onReset) + gui_hooks.current_note_type_did_change.append(self.on_note_type_change) self.exec_() + def on_note_type_change(self, notetype: NoteType) -> None: + self.onReset() + def setup(self): # maps self.flayout = QHBoxLayout() @@ -2399,7 +2411,7 @@ class ChangeModel(QDialog): def cleanup(self) -> None: gui_hooks.state_did_reset.remove(self.onReset) - gui_hooks.current_note_type_did_change.remove(self.onReset) + gui_hooks.current_note_type_did_change.remove(self.on_note_type_change) self.modelChooser.cleanup() saveGeom(self, "changeModel") diff --git a/qt/aqt/deckchooser.py b/qt/aqt/deckchooser.py index 5efe6f0b0..c62ea1031 100644 --- a/qt/aqt/deckchooser.py +++ b/qt/aqt/deckchooser.py @@ -11,7 +11,7 @@ from aqt.utils import shortcut class DeckChooser(QHBoxLayout): def __init__(self, mw, widget: QWidget, label=True, start=None) -> None: QHBoxLayout.__init__(self) - self.widget = widget # type: ignore + self.widget = widget # type: ignore self.mw = mw self.deck = mw.col self.label = label @@ -19,7 +19,7 @@ class DeckChooser(QHBoxLayout): self.setSpacing(8) self.setupDecks() self.widget.setLayout(self) - gui_hooks.current_note_type_did_change.append(self.onModelChange) + gui_hooks.current_note_type_did_change.append(self.onModelChangeNew) def setupDecks(self): if self.label: @@ -64,7 +64,10 @@ class DeckChooser(QHBoxLayout): self.widget.hide() def cleanup(self) -> None: - gui_hooks.current_note_type_did_change.remove(self.onModelChange) + gui_hooks.current_note_type_did_change.remove(self.onModelChangeNew) + + def onModelChangeNew(self, unused): + self.onModelChange() def onModelChange(self): if not self.mw.col.conf.get("addToCur", True): diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index 022d13d39..32ace7269 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -160,7 +160,7 @@ class Editor: fldsTitle=_("Customize Fields"), cardsTitle=shortcut(_("Customize Card Templates (Ctrl+L)")), ) - bgcol = self.mw.app.palette().window().color().name() # type: ignore + bgcol = self.mw.app.palette().window().color().name() # type: ignore # then load page self.web.stdHtml( _html % (bgcol, bgcol, topbuts, _("Show Duplicates")), @@ -293,7 +293,7 @@ class Editor: fn = self._addFocusCheck(fn) else: keys, fn, _ = row - QShortcut(QKeySequence(keys), self.widget, activated=fn) # type: ignore + QShortcut(QKeySequence(keys), self.widget, activated=fn) # type: ignore def _addFocusCheck(self, fn): def checkFocus(): @@ -427,7 +427,7 @@ class Editor: ) self.web.evalWithCallback(js, oncallback) - def fonts(self) -> List[Tuple[str,int,bool]]: + def fonts(self) -> List[Tuple[str, int, bool]]: return [ (gui_hooks.editor_will_use_font_for_field(f["font"]), f["size"], f["rtl"]) for f in self.note.model()["flds"] diff --git a/qt/aqt/modelchooser.py b/qt/aqt/modelchooser.py index b81f9ec29..3a4d209aa 100644 --- a/qt/aqt/modelchooser.py +++ b/qt/aqt/modelchooser.py @@ -11,7 +11,7 @@ from aqt.utils import shortcut class ModelChooser(QHBoxLayout): def __init__(self, mw, widget, label=True) -> None: QHBoxLayout.__init__(self) - self.widget = widget # type: ignore + self.widget = widget # type: ignore self.mw = mw self.deck = mw.col self.label = label diff --git a/qt/aqt/qt.py b/qt/aqt/qt.py index 9552f6ef5..194e1be34 100644 --- a/qt/aqt/qt.py +++ b/qt/aqt/qt.py @@ -7,6 +7,7 @@ import os import sys import traceback +from typing import Callable from PyQt5.Qt import * # type: ignore from PyQt5.QtCore import * @@ -14,7 +15,6 @@ from PyQt5.QtCore import pyqtRemoveInputHook # pylint: disable=no-name-in-modul from PyQt5.QtGui import * # type: ignore from PyQt5.QtWebEngineWidgets import * # type: ignore from PyQt5.QtWidgets import * -from typing import Callable from anki.utils import isMac, isWin @@ -54,6 +54,7 @@ qtpoint = QT_VERSION & 0xFF if qtmajor != 5 or qtminor < 9 or qtminor == 10: raise Exception("Anki does not support your Qt version.") + def qconnect(signal: Callable, func: Callable) -> None: "Helper to work around type checking not working with signal.connect(func)." - signal.connect(func) # type: ignore \ No newline at end of file + signal.connect(func) # type: ignore diff --git a/qt/aqt/webview.py b/qt/aqt/webview.py index b4a27e084..86ce429ca 100644 --- a/qt/aqt/webview.py +++ b/qt/aqt/webview.py @@ -181,7 +181,7 @@ class AnkiWebView(QWebEngineView): # type: ignore def contextMenuEvent(self, evt) -> None: m = QMenu(self) a = m.addAction(_("Copy")) - a.triggered.connect(self.onCopy) # type: ignore + a.triggered.connect(self.onCopy) # type: ignore gui_hooks.webview_will_show_context_menu(self, m) m.popup(QCursor.pos())