diff --git a/src/calibre/gui2/convert/regex_builder.py b/src/calibre/gui2/convert/regex_builder.py
index bdd219d733..bf32bf472a 100644
--- a/src/calibre/gui2/convert/regex_builder.py
+++ b/src/calibre/gui2/convert/regex_builder.py
@@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en'
import re
-from PyQt4.QtCore import SIGNAL, Qt
+from PyQt4.QtCore import SIGNAL, Qt, pyqtSignal
from PyQt4.QtGui import QDialog, QWidget, QDialogButtonBox, \
QBrush, QTextCursor, QTextEdit
@@ -19,8 +19,8 @@ from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
class RegexBuilder(QDialog, Ui_RegexBuilder):
- def __init__(self, db, book_id, regex, *args):
- QDialog.__init__(self, *args)
+ def __init__(self, db, book_id, regex, doc=None, parent=None):
+ QDialog.__init__(self, parent)
self.setupUi(self)
self.regex.setText(regex)
@@ -28,9 +28,13 @@ class RegexBuilder(QDialog, Ui_RegexBuilder):
if not db or not book_id:
self.button_box.addButton(QDialogButtonBox.Open)
- elif not self.select_format(db, book_id):
+ elif not doc and not self.select_format(db, book_id):
self.cancelled = True
return
+
+ if doc:
+ self.preview.setPlainText(doc)
+
self.cancelled = False
self.connect(self.button_box, SIGNAL('clicked(QAbstractButton*)'), self.button_clicked)
self.connect(self.regex, SIGNAL('textChanged(QString)'), self.regex_valid)
@@ -153,24 +157,36 @@ class RegexBuilder(QDialog, Ui_RegexBuilder):
if button == self.button_box.button(QDialogButtonBox.Ok):
self.accept()
+ def doc(self):
+ return unicode(self.preview.toPlainText())
+
class RegexEdit(QWidget, Ui_Edit):
+ doc_update = pyqtSignal(unicode)
+
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self.book_id = None
self.db = None
+ self.doc_cache = None
self.connect(self.button, SIGNAL('clicked()'), self.builder)
def builder(self):
- bld = RegexBuilder(self.db, self.book_id, self.edit.text(), self)
+ bld = RegexBuilder(self.db, self.book_id, self.edit.text(), self.doc_cache, self)
if bld.cancelled:
return
+ if not self.doc_cache:
+ self.doc_cache = bld.doc()
+ self.doc_update.emit(self.doc_cache)
if bld.exec_() == bld.Accepted:
self.edit.setText(bld.regex.text())
+ def doc(self):
+ return self.doc_cache
+
def setObjectName(self, *args):
QWidget.setObjectName(self, *args)
if hasattr(self, 'edit'):
@@ -185,8 +201,11 @@ class RegexEdit(QWidget, Ui_Edit):
def set_db(self, db):
self.db = db
+ def set_doc(self, doc):
+ self.doc_cache = doc
+
def break_cycles(self):
- self.db = None
+ self.db = self.doc_cache = None
@property
def text(self):
diff --git a/src/calibre/gui2/convert/search_and_replace.py b/src/calibre/gui2/convert/search_and_replace.py
index ba156c5b2a..ec59268ec8 100644
--- a/src/calibre/gui2/convert/search_and_replace.py
+++ b/src/calibre/gui2/convert/search_and_replace.py
@@ -35,13 +35,26 @@ class SearchAndReplaceWidget(Widget, Ui_Form):
self.opt_sr3_search.set_book_id(book_id)
self.opt_sr3_search.set_db(db)
+ self.opt_sr1_search.doc_update.connect(self.update_doc)
+ self.opt_sr2_search.doc_update.connect(self.update_doc)
+ self.opt_sr3_search.doc_update.connect(self.update_doc)
+
def break_cycles(self):
Widget.break_cycles(self)
+ self.opt_sr1_search.doc_update.disconnect()
+ self.opt_sr2_search.doc_update.disconnect()
+ self.opt_sr3_search.doc_update.disconnect()
+
self.opt_sr1_search.break_cycles()
self.opt_sr2_search.break_cycles()
self.opt_sr3_search.break_cycles()
+ def update_doc(self, doc):
+ self.opt_sr1_search.set_doc(doc)
+ self.opt_sr2_search.set_doc(doc)
+ self.opt_sr3_search.set_doc(doc)
+
def pre_commit_check(self):
for x in ('sr1_search', 'sr2_search', 'sr3_search'):
x = getattr(self, 'opt_'+x)
diff --git a/src/calibre/gui2/filename_pattern.ui b/src/calibre/gui2/filename_pattern.ui
index d120ca80b2..e2367c8ceb 100644
--- a/src/calibre/gui2/filename_pattern.ui
+++ b/src/calibre/gui2/filename_pattern.ui
@@ -43,7 +43,17 @@ p, li { white-space: pre-wrap; }
-
-
+
+
+ true
+
+
+ 10
+
+
+ QComboBox::InsertAtTop
+
+
@@ -94,8 +104,8 @@ p, li { white-space: pre-wrap; }
0
0
- 301
- 234
+ 277
+ 276
diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
index 8077fe46f5..41b18aebba 100644
--- a/src/calibre/gui2/widgets.py
+++ b/src/calibre/gui2/widgets.py
@@ -66,17 +66,31 @@ class FilenamePattern(QWidget, Ui_Form):
self.setupUi(self)
self.connect(self.test_button, SIGNAL('clicked()'), self.do_test)
- self.connect(self.re, SIGNAL('returnPressed()'), self.do_test)
- self.initialize()
- self.re.textChanged.connect(lambda x: self.changed_signal.emit())
+ self.connect(self.re.lineEdit(), SIGNAL('returnPressed()'), self.do_test)
+ self.re.lineEdit().textChanged.connect(lambda x: self.changed_signal.emit())
def initialize(self, defaults=False):
+ # Get all itmes in the combobox. If we are resting
+ # to defaults we don't want to lose what the user
+ # has added.
+ val_hist = [unicode(self.re.lineEdit().text())] + [unicode(self.re.itemText(i)) for i in xrange(self.re.count())]
+ self.re.clear()
+
if defaults:
val = prefs.defaults['filename_pattern']
else:
val = prefs['filename_pattern']
- self.re.setText(val)
-
+ self.re.lineEdit().setText(val)
+
+ val_hist += gprefs.get('filename_pattern_history', ['(?P.+)', '(?P[^_-]+) -?\s*(?P[^_0-9-]*)(?P[0-9]*)\s*-\s*(?P[^_].+) ?'])
+ if val in val_hist:
+ del val_hist[val_hist.index(val)]
+ val_hist.insert(0, val)
+ for v in val_hist:
+ # Ensure we don't have duplicate items.
+ if v and self.re.findText(v) == -1:
+ self.re.addItem(v)
+ self.re.setCurrentIndex(0)
def do_test(self):
try:
@@ -109,12 +123,21 @@ class FilenamePattern(QWidget, Ui_Form):
def pattern(self):
- pat = unicode(self.re.text())
+ pat = unicode(self.re.lineEdit().text())
return re.compile(pat)
def commit(self):
pat = self.pattern().pattern
prefs['filename_pattern'] = pat
+
+ history = []
+ history_pats = [unicode(self.re.lineEdit().text())] + [unicode(self.re.itemText(i)) for i in xrange(self.re.count())]
+ for p in history_pats[:14]:
+ # Ensure we don't have duplicate items.
+ if p and p not in history:
+ history.append(p)
+ gprefs['filename_pattern_history'] = history
+
return pat