diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 11b2d5674a..eb93602fd1 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -82,6 +82,9 @@ def _config(): help='Search history for the ebook viewer') c.add_opt('lrf_viewer_search_history', default=[], help='Search history for the LRF viewer') + c.add_opt('scheduler_search_history', default=[], + help='Search history for the recipe scheduler') + return ConfigProxy(c) config = _config() diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 3b45e9a759..f31e76b861 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -9,12 +9,13 @@ Scheduler for automated recipe downloads import sys, copy, time from datetime import datetime, timedelta, date -from PyQt4.Qt import QDialog, QApplication, QLineEdit, QPalette, SIGNAL, QBrush, \ +from PyQt4.Qt import QDialog, QApplication, SIGNAL, \ QColor, QAbstractItemModel, Qt, QVariant, QFont, QIcon, \ QFile, QObject, QTimer, QMutex, QMenu, QAction, QTime, QModelIndex from calibre import english_sort from calibre.gui2.dialogs.scheduler_ui import Ui_Dialog +from calibre.gui2.search_box import SearchBox2 from calibre.web.feeds.recipes import recipes, recipe_modules, compile_recipe from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.pyparsing import ParseException @@ -163,7 +164,7 @@ class RecipeModel(QAbstractItemModel, SearchQueryParser): results.add(recipe) return results - def search(self, query): + def search(self, query, refinement): try: results = self.parse(unicode(query)) except ParseException: @@ -176,6 +177,7 @@ class RecipeModel(QAbstractItemModel, SearchQueryParser): if recipe in results: self._map[category].append(recipe) self.reset() + self.emit(SIGNAL('searched(PyQt_PyObject)'), True) def resort(self): self.recipes.sort() @@ -235,45 +237,6 @@ class RecipeModel(QAbstractItemModel, SearchQueryParser): srecipe.schedule = recipe.schedule -class Search(QLineEdit): - - HELP_TEXT = _('Search') - INTERVAL = 500 #: Time to wait before emitting search signal - - def __init__(self, *args): - QLineEdit.__init__(self, *args) - self.default_palette = QApplication.palette(self) - self.gray = QPalette(self.default_palette) - self.gray.setBrush(QPalette.Text, QBrush(QColor('gray'))) - self.connect(self, SIGNAL('editingFinished()'), - lambda : self.emit(SIGNAL('goto(PyQt_PyObject)'), unicode(self.text()))) - self.clear_to_help_mode() - self.timer = None - self.connect(self, SIGNAL('textEdited(QString)'), self.text_edited_slot) - - def focusInEvent(self, ev): - self.setPalette(QApplication.palette(self)) - if self.in_help_mode(): - self.setText('') - return QLineEdit.focusInEvent(self, ev) - - def in_help_mode(self): - return unicode(self.text()) == self.HELP_TEXT - - def clear_to_help_mode(self): - self.setPalette(self.gray) - self.setText(self.HELP_TEXT) - - def text_edited_slot(self, text): - text = unicode(text) - self.timer = self.startTimer(self.INTERVAL) - - def timerEvent(self, event): - self.killTimer(event.timerId()) - if event.timerId() == self.timer: - text = unicode(self.text()) - self.emit(SIGNAL('search(PyQt_PyObject)'), text) - def encode_schedule(day, hour, minute): day = 1e7 * (day+1) hour = 1e4 * (hour+1) @@ -291,7 +254,8 @@ class SchedulerDialog(QDialog, Ui_Dialog): def __init__(self, db, *args): QDialog.__init__(self, *args) self.setupUi(self) - self.search = Search(self) + self.search = SearchBox2(self) + self.search.initialize('scheduler_search_history') self.recipe_box.layout().insertWidget(0, self.search) self.detail_box.setVisible(False) self._model = RecipeModel(db) @@ -308,7 +272,9 @@ class SchedulerDialog(QDialog, Ui_Dialog): self.connect(self.time, SIGNAL('timeChanged(QTime)'), self.do_schedule) for button in (self.daily_button, self.interval_button): self.connect(button, SIGNAL('toggled(bool)'), self.do_schedule) - self.connect(self.search, SIGNAL('search(PyQt_PyObject)'), self._model.search) + self.connect(self.search, SIGNAL('search(PyQt_PyObject,PyQt_PyObject)'), self._model.search) + self.connect(self._model, SIGNAL('searched(PyQt_PyObject)'), + self.search.search_done) self.connect(self._model, SIGNAL('modelReset()'), lambda : self.detail_box.setVisible(False)) self.connect(self.download_all_button, SIGNAL('clicked()'), self.download_all) diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 5afe54e95c..2ac4017fc7 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -155,6 +155,7 @@ class Main(MainWindow, Ui_MainWindow): self.document.search(search) except StopIteration: error_dialog(self, _('No matches found'), _('No matches for the search phrase %s were found.')%(search,)).exec_() + self.search.search_done(True) def parsed(self): if not self.renderer.aborted and self.renderer.lrf is not None: diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 43487f2e8b..1263ff003e 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -22,6 +22,15 @@ class SearchLineEdit(QLineEdit): class SearchBox2(QComboBox): + ''' + To use this class: + + * Call initialize() + * Connect to the search() and cleared() signals from this widget + * Call search_done() after evry search is complete + * Use clear() to clear back to the help message + ''' + INTERVAL = 1500 #: Time to wait before emitting search signal MAX_COUNT = 25