Changeset 7910:f6271b99c794 in orange


Ignore:
Timestamp:
05/17/11 17:05:52 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
b539a7c516b171a96818df736dc914de7933c5f3
Message:

Fixed ticket #793.
Using HighlightedText color from the palette when the item is selected.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Classify/OWCN2RulesViewer.py

    r7867 r7910  
    3434        QStyledItemDelegate.__init__(self, parent) 
    3535 
    36  
    3736    def displayText(self, value, locale): 
    3837        dist = value.toPyObject() 
    3938        if isinstance(dist, orange.Distribution): 
    4039            return QString("<" + ",".join(["%.1f" % c for c in dist]) + ">") 
    41 #            return QString("") 
    4240        else: 
    4341            return QStyledItemDelegate.displayText(value, locale) 
    4442         
    45      
    4643    def sizeHint(self, option, index): 
    4744        metrics = QFontMetrics(option.font) 
    48         height = metrics.lineSpacing() * 2 + 8 
    49         width = metrics.width(self.displayText(index.data(Qt.DisplayRole), QLocale())) 
     45        height = metrics.lineSpacing() * 2 + 8 # 4 pixel margin 
     46        width = metrics.width(self.displayText(index.data(Qt.DisplayRole), QLocale())) + 8 
    5047        return QSize(width, height) 
    51      
    5248     
    5349    def paint(self, painter, option, index): 
    5450        dist = index.data(Qt.DisplayRole).toPyObject() 
    55         rect = option.rect 
    56         rect_w = rect.width() - len([c for c in dist if c]) - 2 
    57         rect_h = rect.height() - 2 
     51        rect = option.rect.adjusted(4, 4, -4, -4) 
     52        rect_w = rect.width() - len([c for c in dist if c]) # This is for the separators in the distribution bar 
     53        rect_h = rect.height() 
    5854        colors = OWColorPalette.ColorPaletteHSV(len(dist)) 
    5955        abs = dist.abs 
     
    6157         
    6258        painter.save() 
     59        painter.setFont(option.font) 
    6360        qApp.style().drawPrimitive(QStyle.PE_PanelItemViewRow, option, painter) 
    6461         
     
    6764        drect_h = metrics.height() 
    6865        lineSpacing = metrics.lineSpacing() 
     66        leading = metrics.leading() 
    6967        distText = self.displayText(index.data(Qt.DisplayRole), QLocale()) 
     68         
     69        if option.state & QStyle.State_Selected: 
     70            color = option.palette.highlightedText().color() 
     71        else: 
     72            color = option.palette.text().color() 
     73#        painter.setBrush(QBrush(color)) 
     74        painter.setPen(QPen(color)) 
     75             
    7076        if showText: 
    71             textPos = QPoint(rect.topLeft().x(), rect.center().y() - lineSpacing) 
    72             painter.drawText(QRect(textPos, QSize(rect.width(), lineSpacing)), Qt.AlignCenter, distText) 
    73          
    74         painter.translate(QPoint(rect.topLeft().x(), rect.center().y() - (drect_h/2 if not showText else  - 2))) 
     77            textPos = rect.topLeft() 
     78            textRect = QRect(textPos, QSize(rect.width(), rect.height() / 2 - leading)) 
     79            painter.drawText(textRect, Qt.AlignHCenter | Qt.AlignBottom, distText) 
     80             
     81        painter.setPen(QPen(Qt.black)) 
     82        painter.translate(QPoint(rect.topLeft().x(), rect.center().y() - (drect_h/2 if not showText else  0))) 
    7583        for i, count in enumerate(dist): 
    7684            if count: 
     
    8088                painter.drawRect(QRect(1, 1, width, drect_h)) 
    8189                painter.translate(width, 0) 
    82          
    8390        painter.restore() 
    84          
    8591         
    8692class MultiLineStringItemDelegate(QStyledItemDelegate): 
     
    8894        metrics = QFontMetrics(option.font) 
    8995        text = index.data(Qt.DisplayRole).toString() 
    90         return metrics.size(0, text) 
    91      
     96        size = metrics.size(0, text) 
     97        return QSize(size.width() + 8, size.height() + 8) # 4 pixel margin 
    9298     
    9399    def paint(self, painter, option, index): 
     
    95101        painter.save() 
    96102        qApp.style().drawPrimitive(QStyle.PE_PanelItemViewRow, option, painter) 
    97         painter.drawText(option.rect, Qt.AlignLeft | Qt.AlignVCenter, text) 
     103        rect = option.rect.adjusted(4, 4, -4, -4) 
     104             
     105        if option.state & QStyle.State_Selected: 
     106            color = option.palette.highlightedText().color() 
     107        else: 
     108            color = option.palette.text().color() 
     109#        painter.setBrush(QBrush(color)) 
     110        painter.setPen(QPen(color)) 
     111         
     112             
     113        painter.drawText(rect, option.displayAlignment, text) 
    98114        painter.restore() 
    99115         
     
    103119        obj = _toPyObject(value) #value.toPyObject() 
    104120        return QString(str(obj)) 
    105              
    106  
     121     
     122     
     123class PyFloatItemDelegate(QStyledItemDelegate): 
     124    def displayText(self, value, locale): 
     125        obj = _toPyObject(value) 
     126        if isinstance(obj, float): 
     127            return QString("%.2f" % obj) 
     128        else: 
     129            return QString(str(obj)) 
     130         
     131def rule_to_string(rule, show_distribution = True): 
     132    """ 
     133    Write a string presentation of rule in human readable format. 
     134     
     135    :param rule: rule to pretty-print. 
     136    :type rule: :class:`Orange.classification.rules.Rule` 
     137     
     138    :param show_distribution: determines whether presentation should also 
     139        contain the distribution of covered instances 
     140    :type show_distribution: bool 
     141     
     142    """ 
     143    import Orange 
     144    def selectSign(oper): 
     145        if oper == Orange.core.ValueFilter_continuous.Less: 
     146            return "<" 
     147        elif oper == Orange.core.ValueFilter_continuous.LessEqual: 
     148            return "<=" 
     149        elif oper == Orange.core.ValueFilter_continuous.Greater: 
     150            return ">" 
     151        elif oper == Orange.core.ValueFilter_continuous.GreaterEqual: 
     152            return ">=" 
     153        else: return "=" 
     154 
     155    if not rule: 
     156        return "None" 
     157    conds = rule.filter.conditions 
     158    domain = rule.filter.domain 
     159     
     160    def pprint_values(values): 
     161        if len(values) > 1: 
     162            return "[" + ",".join(values) + "]" 
     163        else: 
     164            return str(values[0]) 
     165         
     166    ret = "IF " 
     167    if len(conds)==0: 
     168        ret = ret + "TRUE" 
     169 
     170    for i,c in enumerate(conds): 
     171        if i > 0: 
     172            ret += " AND " 
     173        if type(c) == Orange.core.ValueFilter_discrete: 
     174            ret += domain[c.position].name + "=" + pprint_values( \ 
     175                   [domain[c.position].values[int(v)] for v in c.values]) 
     176        elif type(c) == Orange.core.ValueFilter_continuous: 
     177            ret += domain[c.position].name + selectSign(c.oper) + str(c.ref) 
     178    if rule.classifier and type(rule.classifier) == Orange.classification.ConstantClassifier\ 
     179            and rule.classifier.default_val: 
     180        ret = ret + " THEN "+domain.class_var.name+"="+\ 
     181        str(rule.classifier.default_value) 
     182        if show_distribution: 
     183            ret += str(rule.class_distribution) 
     184    elif rule.classifier and type(rule.classifier) == Orange.classification.ConstantClassifier\ 
     185            and type(domain.class_var) == Orange.core.EnumVariable: 
     186        ret = ret + " THEN "+domain.class_var.name+"="+\ 
     187        str(rule.class_distribution.modus()) 
     188        if show_distribution: 
     189            ret += str(rule.class_distribution) 
     190    return ret         
     191 
     192         
    107193class OWCN2RulesViewer(OWWidget): 
    108194    settingsList = ["show_Rule_length", "show_Rule_quality", "show_Coverage", 
     
    161247        self.tableView = QTableView() 
    162248        self.tableView.setItemDelegate(PyObjectItemDelegate(self)) 
     249        self.tableView.setItemDelegateForColumn(1, PyFloatItemDelegate(self)) 
     250        self.tableView.setItemDelegateForColumn(2, PyFloatItemDelegate(self)) 
    163251        self.tableView.setItemDelegateForColumn(4, DistributionItemDelegate(self)) 
    164252        self.tableView.setItemDelegateForColumn(5, MultiLineStringItemDelegate(self)) 
     
    183271        self.resize(800, 600) 
    184272         
    185          
    186273    def setRuleClassifier(self, classifier=None): 
    187274        self.classifier = classifier 
     
    190277        else: 
    191278            self.rules = [] 
    192              
    193279         
    194280    def handleNewSignals(self): 
    195281        self.updateRulesModel() 
    196282        self.commit() 
    197          
    198283     
    199284    def updateRulesModel(self): 
     
    213298            self.tableView.resizeColumnsToContents() 
    214299            self.tableView.resizeRowsToContents() 
    215              
    216300     
    217301    def ruleText(self, rule): 
    218         text = orngCN2.ruleToString(rule, showDistribution=False) 
     302        text = rule_to_string(rule, show_distribution=False) 
    219303        p = re.compile(r"[0-9]\.[0-9]+") 
    220304        text = p.sub(lambda match: "%.2f" % float(match.group()[0]), text) 
     
    222306        text = text.replace("THEN", "\nTHEN") 
    223307        return text 
    224          
    225308     
    226309    def updateVisibleColumns(self): 
     
    228311            self.tableView.horizontalHeader().setSectionHidden(i, not getattr(self, "show_%s" % header.replace(" ", "_"))) 
    229312     
    230      
    231313    def commitIf(self): 
    232314        if self.autoCommit: 
     
    234316        else: 
    235317            self.changedFlag = True 
    236      
    237318             
    238319    def selectedAttrsFromRules(self, rules): 
     
    242323                selected.append(rule.filter.domain[c.position]) 
    243324        return set(selected) 
    244      
    245325     
    246326    def selectedExamplesFromRules(self, rules, examples): 
Note: See TracChangeset for help on using the changeset viewer.