diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 1f491a8a4..27949a30f 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -12,6 +12,7 @@ from anki import hooks from anki.consts import * from anki.errors import DeckRenameError from anki.lang import _ +from anki.rsbackend import DeckTreeNode from anki.utils import ids2str, intTime # legacy code may pass this in as the type argument to .id() @@ -175,6 +176,16 @@ class DeckManager: def deck_tree(self) -> pb.DeckTreeNode: return self.col.backend.deck_tree(include_counts=False) + @classmethod + def find_deck_in_tree(cls, node: DeckTreeNode, deck_id: int) -> Optional[DeckTreeNode]: + if node.deck_id == deck_id: + return node + for child in node.children: + match = cls.find_deck_in_tree(child, deck_id) + if match: + return match + return None + def all(self) -> List: "All decks. Expensive; prefer all_names_and_ids()" return self.get_all_legacy() diff --git a/qt/aqt/deckbrowser.py b/qt/aqt/deckbrowser.py index 5470dad0c..73c9e05d6 100644 --- a/qt/aqt/deckbrowser.py +++ b/qt/aqt/deckbrowser.py @@ -268,18 +268,10 @@ where id > ?""", def _collapse(self, did: int) -> None: self.mw.col.decks.collapse(did) - self._toggle_collapsed_in_node(did, self._dueTree) - self._renderPage(reuse=True) - - def _toggle_collapsed_in_node(self, deck_id: int, node: DeckTreeNode) -> bool: - "Toggle collapsed on deck in tree. Returns true if found." - if node.deck_id == deck_id: + node = self.mw.col.decks.find_deck_in_tree(self._dueTree, did) + if node: node.collapsed = not node.collapsed - return True - for child in node.children: - if self._toggle_collapsed_in_node(deck_id, child): - return True - return False + self._renderPage(reuse=True) def _dragDeckOnto(self, draggedDeckDid, ontoDeckDid): try: