diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py
index ed0ca6c3f4..69f7b7fe4e 100644
--- a/src/calibre/ebooks/oeb/iterator.py
+++ b/src/calibre/ebooks/oeb/iterator.py
@@ -92,10 +92,10 @@ class EbookIterator(object):
ext = re.sub(r'(x{0,1})htm(l{0,1})', 'html', ext)
self.ebook_ext = ext
- def search(self, text, index):
+ def search(self, text, index, backwards=False):
text = text.lower()
for i, path in enumerate(self.spine):
- if i > index:
+ if (backwards and i < index) or (not backwards and i > index):
if text in open(path, 'rb').read().decode(path.encoding).lower():
return i
diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py
index 033b43954a..ac86007c7f 100644
--- a/src/calibre/gui2/search_box.py
+++ b/src/calibre/gui2/search_box.py
@@ -137,6 +137,13 @@ class SearchBox2(QComboBox):
if event.timerId() == self.timer:
self.do_search()
+ @property
+ def smart_text(self):
+ text = unicode(self.currentText()).strip()
+ if not text or text == self.help_text:
+ return ''
+ return text
+
def do_search(self):
text = unicode(self.currentText()).strip()
if not text or text == self.help_text:
diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py
index 2267efb893..bd4bd0a01a 100644
--- a/src/calibre/gui2/viewer/documentview.py
+++ b/src/calibre/gui2/viewer/documentview.py
@@ -585,7 +585,9 @@ class DocumentView(QWebView):
def fset(self, val): self.document.current_language = val
return property(fget=fget, fset=fset)
- def search(self, text):
+ def search(self, text, backwards=False):
+ if backwards:
+ return self.findText(text, self.document.FindBackwards)
return self.findText(text)
def path(self):
diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py
index 689613111e..77d7269e17 100644
--- a/src/calibre/gui2/viewer/main.py
+++ b/src/calibre/gui2/viewer/main.py
@@ -229,7 +229,11 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.connect(self.action_previous_page, SIGNAL('triggered(bool)'),
lambda x:self.view.previous_page())
self.connect(self.action_find_next, SIGNAL('triggered(bool)'),
- lambda x:self.find(unicode(self.search.text()), True, repeat=True))
+ lambda x:self.find(self.search.smart_text, True, repeat=True))
+ self.connect(self.action_find_previous, SIGNAL('triggered(bool)'),
+ lambda x:self.find(self.search.smart_text, True,
+ repeat=True, backwards=True))
+
self.connect(self.action_full_screen, SIGNAL('triggered(bool)'),
self.toggle_fullscreen)
self.action_full_screen.setShortcuts([Qt.Key_F11, Qt.CTRL+Qt.SHIFT+Qt.Key_F])
@@ -420,13 +424,15 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.set_bookmarks(self.iterator.bookmarks)
- def find(self, text, refinement, repeat=False):
+ def find(self, text, refinement, repeat=False, backwards=False):
if not text:
+ self.view.search('')
return self.search.search_done(False)
if self.view.search(text):
self.scrolled(self.view.scroll_fraction)
return self.search.search_done(True)
- index = self.iterator.search(text, self.current_index)
+ index = self.iterator.search(text, self.current_index,
+ backwards=backwards)
if index is None:
if self.current_index > 0:
index = self.iterator.search(text, 0)
@@ -444,10 +450,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.scrolled(self.view.scroll_fraction)
def keyPressEvent(self, event):
- if event.key() == Qt.Key_F3:
- text = unicode(self.search.text())
- self.find(text, True, repeat=True)
- elif event.key() == Qt.Key_Slash:
+ if event.key() == Qt.Key_Slash:
self.search.setFocus(Qt.OtherFocusReason)
else:
return MainWindow.keyPressEvent(self, event)
diff --git a/src/calibre/gui2/viewer/main.ui b/src/calibre/gui2/viewer/main.ui
index be18a3036b..9177f2713f 100644
--- a/src/calibre/gui2/viewer/main.ui
+++ b/src/calibre/gui2/viewer/main.ui
@@ -142,6 +142,7 @@
false
+
@@ -232,6 +233,12 @@
Find next
+
+ Find next occurrence
+
+
+ F3
+
@@ -287,6 +294,21 @@
Print
+
+
+
+ :/images/arrow-up.svg:/images/arrow-up.svg
+
+
+ Find previous
+
+
+ Find previous occurrence
+
+
+ Shift+F3
+
+