diff --git a/qt/aqt/fields.py b/qt/aqt/fields.py index ba658f865..2d4f61a7f 100644 --- a/qt/aqt/fields.py +++ b/qt/aqt/fields.py @@ -6,7 +6,7 @@ from anki.consts import * from anki.lang import _, ngettext from anki.models import NoteType from anki.rsbackend import TemplateError -from aqt import AnkiQt +from aqt import AnkiQt, gui_hooks from aqt.qt import * from aqt.schema_change_tracker import ChangeTracker from aqt.utils import askUser, getOnlyText, openHelp, showWarning, tooltip @@ -100,6 +100,8 @@ class FieldDialog(QDialog): self.change_tracker.mark_basic() self.mm.rename_field(self.model, f, name) + gui_hooks.fields_did_rename_field(self, f, f["name"]) + self.saveField() self.fillFields() self.form.fieldList.setCurrentRow(idx) @@ -127,6 +129,8 @@ class FieldDialog(QDialog): return f = self.model["flds"][self.form.fieldList.currentRow()] self.mm.remove_field(self.model, f) + gui_hooks.fields_did_delete_field(self, f) + self.fillFields() self.form.fieldList.setCurrentRow(0) diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index a06c737f8..2d386e926 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -1729,6 +1729,74 @@ class _EmptyCardsWillShowHook: empty_cards_will_show = _EmptyCardsWillShowHook() +class _FieldsDidDeleteFieldHook: + _hooks: List[Callable[["aqt.fields.FieldDialog", "anki.models.Field"], None]] = [] + + def append( + self, cb: Callable[["aqt.fields.FieldDialog", "anki.models.Field"], None] + ) -> None: + """(dialog: aqt.fields.FieldDialog, field: anki.models.Field)""" + self._hooks.append(cb) + + def remove( + self, cb: Callable[["aqt.fields.FieldDialog", "anki.models.Field"], None] + ) -> None: + if cb in self._hooks: + self._hooks.remove(cb) + + def count(self) -> int: + return len(self._hooks) + + def __call__( + self, dialog: aqt.fields.FieldDialog, field: anki.models.Field + ) -> None: + for hook in self._hooks: + try: + hook(dialog, field) + except: + # if the hook fails, remove it + self._hooks.remove(hook) + raise + + +fields_did_delete_field = _FieldsDidDeleteFieldHook() + + +class _FieldsDidRenameFieldHook: + _hooks: List[ + Callable[["aqt.fields.FieldDialog", "anki.models.Field", str], None] + ] = [] + + def append( + self, cb: Callable[["aqt.fields.FieldDialog", "anki.models.Field", str], None] + ) -> None: + """(dialog: aqt.fields.FieldDialog, field: anki.models.Field, old_name: str)""" + self._hooks.append(cb) + + def remove( + self, cb: Callable[["aqt.fields.FieldDialog", "anki.models.Field", str], None] + ) -> None: + if cb in self._hooks: + self._hooks.remove(cb) + + def count(self) -> int: + return len(self._hooks) + + def __call__( + self, dialog: aqt.fields.FieldDialog, field: anki.models.Field, old_name: str + ) -> None: + for hook in self._hooks: + try: + hook(dialog, field, old_name) + except: + # if the hook fails, remove it + self._hooks.remove(hook) + raise + + +fields_did_rename_field = _FieldsDidRenameFieldHook() + + class _MainWindowDidInitHook: """Executed after the main window is fully initialized diff --git a/qt/tools/genhooks_gui.py b/qt/tools/genhooks_gui.py index ebcf3155c..0ffcb613f 100644 --- a/qt/tools/genhooks_gui.py +++ b/qt/tools/genhooks_gui.py @@ -734,6 +734,16 @@ gui_hooks.webview_did_inject_style_into_page.append(mytest) return_type="List[Tuple[str, Callable[[], None]]]", doc="""Allows adding buttons to the Model dialog""", ), + # Fields + ################### + Hook( + name="fields_did_rename_field", + args=["dialog: aqt.fields.FieldDialog", "field: anki.models.Field", "old_name: str"], + ), + Hook( + name="fields_did_delete_field", + args=["dialog: aqt.fields.FieldDialog", "field: anki.models.Field"], + ), # Stats ################### Hook(