Ignore:
Timestamp:
05/30/13 15:49:34 (11 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Children:
11571:661c03bcff02, 11572:27c26e9d7be5
Message:

Refactored 'ExampleTableModel.headerData' code into helper functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Data/OWDataTable.py

    r11564 r11565  
    77""" 
    88 
     9from xml.sax.saxutils import escape 
    910import Orange 
    1011 
     
    1516import OWColorPalette 
    1617 
    17  
    1818NAME = "Data Table" 
    1919 
     
    3838           ("Other Data", ExampleTable)] 
    3939 
    40 ############################################################################## 
    41  
    42 def safe_call(func): 
    43     from functools import wraps 
    44     @wraps(func) 
    45     def wrapper(*args, **kwargs): 
    46         try: 
    47             return func(*args, **kwargs) 
    48         except Exception, ex: 
    49             print >> sys.stderr, func.__name__, "call error", ex  
    50             return QVariant() 
    51     return wrapper 
    52      
     40 
     41def header_text(feature, labels=None): 
     42    """ 
     43    Return an header text for an `Orange.feature.Descriptor` instance 
     44    `feature`. If labels is not none it should be a sequence of keys into 
     45    `feature.attributes` to include in the header (one per line). If the 
     46    `feature.attribures` does not contain a value for the key the returned 
     47    text will include an empty line for it. 
     48 
     49    """ 
     50    lines = [feature.name] 
     51    if labels is not None: 
     52        lines += [str(feature.attributes.get(label, "")) 
     53                  for label in labels] 
     54    return "\n".join(lines) 
     55 
     56 
     57def header_tooltip(feature, labels=None): 
     58    """ 
     59    Return an header tooltip text for an `Orange.feature.Decriptor` instance. 
     60    """ 
     61 
     62    if labels is None: 
     63        labels = feature.attributes.keys() 
     64 
     65    pairs = [(escape(key), escape(str(feature.attributes[key]))) 
     66             for key in labels if key in feature.attributes] 
     67    tip = "<b>%s</b>" % escape(feature.name) 
     68    tip = "<br/>".join([tip] + ["%s = %s" % pair for pair in pairs]) 
     69    return tip 
     70 
    5371 
    5472class ExampleTableModel(QAbstractItemModel): 
     
    92110        self.background_colors = map(role_to_color.get, self.table_roles) 
    93111 
    94         self.sorted_map = range(len(self.examples)) 
    95  
    96112        # all attribute labels (annotation) keys 
    97113        self.attr_labels = sorted( 
     
    101117        ) 
    102118 
     119        # text for all header items (no attr labels by default) 
     120        self.header_labels = [header_text(feature) 
     121                              for feature in self.all_attrs] 
     122 
     123        self.sorted_map = range(len(self.examples)) 
     124 
    103125        self._show_attr_labels = False 
    104126        self._other_data = {} 
     
    108130 
    109131    def set_show_attr_labels(self, val): 
    110         self.emit(SIGNAL("layoutAboutToBeChanged()")) 
    111         self._show_attr_labels = val 
    112         self.emit(SIGNAL("headerDataChanged(Qt::Orientation, int, int)"), 
    113                   Qt.Horizontal, 
    114                   0, 
    115                   len(self.all_attrs) - 1 
    116                   ) 
    117         self.emit(SIGNAL("layoutChanged()")) 
    118         self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), 
    119                   self.index(0, 0), 
    120                   self.index(len(self.examples) - 1, len(self.all_attrs) - 1) 
    121                   ) 
     132        if self._show_attr_labels != val: 
     133            self.emit(SIGNAL("layoutAboutToBeChanged()")) 
     134            self._show_attr_labels = val 
     135            if val: 
     136                labels = self.attr_labels 
     137            else: 
     138                labels = None 
     139            self.header_labels = [header_text(feature, labels) 
     140                                  for feature in self.all_attrs] 
     141 
     142            self.emit(SIGNAL("headerDataChanged(Qt::Orientation, int, int)"), 
     143                      Qt.Horizontal, 
     144                      0, 
     145                      len(self.all_attrs) - 1) 
     146 
     147            self.emit(SIGNAL("layoutChanged()")) 
     148 
     149            self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), 
     150                      self.index(0, 0), 
     151                      self.index(len(self.examples) - 1, 
     152                                 len(self.all_attrs) - 1) 
     153                      ) 
    122154 
    123155    show_attr_labels = pyqtProperty("bool", 
     
    191223            return 0 
    192224        else: 
    193             return max([len(self.examples)] + [row for row, _, _ in self._other_data.keys()]) 
    194          
    195     def columnCount(self, index=QModelIndex()): 
    196         return max([len(self.all_attrs)] + [col for _, col, _ in self._other_data.keys()]) 
    197      
    198     @safe_call 
     225            return len(self.examples) 
     226 
     227    def columnCount(self, parent=QModelIndex()): 
     228        if parent.isValid(): 
     229            return 0 
     230        else: 
     231            return len(self.all_attrs) 
     232 
    199233    def headerData(self, section, orientation, role): 
    200234        if orientation == Qt.Horizontal: 
    201235            attr = self.all_attrs[section] 
    202             if role ==Qt.DisplayRole: 
    203                 values = [attr.name] + ([str(attr.attributes.get(label, "")) for label in self.attr_labels] if self.show_attr_labels else []) 
    204                 return QVariant("\n".join(values)) 
     236            if role == Qt.DisplayRole: 
     237                return self.header_labels[section] 
    205238            if role == Qt.ToolTipRole: 
    206                 pairs = [(key, str(attr.attributes[key])) for key in self.attr_labels if key in attr.attributes] 
    207                 tip = "<b>%s</b>" % attr.name 
    208                 tip = "<br>".join([tip] + ["%s = %s" % pair for pair in pairs]) 
    209                 return QVariant(tip)   
     239                return header_tooltip(attr, self.attr_labels) 
    210240        else: 
    211241            if role == Qt.DisplayRole: 
    212242                return QVariant(section + 1) 
    213243        return QVariant() 
    214      
     244 
    215245    def sort(self, column, order=Qt.AscendingOrder): 
    216246        self.emit(SIGNAL("layoutAboutToBeChanged()")) 
Note: See TracChangeset for help on using the changeset viewer.