Fix TypeError when deck list or overview refreshes during optimal retention

Caused by legacy code blocking the main thread.

https://forums.ankiweb.net/t/anki-23-10-beta/34912/79
This commit is contained in:
Damien Elmes 2023-09-30 15:38:11 +10:00
parent d16faacd0f
commit 0ef28853fd
3 changed files with 28 additions and 13 deletions

View file

@ -29,5 +29,5 @@ class DummyScheduler(SchedulerBaseWithLegacy):
def active_decks(self) -> list[DeckId]: def active_decks(self) -> list[DeckId]:
return [] return []
def counts(self) -> list[int]: def counts(self) -> tuple[int, int, int]:
return [0, 0, 0] return (0, 0, 0)

View file

@ -146,12 +146,21 @@ class DeckBrowser:
def _renderPage(self, reuse: bool = False) -> None: def _renderPage(self, reuse: bool = False) -> None:
if not reuse: if not reuse:
self._dueTree = self.mw.col.sched.deck_due_tree()
self.__renderPage(None)
return
self.web.evalWithCallback("window.pageYOffset", self.__renderPage)
def __renderPage(self, offset: int) -> None: def success(tree: DeckTreeNode) -> None:
self._dueTree = tree
self.__renderPage(None)
return
QueryOp(
parent=self.mw,
op=lambda col: col.sched.deck_due_tree(),
success=success,
).run_in_background()
else:
self.web.evalWithCallback("window.pageYOffset", self.__renderPage)
def __renderPage(self, offset: int | None) -> None:
content = DeckBrowserContent( content = DeckBrowserContent(
tree=self._renderDeckTree(self._dueTree), tree=self._renderDeckTree(self._dueTree),
stats=self._renderStats(), stats=self._renderStats(),

View file

@ -12,6 +12,7 @@ from anki.scheduler import UnburyDeck
from aqt import gui_hooks from aqt import gui_hooks
from aqt.deckdescription import DeckDescriptionDialog from aqt.deckdescription import DeckDescriptionDialog
from aqt.deckoptions import display_options_for_deck from aqt.deckoptions import display_options_for_deck
from aqt.operations import QueryOp
from aqt.operations.scheduling import ( from aqt.operations.scheduling import (
empty_filtered_deck, empty_filtered_deck,
rebuild_filtered_deck, rebuild_filtered_deck,
@ -61,12 +62,17 @@ class Overview:
self.refresh() self.refresh()
def refresh(self) -> None: def refresh(self) -> None:
self._refresh_needed = False def success(_counts: tuple) -> None:
self.mw.col.reset() self._refresh_needed = False
self._renderPage() self.mw.col.reset()
self._renderBottom() self._renderPage()
self.mw.web.setFocus() self._renderBottom()
gui_hooks.overview_did_refresh(self) self.mw.web.setFocus()
gui_hooks.overview_did_refresh(self)
QueryOp(
parent=self.mw, op=lambda col: col.sched.counts(), success=success
).run_in_background()
def refresh_if_needed(self) -> None: def refresh_if_needed(self) -> None:
if self._refresh_needed: if self._refresh_needed: