From 5959221fb6c969a0cc66746288100a6112e18e4f Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:08:32 +0200 Subject: Added widget to display a clock in the statusbar. --- qutebrowser/mainwindow/statusbar/clock.py | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 qutebrowser/mainwindow/statusbar/clock.py diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py new file mode 100644 index 000000000..bd694d7ea --- /dev/null +++ b/qutebrowser/mainwindow/statusbar/clock.py @@ -0,0 +1,45 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2014-2021 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Clock displayed in the statusbar.""" +from datetime import datetime + +from PyQt5.QtCore import Qt, QTimer + +from qutebrowser.mainwindow.statusbar import textbase + + +class Clock(textbase.TextBase): + + """Shows current time and date in the statusbar.""" + + def __init__(self, parent=None): + super().__init__(parent, elidemode=Qt.ElideNone) + self.format = None + + self.timer = QTimer(self) + self.timer.timeout.connect(self._show_time) + + def _show_time(self): + self.setText(datetime.now().strftime(self.format)) + + def show(self) -> None: + self.timer.start(100) + self._show_time() + super().show() -- cgit v1.2.3-54-g00ecf From e59eba3d17f0ca7c24d1773ad3eb901cc7891b1e Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:09:38 +0200 Subject: Add clock widget to statusbar. --- qutebrowser/mainwindow/statusbar/bar.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 8bad290be..b0e1f7cc7 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -32,7 +32,7 @@ from qutebrowser.keyinput import modeman from qutebrowser.utils import usertypes, log, objreg, utils from qutebrowser.mainwindow.statusbar import (backforward, command, progress, keystring, percentage, url, - tabindex, textbase) + tabindex, textbase, clock) @dataclasses.dataclass @@ -200,6 +200,7 @@ class StatusBar(QWidget): self.tabindex = tabindex.TabIndex() self.keystring = keystring.KeyString() self.prog = progress.Progress(self) + self.clock = clock.Clock() self._text_widgets = [] self._draw_widgets() @@ -258,6 +259,15 @@ class StatusBar(QWidget): cur_widget.setText(segment.split(':', maxsplit=1)[1]) self._hbox.addWidget(cur_widget) cur_widget.show() + elif segment.startswith('clock:') or segment == 'clock': + split_segment = segment.split(':', maxsplit=1) + if len(split_segment) == 2 and split_segment[1]: + self.clock.format = split_segment[1] + else: + self.clock.format = '%X' + + self._hbox.addWidget(self.clock) + self.clock.show() else: raise utils.Unreachable(segment) @@ -266,7 +276,7 @@ class StatusBar(QWidget): # Start with widgets hidden and show them when needed for widget in [self.url, self.percentage, self.backforward, self.tabindex, - self.keystring, self.prog, *self._text_widgets]: + self.keystring, self.prog, self.clock, *self._text_widgets]: assert isinstance(widget, QWidget) widget.hide() self._hbox.removeWidget(widget) -- cgit v1.2.3-54-g00ecf From 6cd62e316057def6d3a334f7d5988a0aa33f438b Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:10:03 +0200 Subject: Allow clock entry in statusbar.widgets config. --- qutebrowser/config/configdata.yml | 3 +++ qutebrowser/config/configtypes.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 6cb277e5c..5ea30a275 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1935,6 +1935,9 @@ statusbar.widgets: - keypress: "Display pressed keys when composing a vi command." - progress: "Progress bar for the current page loading." - 'text:foo': "Display the static text after the colon, `foo` in the example." + - clock: "Display current time. Format can be changed by adding like + `clock:$format`. For format strings see + link:https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior[the python datetime library]." none_ok: true default: ['keypress', 'url', 'scroll', 'history', 'tabs', 'progress'] desc: "List of widgets displayed in the statusbar." diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index c157fba41..8ceb67b47 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -2006,6 +2006,6 @@ class StatusbarWidget(String): """ def _validate_valid_values(self, value: str) -> None: - if value.startswith("text:"): + if value.startswith("text:") or value.startswith("clock:"): return super()._validate_valid_values(value) -- cgit v1.2.3-54-g00ecf From 04423112510beec76c9996f3cc079fb987fda735 Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:10:11 +0200 Subject: Update documentation. --- doc/help/settings.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 42eacd175..587576e18 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -3987,6 +3987,7 @@ Valid values: * +keypress+: Display pressed keys when composing a vi command. * +progress+: Progress bar for the current page loading. * +text:foo+: Display the static text after the colon, `foo` in the example. + * +clock+: Display current time. Format can be changed by adding like `clock:$format`. For format strings see link:https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior[the python datetime library]. Default: -- cgit v1.2.3-54-g00ecf From 44116f9d829b335d36b84ba43c472e8f26ad9bb0 Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:21:07 +0200 Subject: Added doc-strings to Clock widget. --- qutebrowser/mainwindow/statusbar/clock.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py index bd694d7ea..844ba8c27 100644 --- a/qutebrowser/mainwindow/statusbar/clock.py +++ b/qutebrowser/mainwindow/statusbar/clock.py @@ -37,9 +37,11 @@ class Clock(textbase.TextBase): self.timer.timeout.connect(self._show_time) def _show_time(self): + """Set text to current time, using self.format as format-string.""" self.setText(datetime.now().strftime(self.format)) def show(self) -> None: + """Override show() to show time and start self.timer for updating.""" self.timer.start(100) self._show_time() super().show() -- cgit v1.2.3-54-g00ecf From ffbfa5386dacaa8aed1607f652815b92f16520e5 Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:52:28 +0200 Subject: Reworked _draw_widgets() to reduce complexity. --- qutebrowser/mainwindow/statusbar/bar.py | 74 +++++++++++++++++---------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index b0e1f7cc7..72dc52b8b 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -210,6 +210,31 @@ class StatusBar(QWidget): def __repr__(self): return utils.get_repr(self) + def _get_widget_from_config(self, key): + """Return the widget that fits with config string key.""" + if key == 'url': + return self.url + elif key == 'scroll': + return self.percentage + elif key == 'scroll_raw': + return self.percentage + elif key == 'history': + return self.backforward + elif key == 'tabs': + return self.tabindex + elif key == 'keypress': + return self.keystring + elif key == 'progress': + return self.prog + elif key.startswith('text:'): + new_text_widget = textbase.TextBase() + self._text_widgets.append(new_text_widget) + return new_text_widget + elif key.startswith('clock:') or key == 'clock': + return self.clock + else: + raise utils.Unreachable(key) + @pyqtSlot(str) def _on_config_changed(self, option): if option == 'statusbar.show': @@ -227,49 +252,28 @@ class StatusBar(QWidget): # Read the list and set widgets accordingly for segment in config.val.statusbar.widgets: - if segment == 'url': - self._hbox.addWidget(self.url) - self.url.show() - elif segment == 'scroll': - self._hbox.addWidget(self.percentage) - self.percentage.show() - elif segment == 'scroll_raw': - self._hbox.addWidget(self.percentage) - self.percentage.set_raw() - self.percentage.show() - elif segment == 'history': - self._hbox.addWidget(self.backforward) - self.backforward.enabled = True - if tab: - self.backforward.on_tab_changed(tab) - elif segment == 'tabs': - self._hbox.addWidget(self.tabindex) - self.tabindex.show() - elif segment == 'keypress': - self._hbox.addWidget(self.keystring) - self.keystring.show() - elif segment == 'progress': - self._hbox.addWidget(self.prog) - self.prog.enabled = True + cur_widget = self._get_widget_from_config(segment) + self._hbox.addWidget(cur_widget) + + if segment == 'scroll_raw': + cur_widget.set_raw() + elif segment == 'history' or segment == 'progress': + cur_widget.enabled = True if tab: - self.prog.on_tab_changed(tab) + cur_widget.on_tab_changed(tab) + + # Do not call .show() for these widgets. + return elif segment.startswith('text:'): - cur_widget = textbase.TextBase() - self._text_widgets.append(cur_widget) cur_widget.setText(segment.split(':', maxsplit=1)[1]) - self._hbox.addWidget(cur_widget) - cur_widget.show() elif segment.startswith('clock:') or segment == 'clock': split_segment = segment.split(':', maxsplit=1) if len(split_segment) == 2 and split_segment[1]: - self.clock.format = split_segment[1] + cur_widget.format = split_segment[1] else: - self.clock.format = '%X' + cur_widget.format = '%X' - self._hbox.addWidget(self.clock) - self.clock.show() - else: - raise utils.Unreachable(segment) + cur_widget.show() def _clear_widgets(self): """Clear widgets before redrawing them.""" -- cgit v1.2.3-54-g00ecf From 7d8aacc6f9d2b2d187130e1cf32d7d504985d271 Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 20:54:18 +0200 Subject: Changed Clock.format to always be string to make mypy happy. --- qutebrowser/mainwindow/statusbar/clock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py index 844ba8c27..6df8f1541 100644 --- a/qutebrowser/mainwindow/statusbar/clock.py +++ b/qutebrowser/mainwindow/statusbar/clock.py @@ -31,7 +31,7 @@ class Clock(textbase.TextBase): def __init__(self, parent=None): super().__init__(parent, elidemode=Qt.ElideNone) - self.format = None + self.format = "" self.timer = QTimer(self) self.timer.timeout.connect(self._show_time) -- cgit v1.2.3-54-g00ecf From 53794f8c828499e94df5fa0a688b58be63f1fd12 Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Fri, 9 Apr 2021 21:07:52 +0200 Subject: Merged two comparisons. --- qutebrowser/mainwindow/statusbar/bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 72dc52b8b..f4b81b7e6 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -257,7 +257,7 @@ class StatusBar(QWidget): if segment == 'scroll_raw': cur_widget.set_raw() - elif segment == 'history' or segment == 'progress': + elif segment in ('history', 'progress'): cur_widget.enabled = True if tab: cur_widget.on_tab_changed(tab) -- cgit v1.2.3-54-g00ecf From 096529c06be7dcbc78b39a7605a650de62b7a99a Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Thu, 6 May 2021 19:28:57 +0200 Subject: Override showEvent and hideEvent instead of show. --- qutebrowser/mainwindow/statusbar/clock.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py index 6df8f1541..0b14f676d 100644 --- a/qutebrowser/mainwindow/statusbar/clock.py +++ b/qutebrowser/mainwindow/statusbar/clock.py @@ -40,8 +40,14 @@ class Clock(textbase.TextBase): """Set text to current time, using self.format as format-string.""" self.setText(datetime.now().strftime(self.format)) - def show(self) -> None: - """Override show() to show time and start self.timer for updating.""" + def hideEvent(self, event): + """Stop timer when widget is hidden.""" + self.timer.stop() + super().hideEvent(event) + + def showEvent(self, event): + """Override showEvent to show time and start self.timer for updating.""" self.timer.start(100) self._show_time() - super().show() + super().showEvent(event) + -- cgit v1.2.3-54-g00ecf From 8aef7cedcd97d08ca48cff5f05f7844694c8be7a Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Thu, 6 May 2021 19:32:32 +0200 Subject: Set delay between clock updates to 500ms. --- qutebrowser/mainwindow/statusbar/clock.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py index 0b14f676d..20587a5ac 100644 --- a/qutebrowser/mainwindow/statusbar/clock.py +++ b/qutebrowser/mainwindow/statusbar/clock.py @@ -29,6 +29,8 @@ class Clock(textbase.TextBase): """Shows current time and date in the statusbar.""" + UPDATE_DELAY = 500 # ms + def __init__(self, parent=None): super().__init__(parent, elidemode=Qt.ElideNone) self.format = "" @@ -47,7 +49,6 @@ class Clock(textbase.TextBase): def showEvent(self, event): """Override showEvent to show time and start self.timer for updating.""" - self.timer.start(100) + self.timer.start(Clock.UPDATE_DELAY) self._show_time() super().showEvent(event) - -- cgit v1.2.3-54-g00ecf