mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
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:
parent
d16faacd0f
commit
0ef28853fd
3 changed files with 28 additions and 13 deletions
|
@ -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)
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue