From b502280c062acbc15a80966a9cabac7babecf0c1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Nov 2014 21:36:47 +0100 Subject: [PATCH] Make download-manager a per-window object. Fixes #228. --- qutebrowser/app.py | 5 +---- qutebrowser/browser/commands.py | 4 +++- qutebrowser/browser/downloads.py | 15 ++++++++------- qutebrowser/browser/hints.py | 4 +++- qutebrowser/widgets/downloads.py | 4 ++-- qutebrowser/widgets/mainwindow.py | 14 ++++++++++---- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index f1ec6607b..84d203923 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -40,7 +40,7 @@ import qutebrowser from qutebrowser.commands import cmdutils, runners from qutebrowser.config import style, config, websettings from qutebrowser.network import qutescheme, proxy -from qutebrowser.browser import quickmarks, cookies, downloads, cache +from qutebrowser.browser import quickmarks, cookies, cache from qutebrowser.widgets import mainwindow, crash from qutebrowser.keyinput import modeman from qutebrowser.utils import (log, version, message, readline, utils, qtutils, @@ -167,9 +167,6 @@ class Application(QApplication): log.init.debug("Initializing cache...") diskcache = cache.DiskCache(self) objreg.register('cache', diskcache) - log.init.debug("Initializing downloads...") - download_manager = downloads.DownloadManager(self) - objreg.register('download-manager', download_manager) log.init.debug("Initializing main window...") win_id = mainwindow.MainWindow.spawn( False if self._args.nowindow else True) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 898f2e0fa..0da41165d 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -864,7 +864,9 @@ class CommandDispatcher: def download_page(self): """Download the current page.""" page = self._current_widget().page() - objreg.get('download-manager').get(self._current_url(), page) + download_manager = objreg.get('download-manager', scope='window', + window=self._win_id) + download_manager.get(self._current_url(), page) @cmdutils.register(instance='command-dispatcher', scope='window') def view_source(self): diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index b10ae5aeb..541c5db5e 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -347,8 +347,9 @@ class DownloadManager(QAbstractListModel): questions: A list of Question objects to not GC them. """ - def __init__(self, parent=None): + def __init__(self, win_id, parent=None): super().__init__(parent) + self._win_id = win_id self.downloads = [] self.questions = [] @@ -364,13 +365,13 @@ class DownloadManager(QAbstractListModel): page: The QWebPage to get the download from. """ if not url.isValid(): - urlutils.invalid_url_error('last-focused', url, "start download") + urlutils.invalid_url_error(self._win_id, url, "start download") return req = QNetworkRequest(url) reply = page.networkAccessManager().get(req) self.fetch(reply) - @cmdutils.register(instance='download-manager') + @cmdutils.register(instance='download-manager', scope='window') def cancel_download(self, count: {'special': 'count'}=1): """Cancel the first/[count]th download. @@ -419,7 +420,7 @@ class DownloadManager(QAbstractListModel): self.questions.append(q) download.cancelled.connect(q.abort) message_bridge = objreg.get('message-bridge', scope='window', - window='last-focused') + window=self._win_id) message_bridge.ask(q, blocking=False) @pyqtSlot(DownloadItem) @@ -443,7 +444,7 @@ class DownloadManager(QAbstractListModel): @pyqtSlot(str) def on_error(self, msg): """Display error message on download errors.""" - message.error('last-focused', "Download error: {}".format(msg)) + message.error(self._win_id, "Download error: {}".format(msg)) def last_index(self): """Get the last index in the model. @@ -468,7 +469,7 @@ class DownloadManager(QAbstractListModel): if index.parent().isValid() or index.column() != 0: return QVariant() - item = objreg.get('download-manager').downloads[index.row()] + item = self.downloads[index.row()] if role == Qt.DisplayRole: data = str(item) elif role == Qt.ForegroundRole: @@ -497,4 +498,4 @@ class DownloadManager(QAbstractListModel): if parent.isValid(): # We don't have children return 0 - return len(objreg.get('download-manager').downloads) + return len(self.downloads) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index c14e41bfd..46e0442b5 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -399,7 +399,9 @@ class HintManager(QObject): "No suitable link found for this element.", immediately=True) return - objreg.get('download-manager').get(url, elem.webFrame().page()) + download_manager = objreg.get('download-manager', scope='window', + window=self._win_id) + download_manager.get(url, elem.webFrame().page()) def _call_userscript(self, url): """Call an userscript from a hint.""" diff --git a/qutebrowser/widgets/downloads.py b/qutebrowser/widgets/downloads.py index d0e1541f8..bdc59052e 100644 --- a/qutebrowser/widgets/downloads.py +++ b/qutebrowser/widgets/downloads.py @@ -76,7 +76,7 @@ class DownloadView(QListView): } """ - def __init__(self, parent=None): + def __init__(self, win_id, parent=None): super().__init__(parent) style.set_register_stylesheet(self) self.setResizeMode(QListView.Adjust) @@ -84,7 +84,7 @@ class DownloadView(QListView): self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) self.setFlow(QListView.LeftToRight) self._menu = None - model = objreg.get('download-manager') + model = objreg.get('download-manager', scope='window', window=win_id) model.rowsInserted.connect(functools.partial(update_geometry, self)) model.rowsRemoved.connect(functools.partial(update_geometry, self)) self.setModel(model) diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py index bbf4c95b8..2ab112cda 100644 --- a/qutebrowser/widgets/mainwindow.py +++ b/qutebrowser/widgets/mainwindow.py @@ -30,10 +30,11 @@ from PyQt5.QtWidgets import QWidget, QVBoxLayout from qutebrowser.commands import runners, cmdutils from qutebrowser.config import config from qutebrowser.utils import message, log, usertypes, qtutils, objreg, utils -from qutebrowser.widgets import tabbedbrowser, completion, downloads +from qutebrowser.widgets import tabbedbrowser, completion +from qutebrowser.widgets import downloads as downloadswidget from qutebrowser.widgets.statusbar import bar from qutebrowser.keyinput import modeman -from qutebrowser.browser import hints +from qutebrowser.browser import hints, downloads win_id_gen = itertools.count(0) @@ -81,7 +82,12 @@ class MainWindow(QWidget): self._vbox.setContentsMargins(0, 0, 0, 0) self._vbox.setSpacing(0) - self._downloadview = downloads.DownloadView() + log.init.debug("Initializing downloads...") + download_manager = downloads.DownloadManager(win_id, self) + objreg.register('download-manager', download_manager, scope='window', + window=win_id) + + self._downloadview = downloadswidget.DownloadView(win_id) self._vbox.addWidget(self._downloadview) self._downloadview.show() @@ -182,7 +188,6 @@ class MainWindow(QWidget): def _connect_signals(self): """Connect all mainwindow signals.""" # pylint: disable=too-many-locals,too-many-statements - download_manager = objreg.get('download-manager') key_config = objreg.get('key-config') status = self._get_object('statusbar') @@ -195,6 +200,7 @@ class MainWindow(QWidget): message_bridge = self._get_object('message-bridge') mode_manager = self._get_object('mode-manager') prompter = self._get_object('prompter') + download_manager = self._get_object('download-manager') # misc self._tabbed_browser.close_window.connect(self.close)