Update everything needed when config is changed

This commit is contained in:
Florian Bruhin 2014-04-10 23:30:45 +02:00
parent aa616e5ac7
commit 04807489b7
8 changed files with 70 additions and 22 deletions

View File

@ -47,6 +47,7 @@ from PyQt5.QtCore import pyqtSlot, QTimer, QEventLoop
import qutebrowser
import qutebrowser.commands.utils as cmdutils
import qutebrowser.config.style as style
import qutebrowser.config.config as config
import qutebrowser.network.qutescheme as qutescheme
import qutebrowser.utils.message as message
@ -130,10 +131,11 @@ class QuteBrowser(QApplication):
self.mainwindow.status.keystring.setText)
message.bridge.error.connect(self.mainwindow.status.disp_error)
message.bridge.info.connect(self.mainwindow.status.disp_tmp_text)
self.config.style_changed.connect(style.invalidate_caches)
self.config.changed.connect(self.mainwindow.tabs.on_config_changed)
self.config.changed.connect(
self.mainwindow.completion.on_config_changed)
self.config.changed.connect(self.mainwindow.resize_completion)
self.config.changed.connect(self.mainwindow.on_config_changed)
self.mainwindow.show()
self._python_hacks()

View File

@ -86,9 +86,12 @@ class Config(QObject):
Signals:
changed: Gets emitted when the config has changed.
Args: the changed section and option.
style_changed: When style caches need to be invalidated.
Args: the changed section and option.
"""
changed = pyqtSignal(str, str)
style_changed = pyqtSignal(str, str)
def __init__(self, configdir, fname, parent=None):
super().__init__(parent)
@ -287,6 +290,7 @@ class Config(QObject):
Emit:
changed: If the config was changed.
style_changed: When style caches need to be invalidated.
"""
if value:
value = self._interpolation.before_set(self, section, option,
@ -300,6 +304,8 @@ class Config(QObject):
except KeyError:
raise NoOptionError(option, section)
else:
if section in ['colors', 'fonts']:
self.style_changed.emit(section, option)
self.changed.emit(section, option)
def save(self):

View File

@ -17,6 +17,8 @@
"""Utilities related to the look&feel of qutebrowser."""
from functools import partial
import qutebrowser.config.config as config
_colordict = None
@ -40,6 +42,31 @@ def get_stylesheet(template):
return template.strip().format(color=_colordict, font=_fontdict)
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.
"""
obj.setStyleSheet(get_stylesheet(obj.STYLESHEET))
config.config.changed.connect(partial(_update_stylesheet, obj))
def _update_stylesheet(obj, section, option):
"""Update the stylesheet for obj."""
# pylint: disable=unused-argument
obj.setStyleSheet(get_stylesheet(obj.STYLESHEET))
def invalidate_caches(section, option):
"""Invalidate cached dicts."""
# pylint: disable=unused-argument
global _colordict, _fontdict
if section == 'colors':
_colordict = None
elif section == 'fonts':
_fontdict = None
class ColorDict(dict):
"""A dict aimed at Qt stylesheet colors."""

View File

@ -35,7 +35,7 @@ import qutebrowser.config.config as config
import qutebrowser.commands.utils as cmdutils
from qutebrowser.config.configdata import configdata
from qutebrowser.models.completion import ROLE_MARKS
from qutebrowser.config.style import get_stylesheet
from qutebrowser.config.style import set_register_stylesheet, get_stylesheet
from qutebrowser.commands.parsers import split_cmdline
from qutebrowser.models.completionfilter import CompletionFilterModel
from qutebrowser.models.commandcompletion import CommandCompletionModel
@ -55,7 +55,7 @@ class CompletionView(QTreeView):
Attributes:
_model: The currently active filter model.
_lastmodel: The model set in the last iteration.
_STYLESHEET: The stylesheet template for the CompletionView.
STYLESHEET: The stylesheet template for the CompletionView.
_completion_models: dict of available completion models.
_ignore_next: Whether to ignore the next cmd_text_changed signal.
_enabled: Whether showing the CompletionView is enabled.
@ -69,7 +69,7 @@ class CompletionView(QTreeView):
we're currently completing.
"""
_STYLESHEET = """
STYLESHEET = """
QTreeView {{
{font[completion]}
{color[completion.fg]}
@ -119,7 +119,7 @@ class CompletionView(QTreeView):
self._delegate = _CompletionItemDelegate(self)
self.setItemDelegate(self._delegate)
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
set_register_stylesheet(self)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)
self.setHeaderHidden(True)
self.setIndentation(0)

View File

@ -97,6 +97,11 @@ class MainWindow(QWidget):
#self.tabWidget.setCurrentIndex(0)
#QtCore.QMetaObject.connectSlotsByName(MainWindow)
def on_config_changed(self, section, option):
"""Resize completion if config changed."""
if section == 'general' and option == 'completion_height':
self.resize_completion()
def resize_completion(self):
"""Adjust completion according to config."""
confheight = str(config.config.get('general', 'completion_height'))

View File

@ -25,7 +25,7 @@ from PyQt5.QtWidgets import (QWidget, QLineEdit, QProgressBar, QLabel,
QShortcut)
from PyQt5.QtGui import QPainter, QKeySequence, QValidator
from qutebrowser.config.style import get_stylesheet
from qutebrowser.config.style import set_register_stylesheet, get_stylesheet
import qutebrowser.commands.keys as keys
from qutebrowser.utils.url import urlstring
from qutebrowser.utils.usertypes import NeighborList
@ -47,7 +47,7 @@ class StatusBar(QWidget):
_stack: The QStackedLayout with cmd/txt widgets.
_error: If there currently is an error, accessed through the error
property.
_STYLESHEET: The stylesheet template.
STYLESHEET: The stylesheet template.
Signals:
resized: Emitted when the statusbar has resized, so the completion
@ -60,7 +60,7 @@ class StatusBar(QWidget):
resized = pyqtSignal('QRect')
moved = pyqtSignal('QPoint')
_STYLESHEET = """
STYLESHEET = """
QWidget#StatusBar[error="false"] {{
{color[statusbar.bg]}
}}
@ -79,7 +79,7 @@ class StatusBar(QWidget):
super().__init__(parent)
self.setObjectName(self.__class__.__name__)
self.setAttribute(Qt.WA_StyledBackground)
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
set_register_stylesheet(self)
self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)
@ -132,7 +132,7 @@ class StatusBar(QWidget):
updated by Qt properly.
"""
self._error = val
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
self.setStyleSheet(get_stylesheet(self.STYLESHEET))
def _show_cmd_widget(self):
"""Show command widget instead of temporary text."""
@ -429,11 +429,11 @@ class _Progress(QProgressBar):
"""The progress bar part of the status bar.
Attributes:
_STYLESHEET: The stylesheet template.
STYLESHEET: The stylesheet template.
"""
# FIXME for some reason, margin-left is not shown
_STYLESHEET = """
STYLESHEET = """
QProgressBar {{
border-radius: 0px;
border: 2px solid transparent;
@ -448,7 +448,7 @@ class _Progress(QProgressBar):
def __init__(self, parent):
super().__init__(parent)
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
set_register_stylesheet(self)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Ignored)
self.setTextVisible(False)
self.hide()
@ -618,10 +618,10 @@ class _Url(TextBase):
_old_urltype: The type of the URL displayed before the hover URL.
_urltype: The current URL type. One of normal/ok/error/warn/hover.
Accessed via the urltype property.
_STYLESHEET: The stylesheet template.
STYLESHEET: The stylesheet template.
"""
_STYLESHEET = """
STYLESHEET = """
QLabel#Url[urltype="normal"] {{
{color[statusbar.url.fg]}
}}
@ -652,7 +652,7 @@ class _Url(TextBase):
"""
super().__init__(bar, elidemode)
self.setObjectName(self.__class__.__name__)
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
set_register_stylesheet(self)
self._urltype = None
self._old_urltype = None
self._old_url = None
@ -667,7 +667,7 @@ class _Url(TextBase):
def urltype(self, val):
"""Setter for self.urltype, so it can be used as Qt property."""
self._urltype = val
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
self.setStyleSheet(get_stylesheet(self.STYLESHEET))
@pyqtSlot(bool)
def on_loading_finished(self, ok):

View File

@ -17,11 +17,11 @@
"""The tab widget used for TabbedBrowser from browser.py."""
from PyQt5.QtCore import Qt
from PyQt5.QtCore import pyqtSlot, Qt
from PyQt5.QtWidgets import QTabWidget, QTabBar, QSizePolicy
import qutebrowser.config.config as config
from qutebrowser.config.style import get_stylesheet
from qutebrowser.config.style import set_register_stylesheet
from qutebrowser.utils.style import Style
@ -30,13 +30,13 @@ class TabWidget(QTabWidget):
"""The tabwidget used for TabbedBrowser.
Attributes:
_STYLESHEET: The stylesheet template to be used.
STYLESHEET: The stylesheet template to be used.
"""
# FIXME there is still some ugly 1px white stripe from somewhere if we do
# background-color: grey for QTabBar...
_STYLESHEET = """
STYLESHEET = """
QTabWidget::pane {{
position: absolute;
top: 0px;
@ -68,7 +68,7 @@ class TabWidget(QTabWidget):
super().__init__(parent)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.setStyle(Style(self.style()))
self.setStyleSheet(get_stylesheet(self._STYLESHEET))
set_register_stylesheet(self)
self.setDocumentMode(True)
self.setElideMode(Qt.ElideRight)
self._init_config()
@ -96,3 +96,10 @@ class TabWidget(QTabWidget):
self.tabBar().setSelectionBehaviorOnRemove(select_conv[selstr])
except KeyError:
pass
@pyqtSlot(str, str)
def on_config_changed(self, section, option):
"""Update attributes when config changed."""
# pylint: disable=unused-argument
if section == 'tabbar':
self._init_config()

View File

@ -142,6 +142,7 @@ class TabbedBrowser(TabWidget):
@pyqtSlot(str, str)
def on_config_changed(self, section, option):
"""Update tab config when config was changed."""
super().on_config_changed(section, option)
for tab in self._tabs:
tab.on_config_changed(section, option)