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 + +