diff --git a/src/calibre/gui2/store/search.py b/src/calibre/gui2/store/search.py
index 1e94e172ba..7c74ee288a 100644
--- a/src/calibre/gui2/store/search.py
+++ b/src/calibre/gui2/store/search.py
@@ -11,7 +11,8 @@ from threading import Event, Thread
from Queue import Queue
from PyQt4.Qt import Qt, QAbstractItemModel, QDialog, QTimer, QVariant, \
- QModelIndex, QPixmap, QSize
+ QModelIndex, QPixmap, QSize, QCheckBox, QVBoxLayout, QHBoxLayout, \
+ QPushButton
from calibre import browser
from calibre.customize.ui import store_plugins
@@ -41,12 +42,30 @@ class SearchDialog(QDialog, Ui_Dialog):
self.model = Matches()
self.results_view.setModel(self.model)
+ stores_group_layout = QVBoxLayout()
+ self.stores_group.setLayout(stores_group_layout)
for x in store_plugins():
self.store_plugins[x.name] = x
-
+ cbox = QCheckBox(x.name)
+ cbox.setChecked(True)
+ stores_group_layout.addWidget(cbox)
+ setattr(self, 'store_check_' + x.name, cbox)
+
+ store_button_layout = QHBoxLayout()
+ stores_group_layout.addLayout(store_button_layout)
+ self.select_all_stores = QPushButton(_('All'))
+ self.select_invert_stores = QPushButton(_('Invert'))
+ self.select_none_stores = QPushButton(_('None'))
+ store_button_layout.addWidget(self.select_all_stores)
+ store_button_layout.addWidget(self.select_invert_stores)
+ store_button_layout.addWidget(self.select_none_stores)
+
self.search.clicked.connect(self.do_search)
self.checker.timeout.connect(self.get_results)
self.results_view.activated.connect(self.open_store)
+ self.select_all_stores.clicked.connect(self.stores_select_all)
+ self.select_invert_stores.clicked.connect(self.stores_select_invert)
+ self.select_none_stores.clicked.connect(self.stores_select_none)
self.resize_columns()
@@ -80,9 +99,10 @@ class SearchDialog(QDialog, Ui_Dialog):
return
for n in self.store_plugins:
- t = SearchThread(query, (n, self.store_plugins[n]), self.results, self.abort, self.TIMEOUT)
- self.running_threads.append(t)
- t.start()
+ if getattr(self, 'store_check_' + n).isChecked():
+ t = SearchThread(query, (n, self.store_plugins[n]), self.results, self.abort, self.TIMEOUT)
+ self.running_threads.append(t)
+ t.start()
if self.running_threads:
self.hang_check = 0
self.checker.start(100)
@@ -115,6 +135,25 @@ class SearchDialog(QDialog, Ui_Dialog):
result = self.results_view.model().get_result(index)
self.store_plugins[result.store].open(self.gui, self, result.detail_item)
+ def get_store_checks(self):
+ checks = []
+ for x in self.store_plugins:
+ check = getattr(self, 'store_check_' + x, None)
+ if check:
+ checks.append(check)
+ return checks
+
+ def stores_select_all(self):
+ for check in self.get_store_checks():
+ check.setChecked(True)
+
+ def stores_select_invert(self):
+ for check in self.get_store_checks():
+ check.setChecked(not check.isChecked())
+
+ def stores_select_none(self):
+ for check in self.get_store_checks():
+ check.setChecked(False)
class SearchThread(Thread):
diff --git a/src/calibre/gui2/store/search.ui b/src/calibre/gui2/store/search.ui
index 2ee02b4632..19ff13300a 100644
--- a/src/calibre/gui2/store/search.ui
+++ b/src/calibre/gui2/store/search.ui
@@ -6,8 +6,8 @@
0
0
- 616
- 545
+ 937
+ 669
@@ -16,81 +16,109 @@
true
-
- -
-
+
+
-
+
+
-
+
+
+ Query:
+
+
+
+ -
+
+
+ -
+
+
+ Search
+
+
+
+
- -
-
-
- Search
+
-
+
+
+ Qt::Horizontal
+
+
+ Stores
+
+
+
+
+
+ 2
+ 0
+
+
+
+ true
+
+
+
+ 32
+ 32
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ true
+
+
+ false
+
+
- -
-
-
- true
-
-
-
- 32
- 32
-
-
-
- false
-
-
- false
-
-
- false
-
-
- true
-
-
- false
-
-
-
- -
-
-
- QDialogButtonBox::Close
-
-
+
-
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Close
+
+
+
+
- buttonBox
- accepted()
+ close
+ clicked()
Dialog
accept()
- 307
- 524
-
-
- 307
- 272
-
-
-
-
- buttonBox
- rejected()
- Dialog
- accept()
-
-
- 307
- 524
+ 526
+ 525
307