Changeset 9180:576599f230d8 in orange


Ignore:
Timestamp:
11/08/11 11:02:21 (2 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
e21319acea4a8dc994ffbd82ec166ea12273c84e
Message:

Added a Prototype reimplementation of Select Attributes widget (references #991)

Location:
orange/OrangeWidgets
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/OWItemModels.py

    r9117 r9180  
    44from functools import wraps, partial 
    55from collections import defaultdict 
     6from contextlib import contextmanager 
    67 
    78class _store(dict): 
     
    1920    return items 
    2021 
     22 
     23@contextmanager 
     24def signal_blocking(object): 
     25    blocked = object.signalsBlocked() 
     26    object.blockSignals(True) 
     27    yield 
     28    object.blockSignals(blocked) 
     29 
    2130     
    2231class PyListModel(QAbstractListModel): 
    2332    """ A model for displaying python list like objects in Qt item view classes 
    2433    """ 
     34    MIME_TYPES = ["application/x-Orange-PyListModelData"] 
     35     
    2536    def __init__(self, iterable=[], parent=None, 
    2637                 flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled, 
     
    8293        return True 
    8394         
     95    def setItemData(self, index, data): 
     96        data = dict(data) 
     97        with signal_blocking(self): 
     98            for role, value in data.items(): 
     99                if role == Qt.EditRole: 
     100                    self[index.row()] = value.toPyObject() 
     101                else: 
     102                    self._other_data[index.row()][role] = value 
     103                     
     104        self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index, index) 
     105        return True 
     106#        return QAbstractListModel.setItemData(self, index, data) 
     107     
    84108    def flags(self, index): 
    85109        if index.isValid(): 
     
    142166    def __getitem__(self, i): 
    143167        return self._list[i] 
     168     
     169    def __getslice__(self, i, j): 
     170        return self._list[i:j] 
    144171         
    145172    def __add__(self, iterable): 
    146         # Does not preserve flags other data. 
     173        # Does not preserve flags or other data. 
    147174        return PyListModel(self._list + iterable, self.parent()) 
    148175     
     
    213240    def supportedDropActions(self): 
    214241        return self._supportedDropActions 
    215              
    216  
     242     
     243    def decode_qt_data(self, data): 
     244        """ Decode internal Qt 'application/x-qabstractitemmodeldatalist' 
     245        mime data  
     246        """ 
     247        stream = QDataStream(data) 
     248        items = [] 
     249        while not stream.atEnd(): 
     250            row = ds.readInt() 
     251            col = ds.readInt() 
     252            item_count = ds.readInt() 
     253            item = {} 
     254            for i in range(item_count): 
     255                role = ds.readInt() 
     256                value = ds.readQVariant() 
     257                item[role] = value 
     258            items.append((row, column, item)) 
     259        return items 
     260     
     261    def mimeTypes(self): 
     262        return self.MIME_TYPES + list(QAbstractListModel.mimeTypes(self)) 
     263     
     264    def mimeData(self, indexlist): 
     265        if len(indexlist) <= 0: 
     266            return None 
     267         
     268        items = [self[i.row()] for i in indexlist] 
     269        mime = QAbstractListModel.mimeData(self, indexlist) 
     270        data = cPickle.dumps(vars) 
     271        mime.setData(self.MIME_TYPE, QByteArray(data)) 
     272        mime._items = items 
     273        return mime 
     274     
     275    def dropMimeData(self, mime, action, row, column, parent): 
     276        if action == Qt.IgnoreAction: 
     277            return True 
     278         
     279        if not mime.hasFormat(self.MIME_TYPE): 
     280            return False 
     281         
     282        if hasattr(mime, "_vars"): 
     283            vars = mime._vars 
     284        else: 
     285            desc = str(mime.data(self.MIME_TYPE)) 
     286            vars = cPickle.loads(desc) 
     287         
     288        return QAbstractListModel.dropMimeData(self, mime, action, row, column, parent) 
     289     
     290     
    217291import OWGUI 
    218292import orange 
     293import Orange 
     294import cPickle 
    219295 
    220296class VariableListModel(PyListModel): 
     297     
     298    MIME_TYPE = "application/x-Orange-VariableList" 
     299     
    221300    def data(self, index, role=Qt.DisplayRole): 
    222301        i = index.row() 
     302        var = self[i] 
    223303        if role == Qt.DisplayRole: 
    224             return QVariant(self.__getitem__(i).name) 
     304            return QVariant(var.name) 
    225305        elif role == Qt.DecorationRole: 
    226             return QVariant(OWGUI.getAttributeIcons().get(self.__getitem__(i).varType, -1)) 
     306            return QVariant(OWGUI.getAttributeIcons().get(var.varType, -1)) 
     307        elif role == Qt.ToolTipRole: 
     308            return self.variable_tooltip(var) 
    227309        else: 
    228310            return PyListModel.data(self, index, role) 
    229311         
     312    def variable_tooltip(self, var): 
     313        if isinstance(var, Orange.data.variable.Discrete): 
     314            return self.discrete_variable_tooltip(var) 
     315        elif isinstance(var, Orange.data.variable.Continuous): 
     316            return self.continuous_variable_toltip(var) 
     317        elif isinstance(var, Orange.data.variable.String): 
     318            return self.string_variable_tooltip(var) 
     319         
     320    def variable_labels_tooltip(self, var): 
     321        text = "" 
     322        if var.attributes: 
     323            items = var.attributes.items() 
     324            labels = map("%s = %s".__mod__, items) 
     325            text += "<br/>Variable Labels:<br/>" 
     326            text += "<br/>".join(labels) 
     327        return text 
     328             
     329    def discrete_variable_tooltip(self, var): 
     330        text = "<b>%s</b><br/>Discrete with %i values: " % (var.name, len(var.values)) 
     331        text += ", ".join("%r" % v for v in var.values) 
     332        text += self.variable_labels_tooltip(var) 
     333        return text 
     334             
     335    def continuous_variable_toltip(self, var): 
     336        text = "<b>%s</b><br/>Continuous" % var.name 
     337        text += self.variable_labels_tooltip(var) 
     338        return text 
     339     
     340    def string_variable_tooltip(self, var): 
     341        text = "<b>%s</b><br/>String" % var.name 
     342        text += self.variable_labels_tooltip(var) 
     343        return text 
     344     
     345    def python_variable_tooltip(self, var): 
     346        text = "<b>%s</b><br/>Python" % var.name 
     347        text += self.variable_labels_tooltip(var) 
     348        return text 
     349             
    230350         
    231351class VariableEditor(QWidget): 
Note: See TracChangeset for help on using the changeset viewer.