From 068a63270dd8f102ee226f8ae5578b83ea6ea922 Mon Sep 17 00:00:00 2001 From: Houssam Salem Date: Sat, 22 Feb 2014 21:30:32 +1100 Subject: [PATCH 1/2] Changed location of import button (#1018). Also updated help link in same window to point to a valid anchor. --- aqt/importing.py | 11 ++++++----- designer/importing.ui | 19 ++----------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/aqt/importing.py b/aqt/importing.py index fa07a07e8..ef99958c8 100644 --- a/aqt/importing.py +++ b/aqt/importing.py @@ -79,6 +79,9 @@ class ImportDialog(QDialog): self.updateDelimiterButtonText() self.frm.allowHTML.setChecked(self.mw.pm.profile.get('allowHTML', True)) self.frm.importMode.setCurrentIndex(self.mw.pm.profile.get('importMode', 1)) + # import button + b = QPushButton(_("Import")) + self.frm.buttonBox.addButton(b, QDialogButtonBox.AcceptRole) self.exec_() def setupOptions(self): @@ -87,8 +90,6 @@ class ImportDialog(QDialog): self.mw, self.frm.modelArea, label=False) self.deck = aqt.deckchooser.DeckChooser( self.mw, self.frm.deckArea, label=False) - self.connect(self.frm.importButton, SIGNAL("clicked()"), - self.doImport) def modelChanged(self): self.importer.model = self.mw.col.models.current() @@ -138,8 +139,8 @@ you can enter it here. Use \\t to represent tab."""), d = `d` txt = _("Fields separated by: %s") % d self.frm.autoDetect.setText(txt) - - def doImport(self, update=False): + + def accept(self): self.importer.mapping = self.mapping if not self.importer.mappingOk(): showWarning( @@ -249,7 +250,7 @@ you can enter it here. Use \\t to represent tab."""), QDialog.reject(self) def helpRequested(self): - openHelp("FileImport") + openHelp("importing") def showUnicodeWarning(): diff --git a/designer/importing.ui b/designer/importing.ui index c05ab361b..ce14706bc 100644 --- a/designer/importing.ui +++ b/designer/importing.ui @@ -94,20 +94,6 @@ - - - - - - &Import - - - true - - - - - @@ -133,8 +119,8 @@ 0 0 - 402 - 206 + 529 + 251 @@ -158,7 +144,6 @@ - importButton buttonBox From 3aeb5d86da28b417547620696dbf61a851c07320 Mon Sep 17 00:00:00 2001 From: Houssam Salem Date: Wed, 9 Apr 2014 04:35:00 +1000 Subject: [PATCH 2/2] Added search saving feature to card browser. --- aqt/browser.py | 100 ++++++++++++++++++++++++ designer/icons.qrc | 2 + designer/icons/emblem-favorite-dark.png | Bin 0 -> 2324 bytes designer/icons/emblem-favorite-off.png | Bin 0 -> 2189 bytes 4 files changed, 102 insertions(+) create mode 100644 designer/icons/emblem-favorite-dark.png create mode 100644 designer/icons/emblem-favorite-off.png diff --git a/aqt/browser.py b/aqt/browser.py index f167a7b37..ae4f0439e 100644 --- a/aqt/browser.py +++ b/aqt/browser.py @@ -513,6 +513,9 @@ class Browser(QMainWindow): self.setTabOrder(self.form.searchEdit, self.form.tableView) self.form.searchEdit.setCompleter(None) self.form.searchEdit.addItems(self.mw.pm.profile['searchHistory']) + self.connect(self.form.searchEdit.lineEdit(), + SIGNAL("returnPressed()"), + self.onSearch) def onSearch(self, reset=True): "Careful: if reset is true, the current note is saved." @@ -753,6 +756,7 @@ by clicking on one on the left.""")) self.form.tree.clear() root = self.form.tree self._systemTagTree(root) + self._favTree(root) self._decksTree(root) self._modelTree(root) self._userTagTree(root) @@ -815,6 +819,18 @@ by clicking on one on the left.""")) item.setIcon(0, QIcon(":/icons/" + icon)) return root + def _favTree(self, root): + saved = self.col.conf.get('savedFilters', []) + if not saved: + # Don't add favourites to tree if none saved + return + root = self.CallbackItem(root, _("My Searches"), None) + root.setExpanded(True) + root.setIcon(0, QIcon(":/icons/emblem-favorite-dark.png")) + for name, filt in saved.items(): + item = self.CallbackItem(root, name, lambda s=filt: self.setFilter(s)) + item.setIcon(0, QIcon(":/icons/emblem-favorite-dark.png")) + def _userTagTree(self, root): for t in sorted(self.col.tags.all()): if t.lower() == "marked" or t.lower() == "leech": @@ -1723,3 +1739,87 @@ a { margin-right: 1em; } self.browser.addTags() elif l == "deletetag": self.browser.deleteTags() + + +# Favourites button +###################################################################### +class FavouritesLineEdit(QLineEdit): + buttonClicked = pyqtSignal(bool) + + def __init__(self, mw, browser, parent=None): + super(FavouritesLineEdit, self).__init__(parent) + self.mw = mw + self.browser = browser + # add conf if missing + if not self.mw.col.conf.has_key('savedFilters'): + self.mw.col.conf['savedFilters'] = {} + self.button = QToolButton(self) + self.button.setStyleSheet('border: 0px;') + self.button.setCursor(Qt.ArrowCursor) + self.button.clicked.connect(self.buttonClicked.emit) + self.setIcon(':/icons/emblem-favorite-off.png') + # flag to raise save or delete dialog on button click + self.doSave = True + # name of current saved filter (if query matches) + self.name = None + self.buttonClicked.connect(self.onClicked) + self.connect(self, SIGNAL("textEdited(QString)"), self.updateButton) + + def resizeEvent(self, event): + buttonSize = self.button.sizeHint() + frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) + self.button.move(self.rect().right() - frameWidth - buttonSize.width(), + (self.rect().bottom() - buttonSize.height() + 1) / 2) + super(FavouritesLineEdit, self).resizeEvent(event) + + def setIcon(self, path): + self.button.setIcon(QIcon(path)) + + def setText(self, txt): + super(FavouritesLineEdit, self).setText(txt) + self.updateButton() + + def updateButton(self, reset=True): + # If search text is a saved query, switch to the delete button. + # Otherwise show save button. + txt = unicode(self.text()).strip() + for key, value in self.mw.col.conf['savedFilters'].items(): + if txt == value: + self.doSave = False + self.name = key + self.setIcon(QIcon(":/icons/emblem-favorite.png")) + return + self.doSave = True + self.setIcon(QIcon(":/icons/emblem-favorite-off.png")) + + def onClicked(self): + if self.doSave: + self.saveClicked() + else: + self.deleteClicked() + + def saveClicked(self): + txt = unicode(self.text()).strip() + dlg = QInputDialog(self) + dlg.setInputMode(QInputDialog.TextInput) + dlg.setLabelText(_("The current search terms will be added as a new " + "item in the sidebar.\n" + "Search name:")) + dlg.setWindowTitle(_("Save search")) + ok = dlg.exec_() + name = dlg.textValue() + if ok: + self.mw.col.conf['savedFilters'][name] = txt + + self.updateButton() + self.browser.setupTree() + + def deleteClicked(self): + msg = _('Remove "%s" from your saved searches?') % self.name + ok = QMessageBox.question(self, _('Remove search'), + msg, QMessageBox.Yes, QMessageBox.No) + + if ok == QMessageBox.Yes: + self.mw.col.conf['savedFilters'].pop(self.name, None) + self.updateButton() + self.browser.setupTree() diff --git a/designer/icons.qrc b/designer/icons.qrc index cb3e36bd2..efcff2268 100644 --- a/designer/icons.qrc +++ b/designer/icons.qrc @@ -35,6 +35,8 @@ icons/editclear.png icons/view-statistics.png icons/emblem-favorite.png + icons/emblem-favorite-dark.png + icons/emblem-favorite-off.png icons/view-pim-calendar.png icons/anki-tag.png icons/edit-redo.png diff --git a/designer/icons/emblem-favorite-dark.png b/designer/icons/emblem-favorite-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..740209965700281a60e047ea3f0eda05b05dd4b0 GIT binary patch literal 2324 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