From f202d4b99d8a617442fee7d41ad2c5bd2f29c0c5 Mon Sep 17 00:00:00 2001 From: bulislaw Date: Sun, 23 Jan 2011 21:57:48 +0000 Subject: [PATCH] Add saving/loading search and replace queries --- src/calibre/gui2/dialogs/metadata_bulk.py | 119 +++++++++++++++++++++- src/calibre/gui2/dialogs/metadata_bulk.ui | 8 +- 2 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 6e6b553dba..1f7a8ac16c 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -6,7 +6,8 @@ __copyright__ = '2008, Kovid Goyal ' import re, os from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \ - pyqtSignal, QDialogButtonBox + pyqtSignal, QDialogButtonBox, QInputDialog, QLineEdit, \ + QMessageBox from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog @@ -17,7 +18,7 @@ from calibre.ebooks.metadata.meta import get_metadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.gui2 import error_dialog, ResizableDialog, UNDEFINED_QDATE from calibre.gui2.progress_indicator import ProgressIndicator -from calibre.utils.config import dynamic +from calibre.utils.config import dynamic, JSONConfig from calibre.utils.titlecase import titlecase from calibre.utils.icu import sort_key, capitalize from calibre.utils.config import prefs, tweaks @@ -451,6 +452,18 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): self.results_count.valueChanged[int].connect(self.s_r_display_bounds_changed) self.starting_from.valueChanged[int].connect(self.s_r_display_bounds_changed) + self.save_button.clicked.connect(self.save_query) + self.remove_button.clicked.connect(self.remove_query) + self.query_field.currentIndexChanged[str].connect(self.query_change) + + self.queries = JSONConfig("queries") + + self.query_field.addItem("") + for item in self.queries: + self.query_field.addItem(item) + + self.query_field.setCurrentIndex(0) + def s_r_get_field(self, mi, field): if field: if field == '{template}': @@ -862,3 +875,105 @@ class MetadataBulkDialog(ResizableDialog, Ui_MetadataBulkDialog): def series_changed(self, *args): self.write_series = True + def remove_query(self, *args): + if not self.query_field.currentText(): + return + + ret = QMessageBox.question(self, _("Delete query"), + _("Selected query will be deleted. Are You sure?"), + QMessageBox.Ok, QMessageBox.Cancel) + + if ret == QMessageBox.Cancel: + return + + item_id = self.query_field.currentIndex() + item_name = self.query_field.currentText() + + self.query_field.removeItem(item_id) + + if item_name in self.queries.keys(): + del(self.queries[str(item_name)]) + self.queries.commit() + + def save_query(self, *args): + query = {} + query['name'], ok = QInputDialog.getText(self, _('Save query'), + _('Query name:')) + if not ok: + return + query['name'] = str(query['name']) + + new = True + if query['name'] in self.queries.keys(): + ret = QMessageBox.question(self, _("Save query"), + _("Query already exists, old one would be overwritten." \ + " Are You sure?"), + QMessageBox.Ok, QMessageBox.Cancel) + if ret == QMessageBox.Cancel: + return + new = False + + query['search_field'] = str(self.search_field.currentText()) + query['search_mode'] = str(self.search_mode.currentText()) + query['s_r_template'] = str(self.s_r_template.text()) + query['search_for'] = str(self.search_for.text()) + query['case_sensitive'] = self.case_sensitive.isChecked() + query['replace_with'] = str(self.replace_with.text()) + query['replace_func'] = str(self.replace_func.currentText()) + query['destination_field'] = str(self.destination_field. \ + currentText()) + query['replace_mode'] = str(self.replace_mode.currentText()) + query['comma_separated'] = self.comma_separated.isChecked() + query['results_count'] = self.results_count.value() + query['starting_from'] = self.starting_from.value() + query['multiple_separator'] = str(self.multiple_separator.text()) + + self.queries[query['name']] = query + self.queries.commit() + + if new: + self.query_field.addItem(query['name']) + self.query_field.setCurrentIndex(self.query_field.findText(query['name'])) + + def query_change(self, item_name): + item = self.queries.get(str(item_name), None) + if item is None: + self.reset_query_fields() + return + + self.search_field.setCurrentIndex( + self.search_field.findText(item['search_field'])) + self.search_mode.setEditText(item['search_mode']) + self.search_mode.setCurrentIndex( + self.search_mode.findText(item['search_mode'])) + self.s_r_template.setText(item['search_mode']) + self.search_for.setText(item['search_for']) + self.case_sensitive.setChecked(item['case_sensitive']) + self.replace_with.setText(item['replace_with']) + self.replace_func.setCurrentIndex( + self.replace_func.findText(item['replace_func'])) + self.destination_field.setCurrentIndex( + self.destination_field.findText(item['destination_field'])) + self.replace_mode.setCurrentIndex( + self.replace_mode.findText(item['replace_mode'])) + self.comma_separated.setChecked(item['comma_separated']) + self.results_count.setValue(int(item['results_count'])) + self.starting_from.setValue(int(item['starting_from'])) + self.multiple_separator.setText(item['multiple_separator']) + + def reset_query_fields(self): + self.search_field.setCurrentIndex(0) + self.search_mode.setEditText("") + self.search_mode.setCurrentIndex(0) + self.s_r_template.setText("") + self.search_for.setText("") + self.case_sensitive.setChecked(False) + self.replace_with.setText("") + self.replace_func.setCurrentIndex(0) + self.destination_field.setCurrentIndex(0) + self.replace_mode.setCurrentIndex(0) + self.comma_separated.setChecked(True) + self.results_count.setValue(999) + self.starting_from.setValue(1) + self.multiple_separator.setText(" ::: ") + diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index a1e1d8c550..04bf9e364c 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -981,7 +981,7 @@ not multiple and the destination field is multiple - The name of the field that you want to search + Select query to load. @@ -1012,6 +1012,9 @@ not multiple and the destination field is multiple + + Save current query. + Save @@ -1019,6 +1022,9 @@ not multiple and the destination field is multiple + + Remove loadded query. + Remove