diff --git a/qt/aqt/deckbrowser.py b/qt/aqt/deckbrowser.py index a2c4f8444..2b7272ac5 100644 --- a/qt/aqt/deckbrowser.py +++ b/qt/aqt/deckbrowser.py @@ -10,7 +10,7 @@ from typing import Any import aqt import aqt.operations -from anki.collection import OpChanges +from anki.collection import Collection, OpChanges from anki.decks import DeckCollapseScope, DeckId, DeckTreeNode from aqt import AnkiQt, gui_hooks from aqt.deckoptions import display_options_for_deck_id @@ -34,6 +34,16 @@ class DeckBrowserBottomBar: self.deck_browser = deck_browser +@dataclass +class RenderData: + """Data from collection that is required to show the page.""" + + tree: DeckTreeNode + current_deck_id: DeckId + studied_today: str + sched_upgrade_required: bool + + @dataclass class DeckBrowserContent: """Stores sections of HTML content that the deck browser will be @@ -54,7 +64,7 @@ class RenderDeckNodeContext: class DeckBrowser: - _dueTree: DeckTreeNode + _render_data: RenderData def __init__(self, mw: AnkiQt) -> None: self.mw = mw @@ -147,27 +157,36 @@ class DeckBrowser: def _renderPage(self, reuse: bool = False) -> None: if not reuse: - def success(tree: DeckTreeNode) -> None: - self._dueTree = tree + def get_data(col: Collection) -> RenderData: + return RenderData( + tree=col.sched.deck_due_tree(), + current_deck_id=col.decks.get_current_id(), + studied_today=col.studied_today(), + sched_upgrade_required=not col.v3_scheduler(), + ) + + def success(output: RenderData) -> None: + self._render_data = output self.__renderPage(None) - return QueryOp( parent=self.mw, - op=lambda col: col.sched.deck_due_tree(), + op=get_data, success=success, ).run_in_background() else: self.web.evalWithCallback("window.pageYOffset", self.__renderPage) def __renderPage(self, offset: int | None) -> None: + data = self._render_data content = DeckBrowserContent( - tree=self._renderDeckTree(self._dueTree), - stats=self._renderStats(), + tree=self._renderDeckTree(data.tree), + stats=self._renderStats(data.studied_today), ) gui_hooks.deck_browser_will_render_content(self, content) self.web.stdHtml( - self._v1_upgrade_message() + self._body % content.__dict__, + self._v1_upgrade_message(data.sched_upgrade_required) + + self._body % content.__dict__, css=["css/deckbrowser.css"], js=[ "js/vendor/jquery.min.js", @@ -184,10 +203,8 @@ class DeckBrowser: def _scrollToOffset(self, offset: int) -> None: self.web.eval("window.scrollTo(0, %d, 'instant');" % offset) - def _renderStats(self) -> str: - return '