diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py index d595a6f9b..709ef8b75 100644 --- a/aqt/deckbrowser.py +++ b/aqt/deckbrowser.py @@ -3,6 +3,7 @@ # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html import time, os, stat, shutil +from operator import itemgetter from PyQt4.QtCore import * from PyQt4.QtGui import * from anki import Deck @@ -46,27 +47,6 @@ class DeckBrowser(object): self._decks = [] addHook("deckClosing", self.onClose) - def _linkHandler(self, url): - (cmd, arg) = url.split(":") - if cmd == "open": - deck = self._decks[int(arg)]['path'] - self.mw.loadDeck(deck) - elif cmd == "opts": - self._optsForRow(int(arg)) - - def _keyHandler(self, evt): - txt = evt.text() - if ((txt >= "0" and txt <= "9") or - (txt >= "a" and txt <= "z")): - self._openAccel(txt) - evt.accept() - evt.ignore() - - def _openAccel(self, txt): - for d in self._decks: - if d['accel'] == txt: - self.mw.loadDeck(d['path']) - def show(self): self.web.setLinkHandler(self._linkHandler) self.mw.setKeyHandler(self._keyHandler) @@ -110,6 +90,33 @@ later by using File>Close. d['time'] = self.deck._dailyStats.reviewTime d['reps'] = self.deck._dailyStats.reps + # Event handlers + ########################################################################## + + def _linkHandler(self, url): + (cmd, arg) = url.split(":") + if cmd == "open": + deck = self._decks[int(arg)]['path'] + self.mw.loadDeck(deck) + elif cmd == "opts": + self._optsForRow(int(arg)) + + def _keyHandler(self, evt): + txt = evt.text() + if ((txt >= "0" and txt <= "9") or + (txt >= "a" and txt <= "z")): + self._openAccel(txt) + evt.accept() + evt.ignore() + + def _openAccel(self, txt): + for d in self._decks: + if d['accel'] == txt: + self.mw.loadDeck(d['path']) + + # HTML generation + ########################################################################## + def _deckRow(self, c, max, deck): buf = "" ok = deck['state'] == 'ok' @@ -159,36 +166,6 @@ later by using File>Close. buf += "
" return buf - def _optsForRow(self, n): - m = QMenu(self.mw) - # hide - a = m.addAction(QIcon(":/icons/edit-undo.png"), _("Hide From List")) - a.connect(a, SIGNAL("activated()"), lambda n=n: self._hideRow(n)) - # delete - a = m.addAction(QIcon(":/icons/editdelete.png"), _("Delete")) - a.connect(a, SIGNAL("activated()"), lambda n=n: self._deleteRow(n)) - m.exec_(QCursor.pos()) - - def _buttons(self): - # refresh = QPushButton(_("Refresh")) - # refresh.setToolTip(_("Check due counts again (F5)")) - # refresh.setShortcut(_("F5")) - # self.connect(refresh, SIGNAL("clicked()"), - # self.refresh) - # layout.addItem(QSpacerItem(1,20, QSizePolicy.Preferred, - # QSizePolicy.Preferred), c+2, 5) - # layout.addWidget(refresh, c+3, 5) - # more = QPushButton(_("More")) - # moreMenu = QMenu() - # a = moreMenu.addAction(QIcon(":/icons/edit-undo.png"), - # _("Forget Inaccessible Decks")) - # a.connect(a, SIGNAL("triggered()"), - # self.onDeckBrowserForgetInaccessible) - # more.setMenu(moreMenu) - # layout.addWidget(more, c+3, 6) - # self.moreMenus.append(moreMenu) - return "" - def _summary(self): # summarize reps = 0 @@ -217,6 +194,47 @@ later by using File>Close. 'rev': rev, 'new': new} return line1+'
'+line2 + # Options + ########################################################################## + + def _optsForRow(self, n): + m = QMenu(self.mw) + # hide + a = m.addAction(QIcon(":/icons/edit-undo.png"), _("Hide From List")) + a.connect(a, SIGNAL("activated()"), lambda n=n: self._hideRow(n)) + # delete + a = m.addAction(QIcon(":/icons/editdelete.png"), _("Delete")) + a.connect(a, SIGNAL("activated()"), lambda n=n: self._deleteRow(n)) + m.exec_(QCursor.pos()) + + def _buttons(self): + # refresh = QPushButton(_("Refresh")) + return "" + + def _hideRow(self, c): + if aqt.utils.askUser(_("""\ +Hide %s from the list? You can File>Open it again later.""") % + self._decks[c]['name']): + self.mw.config.delRecentDeck(self._decks[c]['path']) + del self._decks[c] + self.refresh() + + def _deleteRow(self, c): + if aqt.utils.askUser(_("""\ +Delete %s? If this deck is synchronized the online version will \ +not be touched.""") % self._decks[c]['name']): + deck = self._decks[c]['path'] + os.unlink(deck) + try: + shutil.rmtree(re.sub(".anki$", ".media", deck)) + except OSError: + pass + self.mw.config.delRecentDeck(deck) + self.refresh() + + # Data gathering + ########################################################################## + def _checkDecks(self, forget=False): self._decks = [] decks = self.mw.config.recentDecks() @@ -272,21 +290,8 @@ later by using File>Close. self._reorderDecks() def _reorderDecks(self): - print "reorder decks" - # return - # if self.mw.config['deckBrowserOrder'] == 0: - # self._decks.sort(key=itemgetter('mod'), - # reverse=True) - # else: - # def custcmp(a, b): - # x = cmp(not not b['due'], not not a['due']) - # if x: - # return x - # x = cmp(not not b['new'], not not a['new']) - # if x: - # return x - # return cmp(a['mod'], b['mod']) - # self._decks.sort(cmp=custcmp) + # for now, sort by deck name + self._decks.sort(key=itemgetter('name')) # after the decks are sorted, assign shortcut keys to them for c, d in enumerate(self._decks): if c > 35: @@ -299,24 +304,3 @@ later by using File>Close. def refresh(self): self._browserLastRefreshed = 0 self.show() - - def _hideRow(self, c): - if aqt.utils.askUser(_("""\ -Hide %s from the list? You can File>Open it again later.""") % - self._decks[c]['name']): - self.mw.config.delRecentDeck(self._decks[c]['path']) - del self._decks[c] - self.refresh() - - def _deleteRow(self, c): - if aqt.utils.askUser(_("""\ -Delete %s? If this deck is synchronized the online version will \ -not be touched.""") % self._decks[c]['name']): - deck = self._decks[c]['path'] - os.unlink(deck) - try: - shutil.rmtree(re.sub(".anki$", ".media", deck)) - except OSError: - pass - self.mw.config.delRecentDeck(deck) - self.refresh()