Ignore:
Timestamp:
11/15/12 15:21:43 (17 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Replaced uses of 'QGraphicsPixmapItem' with a custom 'GraphicsIconItem'.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/canvas/items/nodeitem.py

    r11180 r11186  
    99 
    1010from PyQt4.QtGui import ( 
    11     QGraphicsItem, QGraphicsPathItem, QGraphicsPixmapItem, QGraphicsObject, 
    12     QGraphicsTextItem, QGraphicsDropShadowEffect, 
     11    QGraphicsItem, QGraphicsPathItem, QGraphicsObject, 
     12    QGraphicsTextItem, QGraphicsDropShadowEffect, QGraphicsView, 
    1313    QPen, QBrush, QColor, QPalette, QFont, QIcon, QStyle, 
    1414    QPainter, QPainterPath, QPainterPathStroker, QApplication 
    1515) 
    1616 
    17 from PyQt4.QtCore import Qt, QPointF, QRectF, QTimer 
     17from PyQt4.QtCore import Qt, QPointF, QRectF, QSize, QTimer 
    1818from PyQt4.QtCore import pyqtSignal as Signal 
    1919from PyQt4.QtCore import pyqtProperty as Property 
     
    475475 
    476476 
    477 class MessageIcon(QGraphicsPixmapItem): 
    478     def __init__(self, *args, **kwargs): 
    479         QGraphicsPixmapItem.__init__(self, *args, **kwargs) 
    480  
    481  
    482 def message_pixmap(standard_pixmap): 
     477def standard_icon(standard_pixmap): 
     478    """Return return the application style's standard icon for a 
     479    `QStyle.StandardPixmap`. 
     480 
     481    """ 
    483482    style = QApplication.instance().style() 
    484     icon = style.standardIcon(standard_pixmap) 
    485     return icon.pixmap(16, 16) 
     483    return style.standardIcon(standard_pixmap) 
     484 
     485 
     486class GraphicsIconItem(QGraphicsItem): 
     487    """A graphics item displaying an `QIcon`. 
     488    """ 
     489    def __init__(self, parent=None, icon=None, iconSize=None, **kwargs): 
     490        QGraphicsItem.__init__(self, parent, **kwargs) 
     491        self.setFlag(QGraphicsItem.ItemUsesExtendedStyleOption, True) 
     492 
     493        if icon is None: 
     494            icon = QIcon() 
     495 
     496        if iconSize is None: 
     497            style = QApplication.instance().style() 
     498            size = style.pixelMetric(style.PM_LargeIconSize) 
     499            iconSize = QSize(size, size) 
     500 
     501        self.__transformationMode = Qt.SmoothTransformation 
     502 
     503        self.__iconSize = QSize(iconSize) 
     504        self.__icon = QIcon(icon) 
     505 
     506    def setIcon(self, icon): 
     507        """Set the icon (:class:`QIcon`). 
     508        """ 
     509        if self.__icon != icon: 
     510            self.__icon = QIcon(icon) 
     511            self.update() 
     512 
     513    def icon(self): 
     514        """Return the icon (:class:`QIcon`). 
     515        """ 
     516        return QIcon(self.__icon) 
     517 
     518    def setIconSize(self, size): 
     519        """Set the icon (and this item's) size (:class:`QSize`). 
     520        """ 
     521        if self.__iconSize != size: 
     522            self.prepareGeometryChange() 
     523            self.__iconSize = QSize(size) 
     524            self.update() 
     525 
     526    def iconSize(self): 
     527        """Return the icon size (:class:`QSize`). 
     528        """ 
     529        return QSize(self.__iconSize) 
     530 
     531    def setTransformationMode(self, mode): 
     532        """Set pixmap transformation mode. (`Qt.SmoothTransformation` or 
     533        `Qt.FastTransformation`). 
     534 
     535        """ 
     536        if self.__transformationMode != mode: 
     537            self.__transformationMode = mode 
     538            self.update() 
     539 
     540    def transformationMode(self): 
     541        """Return the pixmap transformation mode. 
     542        """ 
     543        return self.__transformationMode 
     544 
     545    def boundingRect(self): 
     546        return QRectF(0, 0, self.__iconSize.width(), self.__iconSize.height()) 
     547 
     548    def paint(self, painter, option, widget=None): 
     549        if not self.__icon.isNull(): 
     550            if option.state & QStyle.State_Selected: 
     551                mode = QIcon.Selected 
     552            elif option.state & QStyle.State_Enabled: 
     553                mode = QIcon.Normal 
     554            elif option.state & QStyle.State_Active: 
     555                mode = QIcon.Active 
     556            else: 
     557                mode = QIcon.Disabled 
     558 
     559            transform = self.sceneTransform() 
     560 
     561            if widget is not None: 
     562                # 'widget' is the QGraphicsView.viewport() 
     563                view = widget.parent() 
     564                if isinstance(view, QGraphicsView): 
     565                    # Combine the scene transform with the view transform. 
     566                    view_transform = view.transform() 
     567                    transform = view_transform * view_transform 
     568 
     569            lod = option.levelOfDetailFromTransform(transform) 
     570 
     571            w, h = self.__iconSize.width(), self.__iconSize.height() 
     572            target = QRectF(0, 0, w, h) 
     573            source = QRectF(0, 0, w * lod, w * lod).toRect() 
     574 
     575            # The actual size of the requested pixmap can be smaller. 
     576            size = self.__icon.actualSize(source.size(), mode=mode) 
     577            source.setSize(size) 
     578 
     579            pixmap = self.__icon.pixmap(source.size(), mode=mode) 
     580 
     581            painter.setRenderHint( 
     582                QPainter.SmoothPixmapTransform, 
     583                self.__transformationMode == Qt.SmoothTransformation 
     584            ) 
     585 
     586            painter.drawPixmap(target, pixmap, QRectF(source)) 
    486587 
    487588 
     
    603704        self.captionTextItem.setFont(font) 
    604705 
    605         self.errorItem = MessageIcon(self) 
    606         self.errorItem.setPixmap(message_pixmap(QStyle.SP_MessageBoxCritical)) 
    607         self.errorItem.hide() 
    608  
    609         self.warningItem = MessageIcon(self) 
    610         self.warningItem.setPixmap(message_pixmap(QStyle.SP_MessageBoxWarning)) 
    611         self.warningItem.hide() 
    612  
    613         self.infoItem = MessageIcon(self) 
    614         self.infoItem.setPixmap(message_pixmap(QStyle.SP_MessageBoxInformation)) 
    615         self.infoItem.hide() 
     706        def iconItem(standard_pixmap): 
     707            item = GraphicsIconItem(self, icon=standard_icon(standard_pixmap), 
     708                                    iconSize=QSize(16, 16)) 
     709            item.hide() 
     710            return item 
     711 
     712        self.errorItem = iconItem(QStyle.SP_MessageBoxCritical) 
     713        self.warningItem = iconItem(QStyle.SP_MessageBoxWarning) 
     714        self.infoItem = iconItem(QStyle.SP_MessageBoxInformation) 
    616715 
    617716    def setWidgetDescription(self, desc): 
     
    648747        """Set the widget's icon 
    649748        """ 
    650         # TODO: if the icon is SVG, how can we get it? 
    651749        if isinstance(icon, QIcon): 
    652             pixmap = icon.pixmap(36, 36) 
    653             self.pixmap_item = QGraphicsPixmapItem(pixmap, self.shapeItem) 
    654             self.pixmap_item.setPos(-18, -18) 
     750            self.icon_item = GraphicsIconItem(self.shapeItem, icon=icon, 
     751                                              iconSize=QSize(36, 36)) 
     752            self.icon_item.setPos(-18, -18) 
    655753        else: 
    656754            raise TypeError 
Note: See TracChangeset for help on using the changeset viewer.