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
This commit is contained in:
Arthur Milchior 2020-02-22 03:55:21 -08:00
parent 1126ae293e
commit 927749d7a6
2 changed files with 41 additions and 15 deletions

View file

@ -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

View file

@ -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()