diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 67c497885..d7247de90 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -397,17 +397,17 @@ class QuteBrowser(QApplication): self.config.changed.connect(obj.on_config_changed) # statusbar - tabs.currentChanged.connect(status.prog.current_changed) + tabs.currentChanged.connect(status.prog.on_tab_changed) tabs.cur_progress.connect(status.prog.setValue) tabs.cur_load_finished.connect(status.prog.hide) tabs.cur_load_started.connect(status.prog.on_load_started) - tabs.currentChanged.connect(status.percentage.current_changed) + tabs.currentChanged.connect(status.percentage.on_tab_changed) tabs.cur_scroll_perc_changed.connect(status.percentage.set_perc) tabs.cur_statusbar_message.connect(status.txt.on_statusbar_message) - tabs.currentChanged.connect(status.url.current_changed) + tabs.currentChanged.connect(status.url.on_tab_changed) tabs.cur_url_changed.connect(status.url.set_url) tabs.cur_link_hovered.connect(status.url.set_hover_url) diff --git a/qutebrowser/widgets/statusbar/_percentage.py b/qutebrowser/widgets/statusbar/_percentage.py index 0beb17c52..424c797cd 100644 --- a/qutebrowser/widgets/statusbar/_percentage.py +++ b/qutebrowser/widgets/statusbar/_percentage.py @@ -45,3 +45,9 @@ class Percentage(TextBase): self.setText('[bot]') else: self.setText('[{:2}%]'.format(y)) + + @pyqtSlot(int) + def on_tab_changed(self, idx): + """Update scroll position when tab changed.""" + tab = self.sender().widget(idx) + self.set_perc(*tab.scroll_pos) diff --git a/qutebrowser/widgets/statusbar/_progress.py b/qutebrowser/widgets/statusbar/_progress.py index e13475960..cab8f4402 100644 --- a/qutebrowser/widgets/statusbar/_progress.py +++ b/qutebrowser/widgets/statusbar/_progress.py @@ -20,6 +20,7 @@ from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QProgressBar, QSizePolicy +from qutebrowser.widgets.webview import LoadStatus from qutebrowser.config.style import set_register_stylesheet @@ -57,3 +58,12 @@ class Progress(QProgressBar): """Clear old error and show progress, used as slot to loadStarted.""" self.setValue(0) self.show() + + @pyqtSlot(int) + def on_tab_changed(self, idx): + tab = self.sender().widget(idx) + self.setValue(tab.progress) + if tab.load_status == LoadStatus.loading: + self.show() + else: + self.hide() diff --git a/qutebrowser/widgets/statusbar/_url.py b/qutebrowser/widgets/statusbar/_url.py index b69d4e39b..82f9b3fac 100644 --- a/qutebrowser/widgets/statusbar/_url.py +++ b/qutebrowser/widgets/statusbar/_url.py @@ -19,6 +19,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtProperty, Qt +from qutebrowser.widgets.webview import LoadStatus from qutebrowser.widgets.statusbar._textbase import TextBase from qutebrowser.config.style import set_register_stylesheet, get_stylesheet from qutebrowser.utils.url import urlstring @@ -140,3 +141,14 @@ class Url(TextBase): self.urltype = self._old_urltype self._old_url = None self._old_urltype = None + + @pyqtSlot(int) + def on_tab_changed(self, idx): + """Update URL if the tab changed.""" + tab = self.sender().widget(idx) + self.setText(urlstring(tab.url())) + status = LoadStatus[tab.load_status] + if status in ['success', 'error', 'warn']: + self.urltype = status + else: + self.urltype = 'normal' diff --git a/qutebrowser/widgets/webview.py b/qutebrowser/widgets/webview.py index e5c274af2..3cca33869 100644 --- a/qutebrowser/widgets/webview.py +++ b/qutebrowser/widgets/webview.py @@ -59,7 +59,7 @@ class WebView(QWebView): Accessed via load_status property. _has_ssl_errors: Whether SSL errors occured during loading. _zoom: A NeighborList with the zoom levels. - _scroll_pos: The old scroll position. + _old_scroll_pos: The old scroll position. _shutdown_callback: Callback to be called after shutdown. _open_target: Where to open the next tab ("normal", "tab", "bgtab") _force_open_target: Override for _open_target. @@ -82,7 +82,8 @@ class WebView(QWebView): super().__init__(parent) self._load_status = LoadStatus.none self.tabbedbrowser = parent - self._scroll_pos = (-1, -1) + self.scroll_pos = (-1, -1) + self._old_scroll_pos = (-1, -1) self._shutdown_callback = None self._open_target = Target.normal self._force_open_target = None @@ -90,9 +91,6 @@ class WebView(QWebView): self._zoom = None self._init_neighborlist() self.progress = 0 - self.loadProgress.connect(lambda p: setattr(self, 'progress', p)) - self.page_.networkAccessManager().sslErrors.connect( - lambda *args: setattr(self, '_has_ssl_errors', True)) self.page_ = BrowserPage(self) self.setPage(self.page_) self.hintmanager = HintManager(self) @@ -103,6 +101,9 @@ class WebView(QWebView): self.linkClicked.connect(self.on_link_clicked) self.page_.mainFrame().loadStarted.connect(self.on_load_started) self.loadFinished.connect(self.on_load_finished) + self.loadProgress.connect(lambda p: setattr(self, 'progress', p)) + self.page_.networkAccessManager().sslErrors.connect( + lambda *args: setattr(self, '_has_ssl_errors', True)) # FIXME find some way to hide scrollbars without setScrollBarPolicy @property @@ -374,11 +375,11 @@ class WebView(QWebView): def on_load_finished(self, ok): """Handle auto-insert-mode after loading finished.""" if ok and not self._has_ssl_errors: - self.urltype = 'success' + self.load_status = LoadStatus.success elif ok: - self.urltype = 'warn' + self.load_status = LoadStatus.warn else: - self.urltype = 'error' + self.load_status = LoadStatus.error if not config.get('input', 'auto-insert-mode'): return if modeman.instance().mode == 'insert' or not ok: @@ -449,8 +450,8 @@ class WebView(QWebView): frame = self.page_.mainFrame() new_pos = (frame.scrollBarValue(Qt.Horizontal), frame.scrollBarValue(Qt.Vertical)) - if self._scroll_pos != new_pos: - self._scroll_pos = new_pos + if self._old_scroll_pos != new_pos: + self._old_scroll_pos = new_pos logging.debug("Updating scroll position") m = (frame.scrollBarMaximum(Qt.Horizontal), frame.scrollBarMaximum(Qt.Vertical))