Elide statusbar text/URLs correctly.
This commit is contained in:
parent
7bfc1eb791
commit
76ba7921d4
@ -59,8 +59,6 @@ class StatusBar(QWidget):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# TODO: the statusbar should be a bit smaller
|
# TODO: the statusbar should be a bit smaller
|
||||||
# FIXME In general, texts should be elided instead of cut off.
|
|
||||||
# See http://gedgedev.blogspot.ch/2010/12/elided-labels-in-qt.html
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.setObjectName(self.__class__.__name__)
|
self.setObjectName(self.__class__.__name__)
|
||||||
@ -369,11 +367,51 @@ class Progress(QProgressBar):
|
|||||||
|
|
||||||
class TextBase(QLabel):
|
class TextBase(QLabel):
|
||||||
|
|
||||||
"""A text in the statusbar."""
|
"""A text in the statusbar.
|
||||||
|
|
||||||
def __init__(self, bar):
|
Unlike QLabel, the text will get elided.
|
||||||
|
|
||||||
|
Eliding is loosly based on
|
||||||
|
http://gedgedev.blogspot.ch/2010/12/elided-labels-in-qt.html
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
elidemode = None
|
||||||
|
_elided_text = None
|
||||||
|
|
||||||
|
def __init__(self, bar, elidemode=Qt.ElideRight):
|
||||||
super().__init__(bar)
|
super().__init__(bar)
|
||||||
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum)
|
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum)
|
||||||
|
self.elidemode = elidemode
|
||||||
|
|
||||||
|
def setText(self, txt):
|
||||||
|
"""Extend QLabel::setText to update the elided text afterwards."""
|
||||||
|
super().setText(txt)
|
||||||
|
self._update_elided_text(self.geometry().width())
|
||||||
|
|
||||||
|
def resizeEvent(self, e):
|
||||||
|
"""Extend QLabel::resizeEvent to update the elided text afterwards."""
|
||||||
|
super().resizeEvent(e)
|
||||||
|
self._update_elided_text(e.size().width())
|
||||||
|
|
||||||
|
def _update_elided_text(self, width):
|
||||||
|
"""Update the elided text when necessary.
|
||||||
|
|
||||||
|
width -- The maximal width the text should take.
|
||||||
|
|
||||||
|
"""
|
||||||
|
self._elided_text = self.fontMetrics().elidedText(
|
||||||
|
self.text(), self.elidemode, width, Qt.TextShowMnemonic)
|
||||||
|
|
||||||
|
def paintEvent(self, e):
|
||||||
|
"""Override QLabel::paintEvent to draw elided text."""
|
||||||
|
if self.elidemode == Qt.ElideNone:
|
||||||
|
super().paintEvent(e)
|
||||||
|
else:
|
||||||
|
painter = QPainter(self)
|
||||||
|
geom = self.geometry()
|
||||||
|
painter.drawText(0, 0, geom.width(), geom.height(),
|
||||||
|
self.alignment(), self._elided_text)
|
||||||
|
|
||||||
|
|
||||||
class Text(TextBase):
|
class Text(TextBase):
|
||||||
@ -420,6 +458,10 @@ class Url(TextBase):
|
|||||||
|
|
||||||
old_url = ''
|
old_url = ''
|
||||||
|
|
||||||
|
def __init__(self, bar, elidemode=Qt.ElideMiddle):
|
||||||
|
"""Override TextBase::__init__ to elide in the middle by default."""
|
||||||
|
super().__init__(bar, elidemode)
|
||||||
|
|
||||||
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.setText(urlstring(s))
|
self.setText(urlstring(s))
|
||||||
|
Loading…
Reference in New Issue
Block a user