diff --git a/qutebrowser/config/style.py b/qutebrowser/config/style.py index 92c893c45..b2697daac 100644 --- a/qutebrowser/config/style.py +++ b/qutebrowser/config/style.py @@ -46,7 +46,7 @@ def get_stylesheet(template_str): config=objreg.get('config')) -def set_register_stylesheet(obj, *, generator=None): +def set_register_stylesheet(obj): """Set the stylesheet for an object based on it's STYLESHEET attribute. Also, register an update when the config is changed. @@ -54,23 +54,20 @@ def set_register_stylesheet(obj, *, generator=None): Args: obj: The object to set the stylesheet for and register. Must have a STYLESHEET attribute. - generator: If set, call the given function to dynamically generate a - stylesheet instead. """ - stylesheet = generator() if generator is not None else obj.STYLESHEET - qss = get_stylesheet(stylesheet) + qss = get_stylesheet(obj.STYLESHEET) log.config.vdebug("stylesheet for {}: {}".format( obj.__class__.__name__, qss)) obj.setStyleSheet(qss) objreg.get('config').changed.connect( - functools.partial(_update_stylesheet, obj, generator=generator)) + functools.partial(_update_stylesheet, obj)) -def _update_stylesheet(obj, *, generator): +def _update_stylesheet(obj): """Update the stylesheet for obj.""" + get_stylesheet.cache_clear() if not sip.isdeleted(obj): - stylesheet = generator() if generator is not None else obj.STYLESHEET - obj.setStyleSheet(get_stylesheet(stylesheet)) + obj.setStyleSheet(get_stylesheet(obj.STYLESHEET)) class ColorDict(collections.UserDict): diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py index de949b04b..a85b00f93 100644 --- a/qutebrowser/mainwindow/prompt.py +++ b/qutebrowser/mainwindow/prompt.py @@ -77,6 +77,30 @@ class PromptContainer(QWidget): _win_id: The window ID this object is associated with. """ + STYLESHEET = """ + QWidget#Prompt { + {% if config.get('ui', 'status-position') == 'top' %} + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + {% else %} + border-top-left-radius: 10px; + border-top-right-radius: 10px; + {% endif %} + } + + QWidget { + /* FIXME + font: {{ font['keyhint'] }}; + FIXME + */ + color: {{ color['statusbar.fg.prompt'] }}; + background-color: {{ color['statusbar.bg.prompt'] }}; + } + + QLineEdit { + border: 1px solid grey; + } + """ update_geometry = pyqtSignal() def __init__(self, win_id, parent=None): @@ -86,8 +110,7 @@ class PromptContainer(QWidget): self._layout = QVBoxLayout(self) self._layout.setContentsMargins(10, 10, 10, 10) self._prompt = None - style.set_register_stylesheet(self, - generator=self._generate_stylesheet) + style.set_register_stylesheet(self) # FIXME review this self._shutting_down = False @@ -99,35 +122,6 @@ class PromptContainer(QWidget): return utils.get_repr(self, loops=len(self._loops), queue=len(self._queue), prompt=self._prompt) - def _generate_stylesheet(self): - """Generate a stylesheet with the right edge rounded.""" - stylesheet = """ - QWidget#Prompt { - border-POSITION-left-radius: 10px; - border-POSITION-right-radius: 10px; - } - - QWidget { - /* FIXME - font: {{ font['keyhint'] }}; - FIXME - */ - color: {{ color['statusbar.fg.prompt'] }}; - background-color: {{ color['statusbar.bg.prompt'] }}; - } - - QLineEdit { - border: 1px solid grey; - } - """ - position = config.get('ui', 'status-position') - if position == 'top': - return stylesheet.replace('POSITION', 'bottom') - elif position == 'bottom': - return stylesheet.replace('POSITION', 'top') - else: - raise ValueError("Invalid position {}!".format(position)) - def _pop_later(self): """Helper to call self._pop as soon as everything else is done.""" QTimer.singleShot(0, self._pop) diff --git a/qutebrowser/misc/keyhintwidget.py b/qutebrowser/misc/keyhintwidget.py index 667edeb1c..c66712eb9 100644 --- a/qutebrowser/misc/keyhintwidget.py +++ b/qutebrowser/misc/keyhintwidget.py @@ -45,6 +45,19 @@ class KeyHintView(QLabel): update_geometry: Emitted when this widget should be resized/positioned. """ + STYLESHEET = """ + QLabel { + font: {{ font['keyhint'] }}; + color: {{ color['keyhint.fg'] }}; + background-color: {{ color['keyhint.bg'] }}; + padding: 6px; + {% if config.get('ui', 'status-position') == 'top' %} + border-bottom-right-radius: 6px; + {% else %} + border-top-right-radius: 6px; + {% endif %} + } + """ update_geometry = pyqtSignal() def __init__(self, win_id, parent=None): @@ -56,8 +69,7 @@ class KeyHintView(QLabel): self._show_timer = usertypes.Timer(self, 'keyhint_show') self._show_timer.setInterval(500) self._show_timer.timeout.connect(self.show) - style.set_register_stylesheet(self, - generator=self._generate_stylesheet) + style.set_register_stylesheet(self) def __repr__(self): return utils.get_repr(self, win_id=self._win_id) @@ -67,22 +79,6 @@ class KeyHintView(QLabel): self.update_geometry.emit() super().showEvent(e) - def _generate_stylesheet(self): - """Generate a stylesheet with the right edge rounded.""" - stylesheet = """ - QLabel { - font: {{ font['keyhint'] }}; - color: {{ color['keyhint.fg'] }}; - background-color: {{ color['keyhint.bg'] }}; - padding: 6px; - border-EDGE-radius: 6px; - } - """ - if config.get('ui', 'status-position') == 'top': - return stylesheet.replace('EDGE', 'bottom-right') - else: - return stylesheet.replace('EDGE', 'top-right') - @pyqtSlot(str) def update_keyhint(self, modename, prefix): """Show hints for the given prefix (or hide if prefix is empty). diff --git a/tests/unit/config/test_style.py b/tests/unit/config/test_style.py index bcb8a6b28..6b55aebae 100644 --- a/tests/unit/config/test_style.py +++ b/tests/unit/config/test_style.py @@ -59,24 +59,6 @@ class Obj(QObject): self.rendered_stylesheet = stylesheet -class GeneratedObj(QObject): - - def __init__(self, parent=None): - super().__init__(parent) - self.rendered_stylesheet = None - self._generated = False - - def setStyleSheet(self, stylesheet): - self.rendered_stylesheet = stylesheet - - def generate(self): - if not self._generated: - self._generated = True - return 'one' - else: - return 'two' - - @pytest.mark.parametrize('delete', [True, False]) def test_set_register_stylesheet(delete, qtbot, config_stub, caplog): config_stub.data = {'fonts': {'foo': 'bar'}, 'colors': {}} @@ -105,15 +87,6 @@ def test_set_register_stylesheet(delete, qtbot, config_stub, caplog): assert obj.rendered_stylesheet == expected -def test_set_register_stylesheet_generator(qtbot, config_stub): - config_stub.data = {'fonts': {}, 'colors': {}} - obj = GeneratedObj() - style.set_register_stylesheet(obj, generator=obj.generate) - assert obj.rendered_stylesheet == 'one' - config_stub.changed.emit('foo', 'bar') - assert obj.rendered_stylesheet == 'two' - - class TestColorDict: @pytest.mark.parametrize('key, expected', [