diff --git a/src/calibre/gui2/store/feedbooks_plugin.py b/src/calibre/gui2/store/feedbooks_plugin.py index 5c5d430a05..9a3fb163df 100644 --- a/src/calibre/gui2/store/feedbooks_plugin.py +++ b/src/calibre/gui2/store/feedbooks_plugin.py @@ -23,6 +23,7 @@ class FeedbooksStore(StorePlugin): from calibre.gui2.store.web_store_dialog import WebStoreDialog d = WebStoreDialog(gui, 'http://m.feedbooks.com/', parent, detail_item) d.setWindowTitle(self.name) + d.set_tags(self.name + ',' + _('store')) d = d.exec_() def search(self, query, max_results=10, timeout=60): diff --git a/src/calibre/gui2/store/gutenberg_plugin.py b/src/calibre/gui2/store/gutenberg_plugin.py index 6917165474..a039ae2c66 100644 --- a/src/calibre/gui2/store/gutenberg_plugin.py +++ b/src/calibre/gui2/store/gutenberg_plugin.py @@ -23,6 +23,7 @@ class GutenbergStore(StorePlugin): from calibre.gui2.store.web_store_dialog import WebStoreDialog d = WebStoreDialog(gui, 'http://m.gutenberg.org/', parent, detail_item) d.setWindowTitle(self.name) + d.set_tags(self.name + ',' + _('store')) d = d.exec_() def search(self, query, max_results=10, timeout=60): diff --git a/src/calibre/gui2/store/manybooks_plugin.py b/src/calibre/gui2/store/manybooks_plugin.py index ac9cac5323..3f85c6bec3 100644 --- a/src/calibre/gui2/store/manybooks_plugin.py +++ b/src/calibre/gui2/store/manybooks_plugin.py @@ -24,6 +24,7 @@ class ManyBooksStore(StorePlugin): from calibre.gui2.store.web_store_dialog import WebStoreDialog d = WebStoreDialog(gui, 'http://manybooks.net/', parent, detail_item) d.setWindowTitle(self.name) + d.set_tags(self.name + ',' + _('store')) d = d.exec_() def search(self, query, max_results=10, timeout=60): diff --git a/src/calibre/gui2/store/search.ui b/src/calibre/gui2/store/search.ui index 9d14874f10..2ee02b4632 100644 --- a/src/calibre/gui2/store/search.ui +++ b/src/calibre/gui2/store/search.ui @@ -55,8 +55,48 @@ + + + + QDialogButtonBox::Close + + + - + + + buttonBox + accepted() + Dialog + accept() + + + 307 + 524 + + + 307 + 272 + + + + + buttonBox + rejected() + Dialog + accept() + + + 307 + 524 + + + 307 + 272 + + + + diff --git a/src/calibre/gui2/store/smashwords_plugin.py b/src/calibre/gui2/store/smashwords_plugin.py index c4eb1bb741..5b84ce58ad 100644 --- a/src/calibre/gui2/store/smashwords_plugin.py +++ b/src/calibre/gui2/store/smashwords_plugin.py @@ -24,6 +24,7 @@ class SmashwordsStore(StorePlugin): from calibre.gui2.store.web_store_dialog import WebStoreDialog d = WebStoreDialog(gui, 'http://www.smashwords.com/?ref=usernone', parent, detail_item) d.setWindowTitle(self.name) + d.set_tags(self.name + ',' + _('store')) d = d.exec_() def search(self, query, max_results=10, timeout=60): diff --git a/src/calibre/gui2/store/web_control.py b/src/calibre/gui2/store/web_control.py index 6b149cdd32..e73279ce58 100644 --- a/src/calibre/gui2/store/web_control.py +++ b/src/calibre/gui2/store/web_control.py @@ -18,6 +18,7 @@ class NPWebView(QWebView): def __init__(self, *args): QWebView.__init__(self, *args) self.gui = None + self.tags = '' self.setPage(NPWebPage()) self.page().networkAccessManager().setCookieJar(QNetworkCookieJar()) @@ -35,6 +36,9 @@ class NPWebView(QWebView): def set_gui(self, gui): self.gui = gui + def set_tags(self, tags): + self.tags = tags + def start_download(self, request): if not self.gui: return @@ -56,7 +60,7 @@ class NPWebView(QWebView): if name: self.gui.download_from_store(url, cj, name, False) else: - self.gui.download_from_store(url, cj) + self.gui.download_from_store(url, cj, tags=self.tags) def ignore_ssl_errors(self, reply, errors): reply.ignoreSslErrors(errors) diff --git a/src/calibre/gui2/store/web_store_dialog.py b/src/calibre/gui2/store/web_store_dialog.py index fcb294cd69..0c032e26e0 100644 --- a/src/calibre/gui2/store/web_store_dialog.py +++ b/src/calibre/gui2/store/web_store_dialog.py @@ -30,6 +30,9 @@ class WebStoreDialog(QDialog, Ui_Dialog): self.go_home(detail_item=detail_item) + def set_tags(self, tags): + self.view.set_tags(tags) + def load_started(self): self.progress.setValue(0) diff --git a/src/calibre/gui2/store/web_store_dialog.ui b/src/calibre/gui2/store/web_store_dialog.ui index e2f15607ce..b89b9305be 100644 --- a/src/calibre/gui2/store/web_store_dialog.ui +++ b/src/calibre/gui2/store/web_store_dialog.ui @@ -17,7 +17,7 @@ true - + QFrame::StyledPanel @@ -72,6 +72,13 @@ + + + + Close + + + @@ -87,5 +94,22 @@ - + + + close + clicked() + Dialog + accept() + + + 917 + 635 + + + 480 + 327 + + + + diff --git a/src/calibre/gui2/store_download.py b/src/calibre/gui2/store_download.py index 7b0d68d454..b3c5e6279a 100644 --- a/src/calibre/gui2/store_download.py +++ b/src/calibre/gui2/store_download.py @@ -21,13 +21,13 @@ from calibre.utils.ipc.job import BaseJob class StoreDownloadJob(BaseJob): - def __init__(self, callback, description, job_manager, db, cookie_jar, url='', save_as_loc='', add_to_lib=True): + def __init__(self, callback, description, job_manager, db, cookie_jar, url='', save_as_loc='', add_to_lib=True, tags=[]): BaseJob.__init__(self, description) self.exception = None self.job_manager = job_manager self.db = db self.cookie_jar = cookie_jar - self.args = (url, save_as_loc, add_to_lib) + self.args = (url, save_as_loc, add_to_lib, tags) self.tmp_file_name = '' self.callback = callback self.log_path = None @@ -122,7 +122,7 @@ class StoreDownloader(Thread): traceback.print_exc() def _download(self, job): - url, save_loc, add_to_lib = job.args + url, save_loc, add_to_lib, tags = job.args if not url: raise Exception(_('No file specified to download.')) if not save_loc and not add_to_lib: @@ -140,7 +140,7 @@ class StoreDownloader(Thread): job.tmp_file_name = tf.name def _add(self, job): - url, save_loc, add_to_lib = job.args + url, save_loc, add_to_lib, tags = job.args if not add_to_lib and job.tmp_file_name: return ext = os.path.splitext(job.tmp_file_name)[1][1:].lower() @@ -152,19 +152,20 @@ class StoreDownloader(Thread): from calibre.ebooks.metadata.meta import get_metadata with open(job.tmp_file_name) as f: mi = get_metadata(f, ext) + mi.tags.extend(tags) job.db.add_books([job.tmp_file_name], [ext], [mi]) def _save_as(self, job): - url, save_loc, add_to_lib = job.args + url, save_loc, add_to_lib, tags = job.args if not save_loc and job.tmp_file_name: return shutil.copy(job.tmp_file_name, save_loc) - def download_from_store(self, callback, db, cookie_jar, url='', save_as_loc='', add_to_lib=True): + def download_from_store(self, callback, db, cookie_jar, url='', save_as_loc='', add_to_lib=True, tags=[]): description = _('Downloading %s') % url - job = StoreDownloadJob(callback, description, self.job_manager, db, cookie_jar, url, save_as_loc, add_to_lib) + job = StoreDownloadJob(callback, description, self.job_manager, db, cookie_jar, url, save_as_loc, add_to_lib, tags) self.job_manager.add_job(job) self.jobs.put(job) @@ -174,10 +175,13 @@ class StoreDownloadMixin(object): def __init__(self): self.store_downloader = StoreDownloader(self.job_manager) - def download_from_store(self, url='', cookie_jar=CookieJar(), save_as_loc='', add_to_lib=True): + def download_from_store(self, url='', cookie_jar=CookieJar(), save_as_loc='', add_to_lib=True, tags=[]): if not self.store_downloader.is_alive(): self.store_downloader.start() - self.store_downloader.download_from_store(Dispatcher(self.downloaded_from_store), self.library_view.model().db, cookie_jar, url, save_as_loc, add_to_lib) + if tags: + if isinstance(tags, basestring): + tags = tags.split(',') + self.store_downloader.download_from_store(Dispatcher(self.downloaded_from_store), self.library_view.model().db, cookie_jar, url, save_as_loc, add_to_lib, tags) self.status_bar.show_message(_('Downloading') + ' ' + url, 3000) def downloaded_from_store(self, job):