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