From 1126ae293e3c08d6533cc1badd3428598a8cd0dd Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sat, 22 Feb 2020 03:45:30 -0800 Subject: [PATCH 1/4] forceDefault to force_default --- pylib/anki/decks.py | 41 +++++++++++++++++++++++++++++++++-------- qt/aqt/studydeck.py | 2 +- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 47696ad8a..ce5644db7 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -222,20 +222,16 @@ class DeckManager: def allNames(self, dyn: bool = True, forceDefault: bool = True) -> List: "An unsorted list of all deck names." if dyn: - return [x["name"] for x in self.all(forceDefault=forceDefault)] + return [x["name"] for x in self.all(force_default=force_default)] else: return [ - x["name"] for x in self.all(forceDefault=forceDefault) if not x["dyn"] + x["name"] for x in self.all(force_default=force_default) if not x["dyn"] ] - def all(self, forceDefault: bool = True) -> List: + def all(self, force_default: int = ALL_DECKS) -> List: "A list of all decks." decks = list(self.decks.values()) - if ( - not forceDefault - and not self.col.db.scalar("select 1 from cards where did = 1 limit 1") - and len(decks) > 1 - ): + if not force_default and not self.shouldDefaultBeDisplayed(force_default): decks = [deck for deck in decks if deck["id"] != 1] return decks @@ -513,6 +509,35 @@ class DeckManager: self._recoverOrphans() self._checkDeckTree() + def shouldDeckBeDisplayed(self, deck, force_default: int = ALL_DECKS) -> bool: + """Whether the deck should appear in main window, browser side list, filter, deck selection... + + True, except for empty default deck without children""" + if deck["id"] != "1": + return True + return self.shouldDefaultBeDisplayed(force_default) + + def shouldDefaultBeDisplayed( + self, force_default: int = ALL_DECKS, defaultDeck=None + ) -> bool: + """Whether the default deck should appear in main window, browser side list, filter, deck selection... + + True, except for empty default deck (without children)""" + if force_default == ALL_DECKS: + return True + if self.col.db.scalar("select 1 from cards where did = 1 limit 1"): + return True + if len(self.decks) == 1: + return True + if force_default == WITHOUT_EMPTY_LEAF_DEFAULT: + if defaultDeck is None: + defaultDeck = self.get(1) + defaultName = defaultDeck["name"] + for name in self.allNames(): + if name.startswith(f"{defaultName}::"): + return True + return False + # Deck selection ############################################################# diff --git a/qt/aqt/studydeck.py b/qt/aqt/studydeck.py index 8a331f5e6..1a024b7c4 100644 --- a/qt/aqt/studydeck.py +++ b/qt/aqt/studydeck.py @@ -51,7 +51,7 @@ class StudyDeck(QDialog): if title: self.setWindowTitle(title) if not names: - names = sorted(self.mw.col.decks.allNames(dyn=dyn, forceDefault=False)) + names = sorted(self.mw.col.decks.allNames(dyn=dyn, force_default=False)) self.nameFunc = None self.origNames = names else: From 927749d7a6005d59a8427aba45651b94835e817c Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sat, 22 Feb 2020 03:55:21 -0800 Subject: [PATCH 2/4] Remove options for all/allNames Instead, we always see default deck if it has a child As indicated in https://github.com/ankitects/anki/pull/452 --- pylib/anki/decks.py | 42 ++++++++++++++++++++++++++++-------------- qt/aqt/browser.py | 14 +++++++++++++- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index ce5644db7..9afe63cb4 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -219,7 +219,7 @@ class DeckManager: self.select(int(list(self.decks.keys())[0])) self.save() - def allNames(self, dyn: bool = True, forceDefault: bool = True) -> List: + def allNames(self, dyn: bool = True, force_default: bool = True) -> List: "An unsorted list of all deck names." if dyn: return [x["name"] for x in self.all(force_default=force_default)] @@ -228,8 +228,15 @@ class DeckManager: x["name"] for x in self.all(force_default=force_default) if not x["dyn"] ] - def all(self, force_default: int = ALL_DECKS) -> List: - "A list of all decks." + def all(self, force_default: bool = True) -> List: + """A list of all decks. + + list contains default deck if either: + * force_default is True + * there are no other deck + * default deck contains a card + * default deck has a child (assumed not to be the case if assume_no_child) + """ decks = list(self.decks.values()) if not force_default and not self.shouldDefaultBeDisplayed(force_default): decks = [deck for deck in decks if deck["id"] != 1] @@ -509,33 +516,40 @@ class DeckManager: self._recoverOrphans() self._checkDeckTree() - def shouldDeckBeDisplayed(self, deck, force_default: int = ALL_DECKS) -> bool: + def shouldDeckBeDisplayed( + self, deck, force_default: bool = True, assume_no_child: bool = False + ) -> bool: """Whether the deck should appear in main window, browser side list, filter, deck selection... True, except for empty default deck without children""" if deck["id"] != "1": return True - return self.shouldDefaultBeDisplayed(force_default) + return self.shouldDefaultBeDisplayed(force_default, assume_no_child) def shouldDefaultBeDisplayed( - self, force_default: int = ALL_DECKS, defaultDeck=None + self, + force_default: bool = True, + assume_no_child: bool = False, + defaultDeck=None, ) -> bool: """Whether the default deck should appear in main window, browser side list, filter, deck selection... True, except for empty default deck (without children)""" - if force_default == ALL_DECKS: + if force_default: return True if self.col.db.scalar("select 1 from cards where did = 1 limit 1"): return True if len(self.decks) == 1: return True - if force_default == WITHOUT_EMPTY_LEAF_DEFAULT: - if defaultDeck is None: - defaultDeck = self.get(1) - defaultName = defaultDeck["name"] - for name in self.allNames(): - if name.startswith(f"{defaultName}::"): - return True + # looking for children + if assume_no_child: + return False + if defaultDeck is None: + defaultDeck = self.get(1) + defaultName = defaultDeck["name"] + for name in self.allNames(): + if name.startswith(f"{defaultName}::"): + return True return False # Deck selection diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py index 301683d95..d48890eff 100644 --- a/qt/aqt/browser.py +++ b/qt/aqt/browser.py @@ -1156,6 +1156,15 @@ by clicking on one on the left.""" def fillGroups(root, grps, head=""): for g in grps: + baseName = g[0] + did = g[1] + children = g[5] + if str(did) == "1" and not children: + if not self.mw.col.decks.shouldDefaultBeDisplayed( + force_default=False, assume_no_child=True + ): + + continue item = SidebarItem( g[0], ":/icons/deck.svg", @@ -1312,7 +1321,10 @@ by clicking on one on the left.""" subm.addSeparator() addDecks(subm, children) else: - parent.addItem(shortname, self._filterFunc("deck", name)) + if did != 1 or self.col.decks.shouldDefaultBeDisplayed( + force_default=False, assume_no_child=True + ): + parent.addItem(shortname, self._filterFunc("deck", name)) # fixme: could rewrite to avoid calculating due # in the future alldecks = self.col.sched.deckDueTree() From 8e15ed7e1333424a1e567aac32e399254b43e644 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sat, 22 Feb 2020 03:59:35 -0800 Subject: [PATCH 3/4] defaultDeck to default_deck --- pylib/anki/decks.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 9afe63cb4..c01d25bb9 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -530,7 +530,7 @@ class DeckManager: self, force_default: bool = True, assume_no_child: bool = False, - defaultDeck=None, + default_deck=None, ) -> bool: """Whether the default deck should appear in main window, browser side list, filter, deck selection... @@ -544,9 +544,9 @@ class DeckManager: # looking for children if assume_no_child: return False - if defaultDeck is None: - defaultDeck = self.get(1) - defaultName = defaultDeck["name"] + if default_deck is None: + default_deck = self.get(1) + defaultName = default_deck["name"] for name in self.allNames(): if name.startswith(f"{defaultName}::"): return True From bb86c9dbd64900b90bdc2f7c85d01b0a1401ae24 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sat, 22 Feb 2020 04:08:01 -0800 Subject: [PATCH 4/4] should(default)deckbedisplayed in snake case --- pylib/anki/decks.py | 8 ++++---- qt/aqt/browser.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index c01d25bb9..084dc3238 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -238,7 +238,7 @@ class DeckManager: * default deck has a child (assumed not to be the case if assume_no_child) """ decks = list(self.decks.values()) - if not force_default and not self.shouldDefaultBeDisplayed(force_default): + if not force_default and not self.should_default_be_displayed(force_default): decks = [deck for deck in decks if deck["id"] != 1] return decks @@ -516,7 +516,7 @@ class DeckManager: self._recoverOrphans() self._checkDeckTree() - def shouldDeckBeDisplayed( + def should_deck_be_displayed( self, deck, force_default: bool = True, assume_no_child: bool = False ) -> bool: """Whether the deck should appear in main window, browser side list, filter, deck selection... @@ -524,9 +524,9 @@ class DeckManager: True, except for empty default deck without children""" if deck["id"] != "1": return True - return self.shouldDefaultBeDisplayed(force_default, assume_no_child) + return self.should_default_be_displayed(force_default, assume_no_child) - def shouldDefaultBeDisplayed( + def should_default_be_displayed( self, force_default: bool = True, assume_no_child: bool = False, diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py index d48890eff..98832b221 100644 --- a/qt/aqt/browser.py +++ b/qt/aqt/browser.py @@ -1160,7 +1160,7 @@ by clicking on one on the left.""" did = g[1] children = g[5] if str(did) == "1" and not children: - if not self.mw.col.decks.shouldDefaultBeDisplayed( + if not self.mw.col.decks.should_default_be_displayed( force_default=False, assume_no_child=True ): @@ -1321,7 +1321,7 @@ by clicking on one on the left.""" subm.addSeparator() addDecks(subm, children) else: - if did != 1 or self.col.decks.shouldDefaultBeDisplayed( + if did != 1 or self.col.decks.should_default_be_displayed( force_default=False, assume_no_child=True ): parent.addItem(shortname, self._filterFunc("deck", name))