Use separate QHBoxLayout elements for statusbar.

This commit is contained in:
Florian Bruhin 2014-02-11 17:56:40 +01:00
parent f0df411464
commit 002118953c
3 changed files with 87 additions and 62 deletions

View File

@ -110,7 +110,7 @@ class QuteBrowser(QApplication):
self.keyparser.commandparser.error.connect( self.keyparser.commandparser.error.connect(
self.mainwindow.status.disp_error) self.mainwindow.status.disp_error)
self.keyparser.keystring_updated.connect( self.keyparser.keystring_updated.connect(
self.mainwindow.status.txt.set_keystring) self.mainwindow.status.keystring.setText)
self.mainwindow.show() self.mainwindow.show()
self._python_hacks() self._python_hacks()

View File

@ -66,10 +66,11 @@ class MainWindow(QMainWindow):
self.tabs.cur_load_finished.connect(self.status.prog.load_finished) self.tabs.cur_load_finished.connect(self.status.prog.load_finished)
self.tabs.cur_load_started.connect(lambda: self.tabs.cur_load_started.connect(lambda:
self.status.prog.set_progress(0)) self.status.prog.set_progress(0))
self.tabs.cur_scroll_perc_changed.connect(self.status.txt.set_perc) self.tabs.cur_scroll_perc_changed.connect(
self.tabs.cur_statusbar_message.connect(self.status.txt.set_text) self.status.percentage.set_perc)
self.tabs.cur_url_changed.connect(self.status.txt.set_url) self.tabs.cur_statusbar_message.connect(self.status.txt.setText)
self.tabs.cur_link_hovered.connect(self.status.txt.set_hover_url) self.tabs.cur_url_changed.connect(self.status.url.set_url)
self.tabs.cur_link_hovered.connect(self.status.url.set_hover_url)
self.status.cmd.esc_pressed.connect(self.tabs.setFocus) self.status.cmd.esc_pressed.connect(self.tabs.setFocus)
self.status.cmd.hide_completion.connect(self.completion.hide) self.status.cmd.hide_completion.connect(self.completion.hide)
self.status.cmd.textChanged.connect(self.completion.cmd_text_changed) self.status.cmd.textChanged.connect(self.completion.cmd_text_changed)

View File

