migrate most of the remaining runHook() calls

This commit is contained in:
Damien Elmes 2020-01-15 12:46:53 +10:00
parent 67a3223623
commit 660685375f
8 changed files with 83 additions and 73 deletions

View file

@ -7,11 +7,11 @@ import aqt.deckchooser
import aqt.editor import aqt.editor
import aqt.forms import aqt.forms
import aqt.modelchooser import aqt.modelchooser
from anki.hooks import addHook, remHook, runHook from anki.hooks import addHook, remHook
from anki.lang import _ from anki.lang import _
from anki.notes import Note from anki.notes import Note
from anki.utils import htmlToTextLine, isMac from anki.utils import htmlToTextLine, isMac
from aqt import AnkiQt from aqt import AnkiQt, gui_hooks
from aqt.qt import * from aqt.qt import *
from aqt.sound import clearAudioQueue from aqt.sound import clearAudioQueue
from aqt.utils import ( from aqt.utils import (
@ -157,7 +157,7 @@ class AddCards(QDialog):
else: else:
a = m.addAction(_("(Note deleted)")) a = m.addAction(_("(Note deleted)"))
a.setEnabled(False) a.setEnabled(False)
runHook("AddCards.onHistory", self, m) gui_hooks.add_cards_history_menu_will_show_hook(self, m)
m.exec_(self.historyButton.mapToGlobal(QPoint(0, 0))) m.exec_(self.historyButton.mapToGlobal(QPoint(0, 0)))
def editHistory(self, nid): def editHistory(self, nid):
@ -197,7 +197,7 @@ question on all cards."""
self.addHistory(note) self.addHistory(note)
self.mw.requireReset() self.mw.requireReset()
self.previousNote = note self.previousNote = note
runHook("AddCards.noteAdded", note) gui_hooks.add_cards_note_did_add_hook(note)
return note return note
def addCards(self): def addCards(self):

View file

@ -6,9 +6,9 @@ from typing import Any
import aqt import aqt
from anki.errors import DeckRenameError from anki.errors import DeckRenameError
from anki.hooks import runHook
from anki.lang import _, ngettext from anki.lang import _, ngettext
from anki.utils import fmtTimeSpan, ids2str from anki.utils import fmtTimeSpan, ids2str
from aqt import gui_hooks
from aqt.qt import * from aqt.qt import *
from aqt.sound import clearAudioQueue from aqt.sound import clearAudioQueue
from aqt.utils import askUser, getOnlyText, openHelp, openLink, shortcut, showWarning from aqt.utils import askUser, getOnlyText, openHelp, openLink, shortcut, showWarning
@ -245,7 +245,7 @@ where id > ?""",
a.triggered.connect(lambda b, did=did: self._export(did)) a.triggered.connect(lambda b, did=did: self._export(did))
a = m.addAction(_("Delete")) a = m.addAction(_("Delete"))
a.triggered.connect(lambda b, did=did: self._delete(did)) a.triggered.connect(lambda b, did=did: self._delete(did))
runHook("showDeckOptions", m, did) gui_hooks.deck_browser_options_menu_will_show_hook(m, did)
m.exec_(QCursor.pos()) m.exec_(QCursor.pos())
def _export(self, did): def _export(self, did):

View file

@ -19,11 +19,11 @@ from bs4 import BeautifulSoup
import aqt import aqt
import aqt.sound import aqt.sound
from anki.hooks import addHook, runFilter, runHook from anki.hooks import addHook, runFilter
from anki.lang import _ from anki.lang import _
from anki.sync import AnkiRequestsClient from anki.sync import AnkiRequestsClient
from anki.utils import checksum, isWin, namedtmp, stripHTMLMedia from anki.utils import checksum, isWin, namedtmp, stripHTMLMedia
from aqt import AnkiQt from aqt import AnkiQt, gui_hooks
from aqt.qt import * from aqt.qt import *
from aqt.sound import getAudio from aqt.sound import getAudio
from aqt.utils import ( from aqt.utils import (
@ -141,6 +141,8 @@ class Editor:
self._addButton("more", "more"), self._addButton("more", "more"),
] ]
) )
gui_hooks.editor_buttons_did_setup_hook(righttopbtns, self)
# legacy filter
righttopbtns = runFilter("setupEditorButtons", righttopbtns, self) righttopbtns = runFilter("setupEditorButtons", righttopbtns, self)
topbuts = """ topbuts = """
<div id="topbutsleft" style="float:left;"> <div id="topbutsleft" style="float:left;">
@ -283,7 +285,7 @@ class Editor:
("Ctrl+Shift+X", self.onHtmlEdit), ("Ctrl+Shift+X", self.onHtmlEdit),
("Ctrl+Shift+T", self.onFocusTags, True), ("Ctrl+Shift+T", self.onFocusTags, True),
] ]
runHook("setupEditorShortcuts", cuts, self) gui_hooks.editor_shortcuts_did_setup_hook(cuts, self)
for row in cuts: for row in cuts:
if len(row) == 2: if len(row) == 2:
keys, fn = row # pylint: disable=unbalanced-tuple-unpacking keys, fn = row # pylint: disable=unbalanced-tuple-unpacking
@ -328,7 +330,7 @@ class Editor:
###################################################################### ######################################################################
def onBridgeCmd(self, cmd): def onBridgeCmd(self, cmd):
if not self.note or not runHook: if not self.note:
# shutdown # shutdown
return return
# focus lost or key/button pressed? # focus lost or key/button pressed?
@ -356,20 +358,20 @@ class Editor:
if type == "blur": if type == "blur":
self.currentField = None self.currentField = None
# run any filters # run any filters
if runFilter("editFocusLost", False, self.note, ord): if gui_hooks.editor_field_did_lose_focus_filter(False, self.note, ord):
# something updated the note; update it after a subsequent focus # something updated the note; update it after a subsequent focus
# event has had time to fire # event has had time to fire
self.mw.progress.timer(100, self.loadNoteKeepingFocus, False) self.mw.progress.timer(100, self.loadNoteKeepingFocus, False)
else: else:
self.checkValid() self.checkValid()
else: else:
runHook("editTimer", self.note) gui_hooks.editor_typing_timer_did_fire_hook(self.note)
self.checkValid() self.checkValid()
# focused into field? # focused into field?
elif cmd.startswith("focus"): elif cmd.startswith("focus"):
(type, num) = cmd.split(":", 1) (type, num) = cmd.split(":", 1)
self.currentField = int(num) self.currentField = int(num)
runHook("editFocusGained", self.note, self.currentField) gui_hooks.editor_field_did_gain_focus_hook(self.note, self.currentField)
elif cmd in self._links: elif cmd in self._links:
self._links[cmd](self) self._links[cmd](self)
else: else:
@ -414,7 +416,7 @@ class Editor:
self.checkValid() self.checkValid()
if focusTo is not None: if focusTo is not None:
self.web.setFocus() self.web.setFocus()
runHook("loadNote", self) gui_hooks.editor_note_did_load_hook(self)
js = "setFields(%s); setFonts(%s); focusField(%s); setNoteId(%s)" % ( js = "setFields(%s); setFonts(%s); focusField(%s); setNoteId(%s)" % (
json.dumps(data), json.dumps(data),
@ -426,7 +428,7 @@ class Editor:
def fonts(self): def fonts(self):
return [ return [
(runFilter("mungeEditingFontName", f["font"]), f["size"], f["rtl"]) (gui_hooks.editor_font_for_field_filter(f["font"]), f["size"], f["rtl"])
for f in self.note.model()["flds"] for f in self.note.model()["flds"]
] ]
@ -534,7 +536,7 @@ class Editor:
self.tags.setText(self.mw.col.tags.join(self.note.tags).strip()) self.tags.setText(self.mw.col.tags.join(self.note.tags).strip())
if not self.addMode: if not self.addMode:
self.note.flush() self.note.flush()
runHook("tagsUpdated", self.note) gui_hooks.editor_tags_did_update_hook(self.note)
def saveAddModeVars(self): def saveAddModeVars(self):
if self.addMode: if self.addMode:
@ -1109,7 +1111,7 @@ class EditorWebView(AnkiWebView):
a.triggered.connect(self.onCopy) a.triggered.connect(self.onCopy)
a = m.addAction(_("Paste")) a = m.addAction(_("Paste"))
a.triggered.connect(self.onPaste) a.triggered.connect(self.onPaste)
runHook("EditorWebView.contextMenuEvent", self, m) gui_hooks.editor_context_menu_will_show_hook(self, m)
m.popup(QCursor.pos()) m.popup(QCursor.pos())

View file

@ -13,7 +13,7 @@ import anki
import aqt import aqt
from anki.cards import Card from anki.cards import Card
from anki.hooks import runFilter, runHook from anki.hooks import runFilter, runHook
from aqt.qt import QMenu, QShortcut from aqt.qt import QMenu
# New hook/filter handling # New hook/filter handling
############################################################################## ##############################################################################
@ -376,7 +376,7 @@ class _EditorFontForFieldFilter:
editor_font_for_field_filter = _EditorFontForFieldFilter() editor_font_for_field_filter = _EditorFontForFieldFilter()
class _EditorNoteDidUpdateHook: class _EditorNoteDidLoadHook:
_hooks: List[Callable[["aqt.editor.Editor"], None]] = [] _hooks: List[Callable[["aqt.editor.Editor"], None]] = []
def append(self, cb: Callable[["aqt.editor.Editor"], None]) -> None: def append(self, cb: Callable[["aqt.editor.Editor"], None]) -> None:
@ -398,7 +398,7 @@ class _EditorNoteDidUpdateHook:
runHook("loadNote", editor) runHook("loadNote", editor)
editor_note_did_update_hook = _EditorNoteDidUpdateHook() editor_note_did_load_hook = _EditorNoteDidLoadHook()
class _EditorShortcutsDidSetupHook: class _EditorShortcutsDidSetupHook:
@ -476,7 +476,7 @@ class _EditorTypingTimerDidFireHook:
editor_typing_timer_did_fire_hook = _EditorTypingTimerDidFireHook() editor_typing_timer_did_fire_hook = _EditorTypingTimerDidFireHook()
class _MpvIdleHook: class _MpvDidIdleHook:
_hooks: List[Callable[[], None]] = [] _hooks: List[Callable[[], None]] = []
def append(self, cb: Callable[[], None]) -> None: def append(self, cb: Callable[[], None]) -> None:
@ -496,7 +496,7 @@ class _MpvIdleHook:
raise raise
mpv_idle_hook = _MpvIdleHook() mpv_did_idle_hook = _MpvDidIdleHook()
class _MpvWillPlayHook: class _MpvWillPlayHook:
@ -674,32 +674,6 @@ class _ReviewerQuestionDidShowHook:
reviewer_question_did_show_hook = _ReviewerQuestionDidShowHook() reviewer_question_did_show_hook = _ReviewerQuestionDidShowHook()
class _SetupStyleFilter:
_hooks: List[Callable[[str], str]] = []
def append(self, cb: Callable[[str], str]) -> None:
"""(style: str)"""
self._hooks.append(cb)
def remove(self, cb: Callable[[str], str]) -> None:
self._hooks.remove(cb)
def __call__(self, style: str) -> str:
for filter in self._hooks:
try:
style = filter(style)
except:
# if the hook fails, remove it
self._hooks.remove(filter)
raise
# legacy support
runFilter("setupStyle", style)
return style
setup_style_filter = _SetupStyleFilter()
class _StateDidChangeHook: class _StateDidChangeHook:
_hooks: List[Callable[[str, str], None]] = [] _hooks: List[Callable[[str, str], None]] = []
@ -753,6 +727,8 @@ state_did_reset_hook = _StateDidResetHook()
class _StateDidRevertHook: class _StateDidRevertHook:
"""Called when user used the undo option to restore to an earlier database state."""
_hooks: List[Callable[[str], None]] = [] _hooks: List[Callable[[str], None]] = []
def append(self, cb: Callable[[str], None]) -> None: def append(self, cb: Callable[[str], None]) -> None:
@ -778,16 +754,16 @@ state_did_revert_hook = _StateDidRevertHook()
class _StateShortcutsWillChangeHook: class _StateShortcutsWillChangeHook:
_hooks: List[Callable[[str, List[QShortcut]], None]] = [] _hooks: List[Callable[[str, List[Tuple[str, Callable]]], None]] = []
def append(self, cb: Callable[[str, List[QShortcut]], None]) -> None: def append(self, cb: Callable[[str, List[Tuple[str, Callable]]], None]) -> None:
"""(state: str, shortcuts: List[QShortcut])""" """(state: str, shortcuts: List[Tuple[str, Callable]])"""
self._hooks.append(cb) self._hooks.append(cb)
def remove(self, cb: Callable[[str, List[QShortcut]], None]) -> None: def remove(self, cb: Callable[[str, List[Tuple[str, Callable]]], None]) -> None:
self._hooks.remove(cb) self._hooks.remove(cb)
def __call__(self, state: str, shortcuts: List[QShortcut]) -> None: def __call__(self, state: str, shortcuts: List[Tuple[str, Callable]]) -> None:
for hook in self._hooks: for hook in self._hooks:
try: try:
hook(state, shortcuts) hook(state, shortcuts)
@ -825,6 +801,32 @@ class _StateWillChangeHook:
state_will_change_hook = _StateWillChangeHook() state_will_change_hook = _StateWillChangeHook()
class _StyleDidSetupFilter:
_hooks: List[Callable[[str], str]] = []
def append(self, cb: Callable[[str], str]) -> None:
"""(style: str)"""
self._hooks.append(cb)
def remove(self, cb: Callable[[str], str]) -> None:
self._hooks.remove(cb)
def __call__(self, style: str) -> str:
for filter in self._hooks:
try:
style = filter(style)
except:
# if the hook fails, remove it
self._hooks.remove(filter)
raise
# legacy support
runFilter("setupStyle", style)
return style
style_did_setup_filter = _StyleDidSetupFilter()
class _UndoStateDidChangeHook: class _UndoStateDidChangeHook:
_hooks: List[Callable[[bool], None]] = [] _hooks: List[Callable[[bool], None]] = []

View file

@ -26,7 +26,7 @@ import aqt.toolbar
import aqt.webview import aqt.webview
from anki import hooks from anki import hooks
from anki.collection import _Collection from anki.collection import _Collection
from anki.hooks import addHook, runFilter, runHook from anki.hooks import addHook, runHook
from anki.lang import _, ngettext from anki.lang import _, ngettext
from anki.storage import Collection from anki.storage import Collection
from anki.utils import devMode, ids2str, intTime, isMac, isWin, splitFields from anki.utils import devMode, ids2str, intTime, isMac, isWin, splitFields
@ -341,7 +341,7 @@ close the profile or restart Anki."""
else: else:
self.handleImport(self.pendingImport) self.handleImport(self.pendingImport)
self.pendingImport = None self.pendingImport = None
runHook("profileLoaded") gui_hooks.profile_did_open_hook()
if onsuccess: if onsuccess:
onsuccess() onsuccess()
@ -350,7 +350,7 @@ close the profile or restart Anki."""
self._unloadProfile() self._unloadProfile()
onsuccess() onsuccess()
runHook("unloadProfile") gui_hooks.profile_will_close_hook()
self.unloadCollection(callback) self.unloadCollection(callback)
def _unloadProfile(self) -> None: def _unloadProfile(self) -> None:
@ -560,11 +560,11 @@ from the profile screen."
cleanup(state) cleanup(state)
self.clearStateShortcuts() self.clearStateShortcuts()
self.state = state self.state = state
runHook("beforeStateChange", state, oldState, *args) gui_hooks.state_will_change_hook(state, oldState)
getattr(self, "_" + state + "State")(oldState, *args) getattr(self, "_" + state + "State")(oldState, *args)
if state != "resetRequired": if state != "resetRequired":
self.bottomWeb.show() self.bottomWeb.show()
runHook("afterStateChange", state, oldState, *args) gui_hooks.state_did_change_hook(state, oldState)
def _deckBrowserState(self, oldState: str) -> None: def _deckBrowserState(self, oldState: str) -> None:
self.deckBrowser.show() self.deckBrowser.show()
@ -574,7 +574,7 @@ from the profile screen."
self.enableColMenuItems() self.enableColMenuItems()
# ensure cwd is set if media dir exists # ensure cwd is set if media dir exists
self.col.media.dir() self.col.media.dir()
runHook("colLoading", self.col) gui_hooks.collection_did_load_hook(self.col)
self.moveToState("overview") self.moveToState("overview")
def _selectedDeck(self) -> Optional[Dict[str, Any]]: def _selectedDeck(self) -> Optional[Dict[str, Any]]:
@ -605,7 +605,7 @@ from the profile screen."
if self.col: if self.col:
if not guiOnly: if not guiOnly:
self.col.reset() self.col.reset()
runHook("reset") gui_hooks.state_did_reset_hook()
self.maybeEnableUndo() self.maybeEnableUndo()
self.moveToState(self.state) self.moveToState(self.state)
@ -847,7 +847,7 @@ QTreeWidget {
""" """
# allow addons to modify the styling # allow addons to modify the styling
buf = runFilter("setupStyle", buf) buf = gui_hooks.style_did_setup_filter(buf)
# allow users to extend styling # allow users to extend styling
p = os.path.join(aqt.mw.pm.base, "style.css") p = os.path.join(aqt.mw.pm.base, "style.css")
@ -884,6 +884,8 @@ QTreeWidget {
return qshortcuts return qshortcuts
def setStateShortcuts(self, shortcuts: List[Tuple[str, Callable]]) -> None: def setStateShortcuts(self, shortcuts: List[Tuple[str, Callable]]) -> None:
gui_hooks.state_shortcuts_will_change_hook(self.state, shortcuts)
# legacy hook
runHook(self.state + "StateShortcuts", shortcuts) runHook(self.state + "StateShortcuts", shortcuts)
self.stateShortcuts = self.applyShortcuts(shortcuts) self.stateShortcuts = self.applyShortcuts(shortcuts)
@ -926,22 +928,22 @@ QTreeWidget {
self.col.sched.reset() self.col.sched.reset()
self.reviewer.cardQueue.append(card) self.reviewer.cardQueue.append(card)
self.reviewer.nextCard() self.reviewer.nextCard()
runHook("revertedCard", cid) gui_hooks.review_did_undo_hook(cid)
else: else:
self.reset() self.reset()
tooltip(_("Reverted to state prior to '%s'.") % n.lower()) tooltip(_("Reverted to state prior to '%s'.") % n.lower())
runHook("revertedState", n) gui_hooks.state_did_revert_hook(n)
self.maybeEnableUndo() self.maybeEnableUndo()
def maybeEnableUndo(self) -> None: def maybeEnableUndo(self) -> None:
if self.col and self.col.undoName(): if self.col and self.col.undoName():
self.form.actionUndo.setText(_("Undo %s") % self.col.undoName()) self.form.actionUndo.setText(_("Undo %s") % self.col.undoName())
self.form.actionUndo.setEnabled(True) self.form.actionUndo.setEnabled(True)
runHook("undoState", True) gui_hooks.undo_state_did_change_hook(True)
else: else:
self.form.actionUndo.setText(_("Undo")) self.form.actionUndo.setText(_("Undo"))
self.form.actionUndo.setEnabled(False) self.form.actionUndo.setEnabled(False)
runHook("undoState", False) gui_hooks.undo_state_did_change_hook(False)
def checkpoint(self, name): def checkpoint(self, name):
self.col.save(name) self.col.save(name)
@ -1156,7 +1158,7 @@ Difference to correct time: %s."""
hooks.odue_invalid_hook.append(self.onOdueInvalid) hooks.odue_invalid_hook.append(self.onOdueInvalid)
gui_hooks.mpv_will_play_hook.append(self.on_mpv_will_play) gui_hooks.mpv_will_play_hook.append(self.on_mpv_will_play)
gui_hooks.mpv_idle_hook.append(self.on_mpv_idle) gui_hooks.mpv_did_idle_hook.append(self.on_mpv_idle)
self._activeWindowOnPlay: Optional[QWidget] = None self._activeWindowOnPlay: Optional[QWidget] = None

View file

@ -696,7 +696,6 @@ time = %(time)d;
self._addMenuItems(m, opts) self._addMenuItems(m, opts)
gui_hooks.reviewer_context_menu_will_show_hook(self, m) gui_hooks.reviewer_context_menu_will_show_hook(self, m)
runHook("Reviewer.contextMenuEvent", self, m)
qtMenuShortcutWorkaround(m) qtMenuShortcutWorkaround(m)
m.exec_(QCursor.pos()) m.exec_(QCursor.pos())

View file

@ -173,7 +173,7 @@ class MpvManager(MPV):
self.command("seek", secs, "relative") self.command("seek", secs, "relative")
def on_idle(self) -> None: def on_idle(self) -> None:
gui_hooks.mpv_idle_hook() gui_hooks.mpv_did_idle_hook()
def setMpvConfigBase(base) -> None: def setMpvConfigBase(base) -> None:

View file

@ -17,7 +17,7 @@ from tools.hookslib import Hook, update_file
###################################################################### ######################################################################
hooks = [ hooks = [
Hook(name="mpv_idle"), Hook(name="mpv_did_idle"),
Hook(name="mpv_will_play", args=["file: str"], legacy_hook="mpvWillPlay"), Hook(name="mpv_will_play", args=["file: str"], legacy_hook="mpvWillPlay"),
Hook( Hook(
name="reviewer_question_did_show", name="reviewer_question_did_show",
@ -83,14 +83,19 @@ hooks = [
# different sig to original # different sig to original
Hook( Hook(
name="state_shortcuts_will_change", name="state_shortcuts_will_change",
args=["state: str", "shortcuts: List[QShortcut]"], args=["state: str", "shortcuts: List[Tuple[str, Callable]]"],
), ),
Hook( Hook(
name="collection_did_load", name="collection_did_load",
args=["col: anki.storage._Collection"], args=["col: anki.storage._Collection"],
legacy_hook="colLoading", legacy_hook="colLoading",
), ),
Hook(name="state_did_revert", args=["action: str"], legacy_hook="revertedState"), Hook(
name="state_did_revert",
args=["action: str"],
legacy_hook="revertedState",
doc="Called when user used the undo option to restore to an earlier database state.",
),
Hook( Hook(
name="state_did_reset", name="state_did_reset",
legacy_hook="reset", legacy_hook="reset",
@ -101,7 +106,7 @@ hooks = [
), ),
Hook(name="review_did_undo", args=["card_id: int"], legacy_hook="revertedCard"), Hook(name="review_did_undo", args=["card_id: int"], legacy_hook="revertedCard"),
Hook( Hook(
name="setup_style", name="style_did_setup",
args=["style: str"], args=["style: str"],
return_type="str", return_type="str",
legacy_hook="setupStyle", legacy_hook="setupStyle",
@ -153,7 +158,7 @@ hooks = [
legacy_hook="editFocusLost", legacy_hook="editFocusLost",
), ),
Hook( Hook(
name="editor_note_did_update", name="editor_note_did_load",
args=["editor: aqt.editor.Editor"], args=["editor: aqt.editor.Editor"],
legacy_hook="loadNote", legacy_hook="loadNote",
), ),