Changeset 9313:95f973074ef5 in orange


Ignore:
Timestamp:
12/06/11 13:25:24 (2 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
da37909a979876f37a4a1532329ed2f644f372e8
Message:

Moved RankItemDelegate to OWGUI (renamed it to ColoredBarItemDelegate)

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Data/OWRank.py

    r9269 r9313  
    363363        self.contRanksView.setSelectionMode(QTableView.MultiSelection) 
    364364        self.contRanksView.setSortingEnabled(True) 
    365 #        self.contRanksView.setItemDelegate(RankItemDelegate()) 
     365#        self.contRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate()) 
    366366#        self.contRanksView.horizontalHeader().restoreState(self.contRanksHeaderState) 
    367367         
     
    394394        self.resize(690,500) 
    395395        self.updateColor() 
     396         
     397        self.measure_scores = table((len(self.measures), 0), None) 
    396398 
    397399    def switchRanksMode(self, index): 
     
    750752         
    751753    def updateDelegates(self): 
    752         self.contRanksView.setItemDelegate(RankItemDelegate(self, 
     754        self.contRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate(self, 
    753755                            decimals=self.nDecimals, 
    754756                            color=self.distColor)) 
    755         self.discRanksView.setItemDelegate(RankItemDelegate(self, 
     757        self.discRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate(self, 
    756758                            decimals=self.nDecimals, 
    757759                            color=self.distColor)) 
     
    788790            return []     
    789791 
    790 class RankItemDelegate(QStyledItemDelegate): 
    791     """ Item delegate that can also draw a distribution bar 
    792     """ 
    793     def __init__(self, parent=None, decimals=3, color=Qt.red): 
    794         QStyledItemDelegate.__init__(self, parent) 
    795         self.decimals = decimals 
    796         self.float_fmt = "%%.%if" % decimals 
    797         self.color = QColor(color) 
    798          
    799     def displayText(self, value, locale): 
    800         obj = _toPyObject(value) 
    801         if isinstance(obj, float): 
    802             return self.float_fmt % obj 
    803         elif isinstance(obj, basestring): 
    804             return obj 
    805         elif obj is None: 
    806             return "NA" 
    807         else: 
    808             return obj.__str__() 
    809          
    810     def sizeHint(self, option, index): 
    811         metrics = QFontMetrics(option.font) 
    812         height = metrics.lineSpacing() + 8 # 4 pixel margin 
    813         width = metrics.width(self.displayText(index.data(Qt.DisplayRole), QLocale())) + 8 
    814         return QSize(width, height) 
    815      
    816     def paint(self, painter, option, index): 
    817         text = self.displayText(index.data(Qt.DisplayRole), QLocale()) 
    818          
    819         bar_ratio = index.data(OWGUI.BarRatioRole) 
    820         ratio, have_ratio = bar_ratio.toDouble() 
    821         rect = option.rect 
    822         if have_ratio: 
    823             text_rect = rect.adjusted(4, 1, -4, -5) # Style dependent margins? 
    824         else: 
    825             text_rect = rect.adjusted(4, 4, -4, -4) 
    826              
    827         painter.save() 
    828         painter.setFont(option.font) 
    829          
    830         qApp.style().drawPrimitive(QStyle.PE_PanelItemViewRow, option, painter) 
    831         qApp.style().drawPrimitive(QStyle.PE_PanelItemViewItem, option, painter) 
    832          
    833         # TODO: Check ForegroundRole. 
    834         if option.state & QStyle.State_Selected: 
    835             color = option.palette.highlightedText().color() 
    836         else: 
    837             color = option.palette.text().color() 
    838         painter.setPen(QPen(color)) 
    839          
    840         align = index.data(Qt.TextAlignmentRole) 
    841         if align.isValid(): 
    842             align = align.toInt() 
    843         else: 
    844             align = Qt.AlignLeft | Qt.AlignVCenter 
    845         painter.drawText(text_rect, align, text) 
    846         painter.setRenderHint(QPainter.Antialiasing, True) 
    847         if have_ratio: 
    848             bar_brush = index.data(OWGUI.BarBrushRole) 
    849             if bar_brush.isValid(): 
    850                 bar_brush = bar_brush.toPyObject() 
    851                 if not isinstance(bar_brush, (QColor, QBrush)): 
    852                     bar_brush = None 
    853             else: 
    854                 bar_brush =  None 
    855             if bar_brush is None: 
    856                 bar_brush = self.color 
    857             brush = QBrush(bar_brush) 
    858             painter.setBrush(brush) 
    859             painter.setPen(QPen(brush, 1)) 
    860             bar_rect = QRect(text_rect) 
    861             bar_rect.setTop(bar_rect.bottom() - 1) 
    862             bar_rect.setBottom(bar_rect.bottom() + 1) 
    863             w = text_rect.width() 
    864             bar_rect.setWidth(max(0, min(w * ratio, w))) 
    865             painter.drawRoundedRect(bar_rect, 2, 2) 
    866         painter.restore() 
    867  
    868          
     792 
    869793class PyStandardItem(QStandardItem): 
    870794    """ A StandardItem subclass for python objects. 
  • orange/OrangeWidgets/OWGUI.py

    r8893 r9313  
    167167         box=None, label=None, labelWidth=None, orientation=None, tooltip=None, 
    168168         callback=None, debuggingEnabled = 1, controlWidth = None, callbackOnReturn = False, 
    169          checked = "", checkCallback = None, posttext = None, alignment = Qt.AlignLeft, 
    170          keyboardTracking=True): 
     169         checked = "", checkCallback = None, posttext = None, addToLayout=True, 
     170         alignment = Qt.AlignLeft, keyboardTracking=True): 
    171171    if box or label and not checked: 
    172172        b = widgetBox(widget, box, orientation) 
     
    190190    wa.setAlignment(alignment) 
    191191    wa.setKeyboardTracking(keyboardTracking) # If false it wont emit valueChanged signals while editing the text 
    192     if bi.layout() is not None: 
     192    if addToLayout and bi.layout() is not None: 
    193193        bi.layout().addWidget(wa) 
    194194    # must be defined because of the setText below 
     
    19431943LinkRole = LinkStyledItemDelegate.LinkRole 
    19441944 
     1945def _toPyObject(variant): 
     1946    val = variant.toPyObject() 
     1947    if isinstance(val, type(NotImplemented)): 
     1948        # PyQt 4.4 converts python int, floats ... to C types and 
     1949        # cannot convert them back again and returns an exception instance. 
     1950        qtype = variant.type() 
     1951        if qtype == QVariant.Double: 
     1952            val, ok = variant.toDouble() 
     1953        elif qtype == QVariant.Int: 
     1954            val, ok = variant.toInt() 
     1955        elif qtype == QVariant.LongLong: 
     1956            val, ok = variant.toLongLong() 
     1957        elif qtype == QVariant.String: 
     1958            val = variant.toString() 
     1959    return val 
     1960 
     1961class ColoredBarItemDelegate(QStyledItemDelegate): 
     1962    """ Item delegate that can also draw a distribution bar 
     1963    """ 
     1964    def __init__(self, parent=None, decimals=3, color=Qt.red): 
     1965        QStyledItemDelegate.__init__(self, parent) 
     1966        self.decimals = decimals 
     1967        self.float_fmt = "%%.%if" % decimals 
     1968        self.color = QColor(color) 
     1969         
     1970    def displayText(self, value, locale): 
     1971        obj = _toPyObject(value) 
     1972        if isinstance(obj, float): 
     1973            return self.float_fmt % obj 
     1974        elif isinstance(obj, basestring): 
     1975            return obj 
     1976        elif obj is None: 
     1977            return "NA" 
     1978        else: 
     1979            return obj.__str__() 
     1980         
     1981    def sizeHint(self, option, index): 
     1982        font = self.get_font(option, index) 
     1983        metrics = QFontMetrics(font) 
     1984        height = metrics.lineSpacing() + 8 # 4 pixel margin 
     1985        width = metrics.width(self.displayText(index.data(Qt.DisplayRole), QLocale())) + 8 
     1986        return QSize(width, height) 
     1987     
     1988    def paint(self, painter, option, index): 
     1989        self.initStyleOption(option, index) 
     1990        text = self.displayText(index.data(Qt.DisplayRole), QLocale()) 
     1991         
     1992        ratio, have_ratio = self.get_bar_ratio(option, index) 
     1993         
     1994        rect = option.rect 
     1995        if have_ratio: 
     1996            # The text is raised 3 pixels above the bar. 
     1997            text_rect = rect.adjusted(4, 1, -4, -4) # TODO: Style dependent margins? 
     1998        else: 
     1999            text_rect = rect.adjusted(4, 4, -4, -4) 
     2000             
     2001        painter.save() 
     2002        font = self.get_font(option, index) 
     2003        painter.setFont(font) 
     2004         
     2005        qApp.style().drawPrimitive(QStyle.PE_PanelItemViewRow, option, painter) 
     2006        qApp.style().drawPrimitive(QStyle.PE_PanelItemViewItem, option, painter) 
     2007         
     2008        # TODO: Check ForegroundRole. 
     2009        if option.state & QStyle.State_Selected: 
     2010            color = option.palette.highlightedText().color() 
     2011        else: 
     2012            color = option.palette.text().color() 
     2013        painter.setPen(QPen(color)) 
     2014         
     2015        align = self.get_text_align(option, index) 
     2016             
     2017        metrics = QFontMetrics(font) 
     2018        elide_text = metrics.elidedText(text, option.textElideMode, text_rect.width()) 
     2019        painter.drawText(text_rect, align, elide_text) 
     2020         
     2021        painter.setRenderHint(QPainter.Antialiasing, True) 
     2022        if have_ratio: 
     2023            brush = self.get_bar_brush(option, index) 
     2024             
     2025            painter.setBrush(brush) 
     2026            painter.setPen(QPen(brush, 1)) 
     2027            bar_rect = QRect(text_rect) 
     2028            bar_rect.setTop(bar_rect.bottom() - 1) 
     2029            bar_rect.setBottom(bar_rect.bottom() + 1) 
     2030            w = text_rect.width() 
     2031            bar_rect.setWidth(max(0, min(w * ratio, w))) 
     2032            painter.drawRoundedRect(bar_rect, 2, 2) 
     2033        painter.restore() 
     2034     
     2035    def get_font(self, option, index): 
     2036        font = index.data(Qt.FontRole) 
     2037        if font.isValid(): 
     2038            font = font.toPyObject() 
     2039        else: 
     2040            font = option.font 
     2041        return font 
     2042     
     2043    def get_text_align(self, option, index): 
     2044        align = index.data(Qt.TextAlignmentRole) 
     2045        if align.isValid(): 
     2046            align = align.toInt() 
     2047        else: 
     2048            align = Qt.AlignLeft | Qt.AlignVCenter 
     2049        return align 
     2050     
     2051    def get_bar_ratio(self, option, index): 
     2052        bar_ratio = index.data(BarRatioRole) 
     2053        ratio, have_ratio = bar_ratio.toDouble() 
     2054        return ratio, have_ratio 
     2055     
     2056    def get_bar_brush(self, option, index): 
     2057        bar_brush = index.data(BarBrushRole) 
     2058        if bar_brush.isValid(): 
     2059            bar_brush = bar_brush.toPyObject() 
     2060            if not isinstance(bar_brush, (QColor, QBrush)): 
     2061                bar_brush = None 
     2062        else: 
     2063            bar_brush = None 
     2064        if bar_brush is None: 
     2065            bar_brush = self.color 
     2066        return QBrush(bar_brush) 
     2067             
    19452068############################################################################## 
    19462069# progress bar management 
Note: See TracChangeset for help on using the changeset viewer.