diff --git a/qt/aqt/deckbrowser.py b/qt/aqt/deckbrowser.py
index 356d616fc..c19b0ef01 100644
--- a/qt/aqt/deckbrowser.py
+++ b/qt/aqt/deckbrowser.py
@@ -5,7 +5,7 @@
from __future__ import annotations
from copy import deepcopy
-from enum import Enum
+from dataclasses import dataclass
from typing import Any
import aqt
@@ -24,10 +24,20 @@ class DeckBrowserBottomBar:
self.deck_browser = deck_browser
-class DeckBrowserSection(Enum):
- TREE = 0
- STATS = 1
- WARN = 2
+@dataclass
+class DeckBrowserContent:
+ """Stores sections of HTML content that the deck browser will be
+ populated with.
+
+ Attributes:
+ tree {str} -- HTML of the deck tree section
+ stats {str} -- HTML of the stats section
+ countwarn {str} -- HTML of the deck count warning section
+ """
+
+ tree: str
+ stats: str
+ countwarn: str
class DeckBrowser:
@@ -110,17 +120,14 @@ class DeckBrowser:
gui_hooks.deck_browser_did_render(self)
def __renderPage(self, offset):
- tree = gui_hooks.deck_browser_will_render_section(
- self._renderDeckTree(self._dueTree), DeckBrowserSection.TREE, self
- )
- stats = gui_hooks.deck_browser_will_render_section(
- self._renderStats(), DeckBrowserSection.STATS, self
- )
- warn = gui_hooks.deck_browser_will_render_section(
- self._countWarn(), DeckBrowserSection.WARN, self
+ content = DeckBrowserContent(
+ tree=self._renderDeckTree(self._dueTree),
+ stats=self._renderStats(),
+ countwarn=self._countWarn(),
)
+ gui_hooks.deck_browser_will_render_content(self, content)
self.web.stdHtml(
- self._body % dict(tree=tree, stats=stats, countwarn=warn),
+ self._body % content.__dict__,
css=["deckbrowser.css"],
js=["jquery.js", "jquery-ui.js", "deckbrowser.js"],
context=self,
diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py
index a4922de36..a6813d54c 100644
--- a/qt/aqt/gui_hooks.py
+++ b/qt/aqt/gui_hooks.py
@@ -435,51 +435,41 @@ class _DeckBrowserDidRenderHook:
deck_browser_did_render = _DeckBrowserDidRenderHook()
-class _DeckBrowserWillRenderSectionFilter:
+class _DeckBrowserWillRenderContentHook:
"""Used to modify HTML content sections in the deck browser body
- 'html' is the content a particular section will be populated with
+ 'content' contains the sections of HTML content the deck browser body
+ will be updated with.
- 'section' is an enum describing the current section. For an overview
- of all the possible values please see aqt.deckbrowser.DeckBrowserSection.
-
- If you do not want to modify the content of a particular section,
- return 'html' unmodified, e.g.:
+ When modifying the content of a particular section, please make sure your
+ changes only perform the minimum required edits to make your add-on work.
+ You should avoid overwriting or interfering with existing data as much
+ as possible, instead opting to append your own changes, e.g.:
- def on_deck_browser_will_render_section(html, section, deck_browser):
-
- if section != DeckBrowserSection.TREE:
- # not the tree section we want to modify, return unchanged
- return html
-
- # tree section, perform changes to html
- html += "
my code
"
-
- return html
+ def on_deck_browser_will_render_content(deck_browser, content):
+ content.stats += "
+my html
"
"""
_hooks: List[
Callable[
- [str, "aqt.deckbrowser.DeckBrowserSection", "aqt.deckbrowser.DeckBrowser"],
- str,
+ ["aqt.deckbrowser.DeckBrowser", "aqt.deckbrowser.DeckBrowserContent"], None
]
] = []
def append(
self,
cb: Callable[
- [str, "aqt.deckbrowser.DeckBrowserSection", "aqt.deckbrowser.DeckBrowser"],
- str,
+ ["aqt.deckbrowser.DeckBrowser", "aqt.deckbrowser.DeckBrowserContent"], None
],
) -> None:
- """(html: str, section: aqt.deckbrowser.DeckBrowserSection, deck_browser: aqt.deckbrowser.DeckBrowser)"""
+ """(deck_browser: aqt.deckbrowser.DeckBrowser, content: aqt.deckbrowser.DeckBrowserContent)"""
self._hooks.append(cb)
def remove(
self,
cb: Callable[
- [str, "aqt.deckbrowser.DeckBrowserSection", "aqt.deckbrowser.DeckBrowser"],
- str,
+ ["aqt.deckbrowser.DeckBrowser", "aqt.deckbrowser.DeckBrowserContent"], None
],
) -> None:
if cb in self._hooks:
@@ -487,21 +477,19 @@ class _DeckBrowserWillRenderSectionFilter:
def __call__(
self,
- html: str,
- section: aqt.deckbrowser.DeckBrowserSection,
deck_browser: aqt.deckbrowser.DeckBrowser,
- ) -> str:
- for filter in self._hooks:
+ content: aqt.deckbrowser.DeckBrowserContent,
+ ) -> None:
+ for hook in self._hooks:
try:
- html = filter(html, section, deck_browser)
+ hook(deck_browser, content)
except:
# if the hook fails, remove it
- self._hooks.remove(filter)
+ self._hooks.remove(hook)
raise
- return html
-deck_browser_will_render_section = _DeckBrowserWillRenderSectionFilter()
+deck_browser_will_render_content = _DeckBrowserWillRenderContentHook()
class _DeckBrowserWillShowOptionsMenuHook:
diff --git a/qt/tools/genhooks_gui.py b/qt/tools/genhooks_gui.py
index b3efb16f3..3d9b198bc 100644
--- a/qt/tools/genhooks_gui.py
+++ b/qt/tools/genhooks_gui.py
@@ -31,33 +31,23 @@ hooks = [
doc="""Allow to update the deck browser window. E.g. change its title.""",
),
Hook(
- name="deck_browser_will_render_section",
+ name="deck_browser_will_render_content",
args=[
- "html: str",
- "section: aqt.deckbrowser.DeckBrowserSection",
"deck_browser: aqt.deckbrowser.DeckBrowser",
+ "content: aqt.deckbrowser.DeckBrowserContent",
],
- return_type="str",
doc="""Used to modify HTML content sections in the deck browser body
- 'html' is the content a particular section will be populated with
+ 'content' contains the sections of HTML content the deck browser body
+ will be updated with.
- 'section' is an enum describing the current section. For an overview
- of all the possible values please see aqt.deckbrowser.DeckBrowserSection.
-
- If you do not want to modify the content of a particular section,
- return 'html' unmodified, e.g.:
+ When modifying the content of a particular section, please make sure your
+ changes only perform the minimum required edits to make your add-on work.
+ You should avoid overwriting or interfering with existing data as much
+ as possible, instead opting to append your own changes, e.g.:
- def on_deck_browser_will_render_section(html, section, deck_browser):
-
- if section != DeckBrowserSection.TREE:
- # not the tree section we want to modify, return unchanged
- return html
-
- # tree section, perform changes to html
- html += "my code
"
-
- return html
+ def on_deck_browser_will_render_content(deck_browser, content):
+ content.stats += "\nmy html
"
""",
),
Hook(