From fd23b4f6b2999ab31e42d7e567ace605d499f934 Mon Sep 17 00:00:00 2001 From: Aaron Harsh Date: Sun, 15 Jan 2012 12:49:09 -0800 Subject: [PATCH] ankiqt support for drag-and-drop changes of deck hierarchy in deckbrowser --- aqt/deckbrowser.py | 61 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py index e6abf2447..406f041f4 100644 --- a/aqt/deckbrowser.py +++ b/aqt/deckbrowser.py @@ -5,6 +5,7 @@ from aqt.qt import * from aqt.utils import askUser, getOnlyText, openLink, showWarning from anki.utils import isMac +from anki.errors import DeckRenameError import aqt class DeckBrowser(object): @@ -36,6 +37,9 @@ class DeckBrowser(object): self._onShared() elif cmd == "import": self.mw.onImport() + elif cmd == "drag": + draggedDeckDid, ontoDeckDid = arg.split(',') + self._dragDeckOnto(draggedDeckDid, ontoDeckDid) def _selDeck(self, did): self.mw.col.decks.select(did) @@ -48,7 +52,7 @@ class DeckBrowser(object): a.deck { color: #000; text-decoration: none; font-size: 12px; } a.deck:hover { text-decoration: underline; } td.opts { white-space: nowrap; } -td.deck { width: 90% } +.drag-hover { background-color: #448; } .extra { font-size: 90%; } body { margin: 1em; -webkit-user-select: none; } """ @@ -59,11 +63,42 @@ body { margin: 1em; -webkit-user-select: none; } %(tree)s + """ def _renderPage(self): css = self.mw.sharedCSS + self._css - tree = self._renderDeckTree(self.mw.col.sched.deckDueTree()) + tree = self._renderDeckTree(self.mw.col.sched.deckDueTree()) \ + + self._bogusBottomRowForDraggingDeckToTopLevel() self.web.stdHtml(self._body%dict( title=_("Decks"), tree=tree), css=css) @@ -82,7 +117,7 @@ body { margin: 1em; -webkit-user-select: none; } def indent(): return " "*3*depth # due image - buf = "" + indent() + self._dueImg(due, new) + buf = ""%did + indent() + self._dueImg(due, new) # deck link buf += " %s"% (did, name) # options @@ -92,6 +127,9 @@ body { margin: 1em; -webkit-user-select: none; } buf += self._renderDeckTree(children, depth+1) return buf + def _bogusBottomRowForDraggingDeckToTopLevel(self): + return " " + def _dueImg(self, due, new): if due: i = "clock-icon" @@ -120,9 +158,20 @@ body { margin: 1em; -webkit-user-select: none; } newName = newName.replace("'", "").replace('"', "") if not newName or newName == oldName: return - if deck in self.mw.col.decks.allNames(): - return showWarning(_("That deck already exists.")) - self.mw.col.decks.rename(deck, newName) + + try: + self.mw.col.decks.rename(deck, newName) + except DeckRenameError, e: + return showWarning(e.description) + + self.show() + + def _dragDeckOnto(self, draggedDeckDid, ontoDeckDid): + try: + self.mw.col.decks.renameForDragAndDrop(draggedDeckDid, ontoDeckDid) + except DeckRenameError, e: + return showWarning(e.description) + self.show() def _delete(self, did):