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.forms
import aqt.modelchooser
from anki.hooks import addHook, remHook, runHook
from anki.hooks import addHook, remHook
from anki.lang import _
from anki.notes import Note
from anki.utils import htmlToTextLine, isMac
from aqt import AnkiQt
from aqt import AnkiQt, gui_hooks
from aqt.qt import *
from aqt.sound import clearAudioQueue
from aqt.utils import (
@ -157,7 +157,7 @@ class AddCards(QDialog):
else:
a = m.addAction(_("(Note deleted)"))
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)))
def editHistory(self, nid):
@ -197,7 +197,7 @@ question on all cards."""
self.addHistory(note)
self.mw.requireReset()
self.previousNote = note
runHook("AddCards.noteAdded", note)
gui_hooks.add_cards_note_did_add_hook(note)
return note
def addCards(self):

View File

@ -6,9 +6,9 @@ from typing import Any
import aqt
from anki.errors import DeckRenameError
from anki.hooks import runHook
from anki.lang import _, ngettext
from anki.utils import fmtTimeSpan, ids2str
from aqt import gui_hooks
from aqt.qt import *
from aqt.sound import clearAudioQueue
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 = m.addAction(_("Delete"))
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())
def _export(self, did):

View File

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

View File

@ -13,7 +13,7 @@ import anki
import aqt
from anki.cards import Card
from anki.hooks import runFilter, runHook
from aqt.qt import QMenu, QShortcut
from aqt.qt import QMenu
# New hook/filter handling
##############################################################################
@ -376,7 +376,7 @@ class _EditorFontForFieldFilter:
editor_font_for_field_filter = _EditorFontForFieldFilter()
class _EditorNoteDidUpdateHook:
class _EditorNoteDidLoadHook:
_hooks: List[Callable[["aqt.editor.Editor"], None]] = []
def append(self, cb: Callable[["aqt.editor.Editor"], None]) -> None:
@ -398,7 +398,7 @@ class _EditorNoteDidUpdateHook:
runHook("loadNote", editor)
editor_note_did_update_hook = _EditorNoteDidUpdateHook()
editor_note_did_load_hook = _EditorNoteDidLoadHook()
class _EditorShortcutsDidSetupHook:
@ -476,7 +476,7 @@ class _EditorTypingTimerDidFireHook:
editor_typing_timer_did_fire_hook = _EditorTypingTimerDidFireHook()
class _MpvIdleHook:
class _MpvDidIdleHook:
_hooks: List[Callable[[], None]] = []
def append(self, cb: Callable[[], None]) -> None:
@ -496,7 +496,7 @@ class _MpvIdleHook:
raise
mpv_idle_hook = _MpvIdleHook()
mpv_did_idle_hook = _MpvDidIdleHook()
class _MpvWillPlayHook:
@ -674,32 +674,6 @@ class _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:
_hooks: List[Callable[[str, str], None]] = []
@ -753,6 +727,8 @@ state_did_reset_hook = _StateDidResetHook()
class _StateDidRevertHook:
"""Called when user used the undo option to restore to an earlier database state."""
_hooks: List[Callable[[str], None]] = []
def append(self, cb: Callable[[str], None]) -> None:
@ -778,16 +754,16 @@ state_did_revert_hook = _StateDidRevertHook()
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:
"""(state: str, shortcuts: List[QShortcut])"""
def append(self, cb: Callable[[str, List[Tuple[str, Callable]]], None]) -> None:
"""(state: str, shortcuts: List[Tuple[str, Callable]])"""
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)
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:
try:
hook(state, shortcuts)
@ -825,6 +801,32 @@ class _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:
_hooks: List[Callable[[bool], None]] = []

View File

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

View File

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

View File

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

View File

@ -17,7 +17,7 @@ from tools.hookslib import Hook, update_file
######################################################################
hooks = [
Hook(name="mpv_idle"),
Hook(name="mpv_did_idle"),
Hook(name="mpv_will_play", args=["file: str"], legacy_hook="mpvWillPlay"),
Hook(
name="reviewer_question_did_show",
@ -83,14 +83,19 @@ hooks = [
# different sig to original
Hook(
name="state_shortcuts_will_change",
args=["state: str", "shortcuts: List[QShortcut]"],
args=["state: str", "shortcuts: List[Tuple[str, Callable]]"],
),
Hook(
name="collection_did_load",
args=["col: anki.storage._Collection"],
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(
name="state_did_reset",
legacy_hook="reset",
@ -101,7 +106,7 @@ hooks = [
),
Hook(name="review_did_undo", args=["card_id: int"], legacy_hook="revertedCard"),
Hook(
name="setup_style",
name="style_did_setup",
args=["style: str"],
return_type="str",
legacy_hook="setupStyle",
@ -153,7 +158,7 @@ hooks = [
legacy_hook="editFocusLost",
),
Hook(
name="editor_note_did_update",
name="editor_note_did_load",
args=["editor: aqt.editor.Editor"],
legacy_hook="loadNote",
),