From ae43b78faa0411472f0efead381888ee61225e6d Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 11 Apr 2011 19:36:56 +0900 Subject: [PATCH] reorganize, and remove placeholder which isn't available on older qt --- aqt/browser.py | 405 ++++++++++++++++---------------------------- designer/browser.ui | 3 - 2 files changed, 148 insertions(+), 260 deletions(-) diff --git a/aqt/browser.py b/aqt/browser.py index e7d32f5f4..b2618ea1f 100644 --- a/aqt/browser.py +++ b/aqt/browser.py @@ -18,6 +18,8 @@ from anki.db import * from anki.stats import CardStats from anki.hooks import runHook, addHook, removeHook +# fixme: notice added tags? + COLOUR_SUSPENDED1 = "#ffffcc" COLOUR_SUSPENDED2 = "#ffffaa" COLOUR_INACTIVE1 = "#ffcccc" @@ -288,60 +290,30 @@ class Browser(QMainWindow): self.updateSortOrder() self.updateFont() self.form.searchEdit.setFocus() - self.drawTags() self.updateFilterLabel() self.show() self.form.searchEdit.setText("is:recent") self.form.searchEdit.selectAll() - self.updateSearch() + self.onSearch() # if self.parent.card: # self.card = self.parent.card #self.updateSearch() - def setupTable(self): - self.model = DeckModel(self) - self.form.tableView.setSortingEnabled(False) - self.form.tableView.setShowGrid(False) - self.form.tableView.setModel(self.model) - self.form.tableView.selectionModel() - self.connect(self.form.tableView.selectionModel(), - SIGNAL("selectionChanged(QItemSelection,QItemSelection)"), - self.updateFilterLabel) - self.form.tableView.setItemDelegate(StatusDelegate(self, self.model)) - def setupToolbar(self): self.form.toolBar.setIconSize(QSize(self.mw.config['iconSize'], self.mw.config['iconSize'])) self.form.toolBar.toggleViewAction().setText(_("Toggle Toolbar")) - def setupSearch(self): - self.filterTimer = None - self.connect(self.form.searchButton, - SIGNAL("clicked()"), - self.updateSearch) - self.connect(self.form.searchEdit, - SIGNAL("returnPressed()"), - self.updateSearch) - self.setTabOrder(self.form.searchEdit, self.form.tableView) - - def setupSort(self): - self.form.sortBox.setMaxVisibleItems(30) - self.sortIndex = int(self.deck.conf.get("sortIdx", "0")) - self.drawSort() - self.connect(self.form.sortBox, SIGNAL("activated(int)"), - self.sortChanged) - self.sortChanged(self.sortIndex, refresh=False) - self.connect(self.form.sortOrder, SIGNAL("clicked()"), - self.reverseOrder) - def setupHeaders(self): + vh = self.form.tableView.verticalHeader() + hh = self.form.tableView.horizontalHeader() if not sys.platform.startswith("win32"): - self.form.tableView.verticalHeader().hide() - self.form.tableView.horizontalHeader().show() - restoreHeader(self.form.tableView.horizontalHeader(), "editor") + vh.hide() + hh.show() + restoreHeader(hh, "editor") for i in range(2): - self.form.tableView.horizontalHeader().setResizeMode(i, QHeaderView.Stretch) - self.form.tableView.horizontalHeader().setResizeMode(2, QHeaderView.Interactive) + hh.setResizeMode(i, QHeaderView.Stretch) + hh.setResizeMode(2, QHeaderView.Interactive) def setupMenus(self): # actions @@ -377,12 +349,6 @@ class Browser(QMainWindow): c(f.actionGuide, s, self.onHelp) runHook('browser.setupMenus', self) - def cardRow(self): - try: - return self.model.cards.index(self.card.id) - except: - return -1 - def updateFont(self): self.form.tableView.setFont(QFont( self.mw.config['editFontFamily'], @@ -391,61 +357,138 @@ class Browser(QMainWindow): self.mw.config['editLineSize']) self.model.reset() - def drawTags(self): - return - self.form.tagList.setMaxVisibleItems(30) - self.form.tagList.view().setMinimumWidth(200) - self.form.tagList.setFixedWidth(170) - self.form.tagList.clear() - alltags = [None, "Marked", None, None, "Leech", None, None] - # system tags - self.form.tagList.addItem(_("Show All Cards")) - self.form.tagList.addItem(QIcon(":/icons/rating.png"), - _('Marked')) - self.form.tagList.addItem(QIcon(":/icons/media-playback-pause.png"), - _('Suspended')) - self.form.tagList.addItem(QIcon(":/icons/chronometer.png"), - _('Due')) - self.form.tagList.addItem(QIcon(":/icons/emblem-important.png"), - _('Leech')) - self.form.tagList.addItem(QIcon(":/icons/editclear.png"), - _('No fact tags')) - self.form.tagList.insertSeparator( - self.form.tagList.count()) - # model and card templates - tplates = set() - for m in self.deck.models().values(): - tplates.update([t['name'] for t in m.templates]) - for (type, sql, icon) in ( - ("models", "select name from models", "contents.png"), - ("cms", list(tplates), "Anki_Card.png")): - d = {} - tagss = self.deck.db.column0(sql) - for tags in tagss: - for tag in parseTags(tags): - d[tag] = 1 - sortedtags = sorted(d.keys()) - alltags.extend(sortedtags) - icon = QIcon(":/icons/" + icon) - for t in sortedtags: - self.form.tagList.addItem(icon, t.replace("_", " ")) - if sortedtags: - self.form.tagList.insertSeparator( - self.form.tagList.count()) - alltags.append(None) - # fact tags - alluser = sorted(self.deck.allTags()) - for tag in alltags: + def closeEvent(self, evt): + saveSplitter(self.form.splitter, "editor1") + saveSplitter(self.form.splitter_2, "editor2") + saveSplitter(self.form.splitter_3, "editor3") + self.editor.saveNow() + self.editor.setFact(None) + saveGeom(self, "editor") + saveState(self, "editor") + saveHeader(self.form.tableView.horizontalHeader(), "editor") + self.hide() + aqt.dialogs.close("Browser") + self.teardownHooks() + evt.accept() + + def keyPressEvent(self, evt): + "Show answer on RET or register answer." + if evt.key() in (Qt.Key_Escape,): + self.close() + + # Searching + ###################################################################### + + def setupSearch(self): + self.filterTimer = None + self.connect(self.form.searchButton, + SIGNAL("clicked()"), + self.onSearch) + self.connect(self.form.searchEdit, + SIGNAL("returnPressed()"), + self.onSearch) + self.setTabOrder(self.form.searchEdit, self.form.tableView) + + def reverseOrder(self): + self.deck.setVar("reverseOrder", not self.deck.getInt("reverseOrder")) + self.model.cards.reverse() + self.model.reset() + self.focusCard() + self.updateSortOrder() + + def onSearch(self, force=True): + # fixme: + # if self.mw.inDbHandler: + # return + self.model.searchStr = unicode(self.form.searchEdit.text()) + self.model.showMatching(force) + self.updateFilterLabel() + self.filterTimer = None + if self.model.cards: + self.form.cardInfoGroup.show() + self.form.fieldsArea.show() + else: + self.form.cardInfoGroup.hide() + self.form.fieldsArea.hide() + if not self.focusCard(): + if self.model.cards: + self.form.tableView.selectRow(0) + if not self.model.cards: + self.editor.setFact(None) + + def updateFilterLabel(self): + selected = len(self.form.tableView.selectionModel().selectedRows()) + self.setWindowTitle(ngettext("Browser (%(cur)d " + "of %(tot)d card shown; %(sel)s)", "Browser (%(cur)d " + "of %(tot)d cards shown; %(sel)s)", self.deck.cardCount) % + { + "cur": len(self.model.cards), + "tot": self.deck.cardCount(), + "sel": ngettext("%d selected", "%d selected", selected) % selected + } + " - " + self.deck.name()) + + # Table view + ###################################################################### + + def setupTable(self): + self.model = DeckModel(self) + self.form.tableView.setSortingEnabled(False) + self.form.tableView.setShowGrid(False) + self.form.tableView.setModel(self.model) + self.form.tableView.selectionModel() + self.connect(self.form.tableView.selectionModel(), + SIGNAL("selectionChanged(QItemSelection,QItemSelection)"), + self.updateFilterLabel) + self.form.tableView.setItemDelegate(StatusDelegate(self, self.model)) + + def rowChanged(self, current, previous): + self.currentRow = current + self.card = self.model.getCard(current) + if not self.card: + self.editor.setFact(None, True) + return + fact = self.card.fact() + self.editor.setFact(fact) + self.editor.card = self.card + self.showCardInfo(self.card) + self.updateToggles() + + def cardRow(self): + try: + return self.model.cards.index(self.card.id) + except: + return -1 + + def focusCard(self): + print "focus" + if self.card: try: - alluser.remove(tag) + self.card.id except: - pass - icon = QIcon(":/icons/Anki_Fact.png") - for t in alluser: - t = t.replace("_", " ") - self.form.tagList.addItem(icon, t) - alltags.extend(alluser) - self.alltags = alltags + return False + row = self.cardRow() + if row >= 0: + sm = self.form.tableView.selectionModel() + sm.clear() + self.form.tableView.selectRow(row) + self.form.tableView.scrollTo( + self.model.index(row,0), + self.form.tableView.PositionAtCenter) + return True + return False + + # Sorting + ###################################################################### + + def setupSort(self): + self.form.sortBox.setMaxVisibleItems(30) + self.sortIndex = int(self.deck.conf.get("sortIdx", "0")) + self.drawSort() + self.connect(self.form.sortBox, SIGNAL("activated(int)"), + self.sortChanged) + self.sortChanged(self.sortIndex, refresh=False) + self.connect(self.form.sortOrder, SIGNAL("clicked()"), + self.reverseOrder) def drawSort(self): self.sortList = [ @@ -506,140 +549,8 @@ class Browser(QMainWindow): if refresh: self.model.showMatching() self.updateFilterLabel() - self.onEvent() self.focusCard() - def rebuildSortIndex(self, key): - if key not in ( - "question", "answer", "created", "modified", "due", "interval", - "reps", "factor", "noCount", "firstAnswered"): - return - old = self.deck.db.scalar("select sql from sqlite_master where name = :k", - k="ix_cards_sort") - if old and key in old: - return - self.deck.startProgress(2) - self.deck.updateProgress(_("Building Index...")) - self.deck.db.statement("drop index if exists ix_cards_sort") - self.deck.updateProgress() - if key in ("question", "answer"): - key = key + " collate nocase" - self.deck.db.statement( - "create index ix_cards_sort on cards (%s)" % key) - self.deck.db.statement("analyze") - self.deck.finishProgress() - - def tagChanged(self, idx): - if idx == 0: - filter = "" - elif idx == 1: - filter = "tag:marked" - elif idx == 2: - filter = "is:suspended" - elif idx == 3: - filter = "is:due" - elif idx == 4: - filter = "tag:leech" - elif idx == 5: - filter = "tag:none" - else: - filter = "tag:" + self.alltags[idx] - self.lastFilter = filter - self.form.searchEdit.setText(filter) - self.updateSearch() - - def updateFilterLabel(self): - selected = len(self.form.tableView.selectionModel().selectedRows()) - self.setWindowTitle(ngettext("Browser (%(cur)d " - "of %(tot)d card shown; %(sel)s)", "Browser (%(cur)d " - "of %(tot)d cards shown; %(sel)s)", self.deck.cardCount) % - { - "cur": len(self.model.cards), - "tot": self.deck.cardCount(), - "sel": ngettext("%d selected", "%d selected", selected) % selected - } + " - " + self.deck.name()) - - def onEvent(self, type='field'): - if self.deck.undoName(): - self.form.actionUndo.setText(_("Undo %s") % - self.deck.undoName()) - self.form.actionUndo.setEnabled(True) - else: - self.form.actionUndo.setEnabled(False) - if type=="all": - self.updateAfterCardChange() - else: - # update list - # if self.currentRow and self.model.cards: - # self.model.updateCard(self.currentRow) - if type == "tag": - self.drawTags() - - def updateSearch(self, force=True): - # fixme: - # if self.mw.inDbHandler: - # return - self.model.searchStr = unicode(self.form.searchEdit.text()) - self.model.showMatching(force) - self.updateFilterLabel() - self.onEvent() - self.filterTimer = None - if self.model.cards: - self.form.cardInfoGroup.show() - self.form.fieldsArea.show() - else: - self.form.cardInfoGroup.hide() - self.form.fieldsArea.hide() - if not self.focusCard(): - if self.model.cards: - self.form.tableView.selectRow(0) - if not self.model.cards: - self.editor.setFact(None) - - def focusCard(self): - print "focus" - if self.card: - try: - self.card.id - except: - return False - row = self.cardRow() - if row >= 0: - sm = self.form.tableView.selectionModel() - sm.clear() - self.form.tableView.selectRow(row) - self.form.tableView.scrollTo( - self.model.index(row,0), - self.form.tableView.PositionAtCenter) - return True - return False - - def onClose(self): - saveSplitter(self.form.splitter, "editor1") - saveSplitter(self.form.splitter_2, "editor2") - saveSplitter(self.form.splitter_3, "editor3") - self.editor.saveNow() - self.editor.setFact(None) - saveGeom(self, "editor") - saveState(self, "editor") - saveHeader(self.form.tableView.horizontalHeader(), "editor") - self.hide() - aqt.dialogs.close("Browser") - self.teardownHooks() - return True - - def closeEvent(self, evt): - if self.onClose(): - evt.accept() - else: - evt.ignore() - - def keyPressEvent(self, evt): - "Show answer on RET or register answer." - if evt.key() in (Qt.Key_Escape,): - self.close() - - # Filter tree ###################################################################### @@ -680,7 +591,7 @@ class Browser(QMainWindow): txt = "" txt = " ".join(items) self.form.searchEdit.setText(txt) - self.updateSearch() + self.onSearch() def _modelTree(self): root = QTreeWidgetItem([_("Models")]) @@ -747,24 +658,12 @@ class Browser(QMainWindow): self.editor = aqt.editor.Editor(self.mw, self.form.fieldsArea) self.editor.stealFocus = False - # fixme: - #self.editor.onChange = self.onEvent self.connect(self.form.tableView.selectionModel(), SIGNAL("currentRowChanged(QModelIndex, QModelIndex)"), self.rowChanged) - def rowChanged(self, current, previous): - self.currentRow = current - self.card = self.model.getCard(current) - if not self.card: - self.editor.setFact(None, True) - return - fact = self.card.fact() - self.editor.setFact(fact) - self.editor.card = self.card - self.showCardInfo(self.card) - self.onEvent() - self.updateToggles() + # Card info + ###################################################################### def setupCardInfo(self): self.card = None @@ -799,7 +698,6 @@ where id in (%s)""" % ",".join([ self.currentRow = self.form.tableView.currentIndex() self.rowChanged(self.currentRow, None) self.model.refresh() - self.drawTags() self.mw.reset() # Menu options @@ -822,7 +720,7 @@ where id in (%s)""" % ",".join([ self.deck.setUndoEnd(n) new = min(max(0, new), len(self.model.cards) - 1) self.form.tableView.selectRow(new) - self.updateSearch() + self.onSearch() self.updateAfterCardChange() def addTags(self, tags=None, label=None): @@ -962,7 +860,7 @@ where id in %s""" % ids2str(sf)) self.deck.flushMod() self.deck.finishProgress() self.deck.setUndoEnd(n) - self.updateSearch() + self.onSearch() self.updateAfterCardChange() def cram(self): @@ -987,7 +885,7 @@ where id in %s""" % ids2str(sf)) self.deck.setUndoStart(n) self.deck.changeModel(sf, *d.ret) self.deck.setUndoEnd(n) - self.updateSearch() + self.onSearch() self.updateAfterCardChange() # Edit: selection @@ -1015,13 +913,6 @@ where id in %s""" % ids2str(sf)) self.form.tableView.selectAll() sm.select(items, QItemSelectionModel.Deselect | QItemSelectionModel.Rows) - def reverseOrder(self): - self.deck.setVar("reverseOrder", not self.deck.getInt("reverseOrder")) - self.model.cards.reverse() - self.model.reset() - self.focusCard() - self.updateSortOrder() - # Edit: undo ###################################################################### @@ -1105,7 +996,7 @@ where id in %s""" % ids2str(sf)) self.deck.setUndoEnd(n) self.deck.finishProgress() self.mw.reset() - self.updateSearch() + self.onSearch() self.updateAfterCardChange() if changed is not None: ui.utils.showInfo(ngettext("%(a)d of %(b)d fact updated", "%(a)d of %(b)d facts updated", len(sf)) % { @@ -1189,7 +1080,7 @@ select fm.id, fm.name from fieldmodels fm""") def dupeLinkClicked(self, link): self.form.searchEdit.setText(str(link.toString())) - self.updateSearch() + self.onSearch() self.onFact() # Jumping diff --git a/designer/browser.ui b/designer/browser.ui index 487db5838..a6e08ec87 100644 --- a/designer/browser.ui +++ b/designer/browser.ui @@ -79,9 +79,6 @@ - - Type here to search -