" % node.deck_id
)
# children
if not node.collapsed:
for child in node.children:
buf += self._render_deck_node(child, ctx)
return buf
def _topLevelDragRow(self) -> str:
return "
"
# Options
##########################################################################
def _showOptions(self, did: str) -> None:
m = QMenu(self.mw)
a = m.addAction(tr.actions_rename())
assert a is not None
qconnect(a.triggered, lambda b, did=did: self._rename(DeckId(int(did))))
a = m.addAction(tr.actions_options())
assert a is not None
qconnect(a.triggered, lambda b, did=did: self._options(DeckId(int(did))))
a = m.addAction(tr.actions_export())
assert a is not None
qconnect(a.triggered, lambda b, did=did: self._export(DeckId(int(did))))
a = m.addAction(tr.actions_delete())
assert a is not None
qconnect(a.triggered, lambda b, did=did: self._delete(DeckId(int(did))))
gui_hooks.deck_browser_will_show_options_menu(m, int(did))
m.popup(QCursor.pos())
def _export(self, did: DeckId) -> None:
self.mw.onExport(did=did)
def _rename(self, did: DeckId) -> None:
def prompt(name: str) -> None:
new_name = getOnlyText(
tr.decks_new_deck_name(), default=name, title=tr.actions_rename()
)
if not new_name or new_name == name:
return
else:
rename_deck(
parent=self.mw, deck_id=did, new_name=new_name
).run_in_background()
QueryOp(
parent=self.mw, op=lambda col: col.decks.name(did), success=prompt
).run_in_background()
def _options(self, did: DeckId) -> None:
display_options_for_deck_id(did)
def _collapse(self, did: DeckId) -> None:
node = self.mw.col.decks.find_deck_in_tree(self._render_data.tree, did)
if node:
node.collapsed = not node.collapsed
set_deck_collapsed(
parent=self.mw,
deck_id=did,
collapsed=node.collapsed,
scope=DeckCollapseScope.REVIEWER,
).run_in_background()
self._renderPage(reuse=True)
def _handle_drag_and_drop(self, source: DeckId, target: DeckId) -> None:
reparent_decks(
parent=self.mw, deck_ids=[source], new_parent=target
).run_in_background()
def _delete(self, did: DeckId) -> None:
deck = self.mw.col.decks.find_deck_in_tree(self._render_data.tree, did)
assert deck is not None
deck_name = deck.name
remove_decks(
parent=self.mw, deck_ids=[did], deck_name=deck_name
).run_in_background()
# Top buttons
######################################################################
drawLinks = [
["", "shared", tr.decks_get_shared()],
["", "create", tr.decks_create_deck()],
["Ctrl+Shift+I", "import", tr.decks_import_file()],
]
def _drawButtons(self) -> None:
buf = ""
drawLinks = deepcopy(self.drawLinks)
for b in drawLinks:
if b[0]:
b[0] = tr.actions_shortcut_key(val=shortcut(b[0]))
buf += """
""" % tuple(b)
self.bottom.draw(
buf=buf,
link_handler=self._linkHandler,
web_context=DeckBrowserBottomBar(self),
)
def _onShared(self) -> None:
openLink(f"{aqt.appShared}decks/")
def _on_create(self) -> None:
if op := add_deck_dialog(
parent=self.mw, default_text=self.mw.col.decks.current()["name"]
):
op.run_in_background()
######################################################################
def _v1_upgrade_message(self, required: bool) -> str:
if not required:
return ""
update_required = tr.scheduling_update_required().replace("V2", "v3")
return f"""