Ignore:
Timestamp:
11/29/12 18:27:40 (17 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Elide the path text label if it is too long.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/preview/previewbrowser.py

    r11191 r11212  
    55 
    66from PyQt4.QtGui import ( 
    7     QWidget, QLabel, QListView, QAction, QVBoxLayout, QHBoxLayout, QSizePolicy 
     7    QWidget, QLabel, QListView, QAction, QVBoxLayout, QHBoxLayout, QSizePolicy, 
     8    QStyleOption, QStylePainter 
    89) 
    910 
     
    1112 
    1213from PyQt4.QtCore import ( 
    13     Qt, QSize, QByteArray, QModelIndex 
     14    Qt, QSize, QByteArray, QModelIndex, QEvent 
    1415) 
    1516 
    1617from PyQt4.QtCore import pyqtSignal as Signal 
    1718 
     19from ..scheme.utils import check_type 
    1820from ..gui.dropshadow import DropShadowFrame 
    1921from . import previewmodel 
     
    4345        self.setViewMode(QListView.IconMode) 
    4446        self.setWrapping(False) 
     47        self.setWordWrap(True) 
     48 
    4549        self.setSelectionMode(QListView.SingleSelection) 
    4650        self.setEditTriggers(QListView.NoEditTriggers) 
     
    6266 
    6367 
     68class TextLabel(QWidget): 
     69    """A plain text label widget with support for elided text. 
     70    """ 
     71    def __init__(self, *args, **kwargs): 
     72        QWidget.__init__(self, *args, **kwargs) 
     73 
     74        self.setSizePolicy(QSizePolicy.Expanding, 
     75                           QSizePolicy.Preferred) 
     76 
     77        self.__text = "" 
     78        self.__textElideMode = Qt.ElideMiddle 
     79        self.__sizeHint = None 
     80        self.__alignment = Qt.AlignLeft | Qt.AlignVCenter 
     81 
     82    def setText(self, text): 
     83        """Set the `text` string to display. 
     84        """ 
     85        check_type(text, basestring) 
     86        if self.__text != text: 
     87            self.__text = unicode(text) 
     88            self.__update() 
     89 
     90    def text(self): 
     91        """Return the text 
     92        """ 
     93        return self.__text 
     94 
     95    def setTextElideMode(self, mode): 
     96        """Set elide mode (`Qt.TextElideMode`) 
     97        """ 
     98        if self.__textElideMode != mode: 
     99            self.__textElideMode = mode 
     100            self.__update() 
     101 
     102    def elideMode(self): 
     103        return self.__elideMode 
     104 
     105    def setAlignment(self, align): 
     106        """Set text alignment (`Qt.Alignment`). 
     107        """ 
     108        if self.__alignment != align: 
     109            self.__alignment = align 
     110            self.__update() 
     111 
     112    def sizeHint(self): 
     113        if self.__sizeHint is None: 
     114            option = QStyleOption() 
     115            option.initFrom(self) 
     116            metrics = option.fontMetrics 
     117 
     118            self.__sizeHint = QSize(200, metrics.height()) 
     119 
     120        return self.__sizeHint 
     121 
     122    def paintEvent(self, event): 
     123        painter = QStylePainter(self) 
     124        option = QStyleOption() 
     125        option.initFrom(self) 
     126 
     127        rect = option.rect 
     128        metrics = option.fontMetrics 
     129        text = metrics.elidedText(self.__text, self.__textElideMode, 
     130                                  rect.width()) 
     131        painter.drawItemText(rect, self.__alignment, 
     132                             option.palette, self.isEnabled(), text, 
     133                             self.foregroundRole()) 
     134        painter.end() 
     135 
     136    def changeEvent(self, event): 
     137        if event.type() == QEvent.FontChange: 
     138            self.__update() 
     139 
     140        return QWidget.changeEvent(self, event) 
     141 
     142    def __update(self): 
     143        self.__sizeHint = None 
     144        self.updateGeometry() 
     145        self.update() 
     146 
     147 
    64148class PreviewBrowser(QWidget): 
    65149    """A Preview Browser for recent/premade scheme selection. 
     
    96180        self.__imageFrame.setWidget(self.__image) 
    97181 
    98         self.__path = QLabel(self, objectName="path-label") 
    99         self.__path.setWordWrap(False) 
    100         self.__path.setContentsMargins(12, 0, 12, 0) 
     182        # Path text below the description and image 
     183        path_layout = QHBoxLayout() 
     184        path_layout.setContentsMargins(12, 0, 12, 0) 
     185        path_label = QLabel("<b>{0!s}</b>".format(self.tr("Path:")), self, 
     186                            objectName="path-label") 
     187 
     188        self.__path = TextLabel(self, objectName="path-text") 
     189 
     190        path_layout.addWidget(path_label) 
     191        path_layout.addWidget(self.__path) 
    101192 
    102193        self.__selectAction = \ 
     
    111202 
    112203        vlayout.addLayout(top_layout) 
    113         vlayout.addWidget(self.__path) 
     204        vlayout.addLayout(path_layout) 
    114205 
    115206        # An list view with small preview icons. 
     
    229320        self.__label.setText(desc_text) 
    230321 
    231         path_text = u"<b>Path:</b><div class=item-path>{0}</div>".format(path) 
    232         self.__path.setText(path_text) 
     322        self.__path.setText(path) 
    233323 
    234324        if not svg: 
Note: See TracChangeset for help on using the changeset viewer.