@ -21,8 +21,9 @@ import logging
from PyQt5.QtCore import pyqtSignal, Qt from PyQt5.QtCore import pyqtSignal, Qt
from PyQt5.QtWidgets import (QLineEdit, QShortcut, QHBoxLayout, QWidget, from PyQt5.QtWidgets import (QLineEdit, QShortcut, QHBoxLayout, QWidget,
QSizePolicy, QProgressBar, QLabel) QSizePolicy, QProgressBar, QLabel, QStyle,
from PyQt5.QtGui import QValidator, QKeySequence QStyleOption)
from PyQt5.QtGui import QValidator, QKeySequence, QPainter
import qutebrowser.utils.config as config import qutebrowser.utils.config as config
import qutebrowser.commands.keys as keys import qutebrowser.commands.keys as keys
@ -33,9 +34,11 @@ class StatusBar(QWidget):
"""The statusbar at the bottom of the mainwindow.""" """The statusbar at the bottom of the mainwindow."""
hbox = None
cmd = None cmd = None
txt = None txt = None
keystring = None
percentage = None
url = None
prog = None prog = None
resized = pyqtSignal('QRect') resized = pyqtSignal('QRect')
moved = pyqtSignal('QPoint') moved = pyqtSignal('QPoint')
@ -68,30 +71,48 @@ class StatusBar(QWidget):
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.hbox = QHBoxLayout(self) hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0) hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0) hbox.setSpacing(5)
self.cmd = Command(self) self.cmd = Command(self)
self.hbox.addWidget(self.cmd) hbox.addWidget(self.cmd)
self.txt = Text(self) self.txt = Text(self)
self.hbox.addWidget(self.txt) hbox.addWidget(self.txt)
hbox.addStretch()
self.keystring = KeyString(self)
hbox.addWidget(self.keystring)
self.url = Url(self)
hbox.addWidget(self.url)
self.percentage = Percentage(self)
hbox.addWidget(self.percentage)
self.prog = Progress(self) self.prog = Progress(self)
self.hbox.addWidget(self.prog) hbox.addWidget(self.prog)
def paintEvent(self, e):
"""Override QWIidget.paintEvent to handle stylesheets."""
# pylint: disable=unused-argument
option = QStyleOption()
option.initFrom(self)
painter = QPainter(self)
self.style().drawPrimitive(QStyle.PE_Widget, option, painter, self)
def disp_error(self, text): def disp_error(self, text):
"""Displaysan error in the statusbar.""" """Displaysan error in the statusbar."""
self.bgcolor = config.colordict.getraw('statusbar.bg.error') self.bgcolor = config.colordict.getraw('statusbar.bg.error')
self.fgcolor = config.colordict.getraw('statusbar.fg.error') self.fgcolor = config.colordict.getraw('statusbar.fg.error')
self.txt.error = text self.txt.set_error(text)
def clear_error(self): def clear_error(self):
"""Clear a displayed error from the status bar.""" """Clear a displayed error from the status bar."""
self.bgcolor = config.colordict.getraw('statusbar.bg') self.bgcolor = config.colordict.getraw('statusbar.bg')
self.fgcolor = config.colordict.getraw('statusbar.fg') self.fgcolor = config.colordict.getraw('statusbar.fg')
self.txt.error = '' self.txt.clear_error()
def resizeEvent(self, e): def resizeEvent(self, e):
"""Extend resizeEvent of QWidget to emit a resized signal afterwards. """Extend resizeEvent of QWidget to emit a resized signal afterwards.
@ -268,6 +289,7 @@ class Progress(QProgressBar):
statusbar = None statusbar = None
color = None color = None
# FIXME for some reason, margin-left is not shown
_stylesheet = """ _stylesheet = """
QProgressBar {{ QProgressBar {{
border-radius: 0px; border-radius: 0px;
@ -321,41 +343,62 @@ class Progress(QProgressBar):
self.color = config.colordict.getraw('statusbar.progress.bg.error') self.color = config.colordict.getraw('statusbar.progress.bg.error')
class Text(QLabel): class TextBase(QLabel):
"""The text part of the status bar. """A text in the statusbar."""
Contains several parts (keystring, error, text, scrollperc) which are later
joined and displayed.
"""
keystring = ''
error = ''
text = ''
scrollperc = ''
url = ''
old_url = ''
fields = ['keystring', 'url', 'error', 'text', 'scrollperc']
def __init__(self, bar): def __init__(self, bar):
super().__init__(bar) super().__init__(bar)
self.setStyleSheet("padding-right: 1px;")
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum)
def __setattr__(self, name, value):
super().__setattr__(name, value)
if name in self.fields:
self.update()
def set_keystring(self, s): class Text(TextBase):
"""Text displayed in the statusbar."""
old_text = ''
def set_error(self, text):
"""Display an error message and save current text in old_text."""
self.old_text = self.text()
self.setText(text)
def clear_error(self):
"""Clear a displayed error message."""
self.setText(self.old_text)
class KeyString(TextBase):
"""Keychain string displayed in the statusbar."""
pass
class Percentage(TextBase):
"""Reading percentage displayed in the statusbar."""
def set_perc(self, x, y):
"""Setter to be used as a Qt slot.""" """Setter to be used as a Qt slot."""
self.keystring = s # pylint: disable=unused-argument
if y == 0:
self.setText('[top]')
elif y == 100:
self.setText('[bot]')
else:
self.setText('[{:2}%]'.format(y))
class Url(TextBase):
"""URL displayed in the statusbar."""
old_url = ''
def set_url(self, s): def set_url(self, s):
"""Setter to be used as a Qt slot.""" """Setter to be used as a Qt slot."""
self.url = urlstring(s) self.setText(urlstring(s))
def set_hover_url(self, link, title, text): def set_hover_url(self, link, title, text):
"""Setter to be used as a Qt slot. """Setter to be used as a Qt slot.
@ -366,26 +409,7 @@ class Text(QLabel):
""" """
# pylint: disable=unused-argument # pylint: disable=unused-argument
if link: if link:
self.old_url = self.url self.old_url = self.text()
self.url = link self.setText(link)
else: else:
self.url = self.old_url self.setText(self.old_url)
def set_perc(self, x, y):
"""Setter to be used as a Qt slot."""
# pylint: disable=unused-argument
if y == 0:
self.scrollperc = '[top]'
elif y == 100:
self.scrollperc = '[bot]'
else:
self.scrollperc = '[{:2}%]'.format(y)
def set_text(self, text):
"""Setter to be used as a Qt slot."""
logging.debug('Setting text to "{}"'.format(text))
self.text = text
def update(self):
"""Update the text displayed."""
self.setText(' '.join(getattr(self, name) for name in self.fields))