diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 19db726d877..5fdf48924f3 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -518,9 +518,9 @@ def _connect_signals(self): self.status.on_tab_changed) self.tabbed_browser.cur_progress.connect( - self.status.prog.widget.on_load_progress) + self.status.prog.on_load_progress) self.tabbed_browser.cur_load_started.connect( - self.status.prog.widget.on_load_started) + self.status.prog.on_load_started) self.tabbed_browser.cur_scroll_perc_changed.connect( self.status.percentage.widget.set_perc) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 78a3c7b94ad..f11b82e461b 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -217,7 +217,7 @@ def _get_widget_from_config(self, key, tab) -> StatusBarItem: return self.keystring elif key == 'progress': if tab: - self.prog.widget.on_tab_changed(tab) + self.prog.on_tab_changed(tab) return self.prog elif key == 'search_match': return self.search_match @@ -410,7 +410,7 @@ def on_mode_left(self, old_mode, new_mode): def on_tab_changed(self, tab): """Notify sub-widgets when the tab has been changed.""" self.url.widget.on_tab_changed(tab) - self.prog.widget.on_tab_changed(tab) + self.prog.on_tab_changed(tab) self.percentage.widget.on_tab_changed(tab) self.backforward.on_tab_changed(tab) self.maybe_hide() diff --git a/qutebrowser/mainwindow/statusbar/progress.py b/qutebrowser/mainwindow/statusbar/progress.py index d1ae8d550b3..edca1693a4a 100644 --- a/qutebrowser/mainwindow/statusbar/progress.py +++ b/qutebrowser/mainwindow/statusbar/progress.py @@ -5,7 +5,7 @@ """The progress bar in the statusbar.""" from qutebrowser.mainwindow.statusbar.item import StatusBarItem -from qutebrowser.qt.core import pyqtSlot, QSize +from qutebrowser.qt.core import QSize from qutebrowser.qt.widgets import QProgressBar, QSizePolicy from qutebrowser.config import stylesheet @@ -29,44 +29,9 @@ class ProgressWidget(QProgressBar): } """ - def __init__(self, parent=None): - super().__init__(parent) - stylesheet.set_register(self) - self.enabled = False - self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) - self.setTextVisible(False) - self.hide() - def __repr__(self): return utils.get_repr(self, value=self.value()) - @pyqtSlot() - def on_load_started(self): - """Clear old error and show progress, used as slot to loadStarted.""" - self.setValue(0) - self.setVisible(self.enabled) - - @pyqtSlot(int) - def on_load_progress(self, value): - """Hide the statusbar when loading finished. - - We use this instead of loadFinished because we sometimes get - loadStarted and loadProgress(100) without loadFinished from Qt. - - WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 - """ - self.setValue(value) - if value == 100: - self.hide() - - def on_tab_changed(self, tab): - """Set the correct value when the current tab changed.""" - self.setValue(tab.progress()) - if self.enabled and tab.load_status() == usertypes.LoadStatus.loading: - self.show() - else: - self.hide() - def sizeHint(self): """Set the height to the text height.""" width = super().sizeHint().width() @@ -79,10 +44,40 @@ def minimumSizeHint(self): class Progress(StatusBarItem): def __init__(self, widget: ProgressWidget): - self.widget = widget + super().__init__(widget) + self.enabled = False + stylesheet.set_register(self.widget) + self.widget.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + self.widget.setTextVisible(False) + self.widget.hide() def enable(self): - self.widget.enabled = True + self.enabled = True def disable(self): - self.widget.enabled = False + self.enabled = False + + def on_load_started(self): + """Clear old error and show progress, used as slot to loadStarted.""" + self.widget.setValue(0) + self.widget.setVisible(self.enabled) + + def on_tab_changed(self, tab): + """Set the correct value when the current tab changed.""" + self.widget.setValue(tab.progress()) + if self.enabled and tab.load_status() == usertypes.LoadStatus.loading: + self.widget.show() + else: + self.widget.hide() + + def on_load_progress(self, value): + """Hide the statusbar when loading finished. + + We use this instead of loadFinished because we sometimes get + loadStarted and loadProgress(100) without loadFinished from Qt. + + WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 + """ + self.widget.setValue(value) + if value == 100: + self.widget.hide() diff --git a/tests/unit/mainwindow/statusbar/test_progress.py b/tests/unit/mainwindow/statusbar/test_progress.py index 3047f136d6d..d681c91fc50 100644 --- a/tests/unit/mainwindow/statusbar/test_progress.py +++ b/tests/unit/mainwindow/statusbar/test_progress.py @@ -13,11 +13,11 @@ @pytest.fixture def progress_widget(qtbot, config_stub): """Create a Progress widget and checks its initial state.""" - widget = progress.ProgressWidget() + widget = progress.Progress(widget=progress.ProgressWidget()) widget.enabled = True - qtbot.add_widget(widget) - assert not widget.isVisible() - assert not widget.isTextVisible() + qtbot.add_widget(widget.widget) + assert not widget.widget.isVisible() + assert not widget.widget.isTextVisible() return widget @@ -28,8 +28,8 @@ def test_load_started(progress_widget): progress_widget: Progress widget that will be tested. """ progress_widget.on_load_started() - assert progress_widget.value() == 0 - assert progress_widget.isVisible() + assert progress_widget.widget.value() == 0 + assert progress_widget.widget.isVisible() @pytest.mark.parametrize('progress, load_status, expected_visible', [ @@ -48,7 +48,7 @@ def test_tab_changed(fake_web_tab, progress_widget, progress, load_status, """ tab = fake_web_tab(progress=progress, load_status=load_status) progress_widget.on_tab_changed(tab) - actual = progress_widget.value(), progress_widget.isVisible() + actual = progress_widget.widget.value(), progress_widget.widget.isVisible() expected = tab.progress(), expected_visible assert actual == expected @@ -58,7 +58,7 @@ def test_not_shown_when_disabled(progress_widget, fake_web_tab): tab = fake_web_tab(progress=15, load_status=usertypes.LoadStatus.loading) progress_widget.enabled = False progress_widget.on_tab_changed(tab) - assert not progress_widget.isVisible() + assert not progress_widget.widget.isVisible() def test_progress_affecting_statusbar_height(config_stub, fake_statusbar, @@ -78,8 +78,8 @@ def test_progress_affecting_statusbar_height(config_stub, fake_statusbar, expected_height = fake_statusbar.fontMetrics().height() assert fake_statusbar.height() == expected_height - fake_statusbar.hbox.addWidget(progress_widget) - progress_widget.show() + fake_statusbar.hbox.addWidget(progress_widget.widget) + progress_widget.widget.show() assert fake_statusbar.height() == expected_height @@ -89,8 +89,8 @@ def test_progress_big_statusbar(qtbot, fake_statusbar, progress_widget): https://github.com/qutebrowser/qutebrowser/commit/46d1760798b730852e2207e2cdc05a9308e44f80 """ - fake_statusbar.hbox.addWidget(progress_widget) - progress_widget.show() - expected_height = progress_widget.height() + fake_statusbar.hbox.addWidget(progress_widget.widget) + progress_widget.widget.show() + expected_height = progress_widget.widget.height() fake_statusbar.hbox.addStrut(50) - assert progress_widget.height() == expected_height + assert progress_widget.widget.height() == expected_height