source: orange/Orange/OrangeWidgets/Data/OWDataTable.py @ 10601:170bec4f32d9

Revision 10601:170bec4f32d9, 26.1 KB checked in by Ales Erjavec <ales.erjavec@…>, 2 years ago (diff)

Consistent underscore names in the table item model.

Line 
1"""
2<name>Data Table</name>
3<description>Shows data in a spreadsheet.</description>
4<icon>icons/DataTable.png</icon>
5<priority>100</priority>
6<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
7"""
8
9# OWDataTable.py
10#
11# wishes:
12# ignore attributes, filter examples by attribute values, do
13# all sorts of preprocessing (including discretization) on the table,
14# output a new table and export it in variety of formats.
15
16from OWWidget import *
17import OWGUI
18import math
19from orngDataCaching import *
20import OWColorPalette
21
22##############################################################################
23
24def safe_call(func):
25    from functools import wraps
26    @wraps(func)
27    def wrapper(*args, **kwargs):
28        try:
29            return func(*args, **kwargs)
30        except Exception, ex:
31            print >> sys.stderr, func.__name__, "call error", ex
32            return QVariant()
33    return wrapper
34   
35
36class ExampleTableModel(QAbstractItemModel):
37    def __init__(self, examples, dist, *args):
38        QAbstractItemModel.__init__(self, *args)
39        self.examples = examples
40        self.dist = dist
41        self.attributes = list(self.examples.domain.attributes)
42        self.class_var = self.examples.domain.classVar
43        self.metas = self.examples.domain.getmetas().values()
44        self.all_attrs = self.attributes + ([self.class_var] if self.class_var else []) + self.metas
45        self.cls_color = QColor(160,160,160)
46        self.meta_color = QColor(220,220,200)
47        self.sorted_map = range(len(self.examples))
48       
49        self.attr_labels = sorted(reduce(set.union, [attr.attributes for attr in self.all_attrs], set()))
50        self._show_attr_labels = False
51        self._other_data = {}
52       
53    def get_show_attr_labels(self):
54        return self._show_attr_labels
55   
56    def set_show_attr_labels(self, val):
57        self.emit(SIGNAL("layoutAboutToBeChanged()"))
58        self._show_attr_labels = val
59        self.emit(SIGNAL("headerDataChanged(Qt::Orientation, int, int)"),
60                  Qt.Horizontal, 
61                  0, 
62                  len(self.all_attrs) - 1
63                  )
64        self.emit(SIGNAL("layoutChanged()"))
65        self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), 
66                  self.index(0,0),
67                  self.index(len(self.examples) - 1, len(self.all_attrs) - 1)
68                  )
69       
70    show_attr_labels = pyqtProperty("bool", 
71                                   fget=get_show_attr_labels,
72                                   fset=set_show_attr_labels,
73                                   )
74   
75    @safe_call
76    def data(self, index, role):
77        row, col = self.sorted_map[index.row()], index.column()
78        example, attr = self.examples[row], self.all_attrs[col]
79        val = example[attr]
80        domain = self.examples.domain
81        if role == Qt.DisplayRole:
82                return QVariant(str(val))
83        elif role == Qt.BackgroundRole:
84            #check if attr is actual class or a duplication in the meta attributes
85            if attr == self.class_var and col == len(domain.attributes) and domain.classVar:
86                return QVariant(self.cls_color)
87            elif attr in self.metas:
88                return QVariant(self.meta_color)
89        elif role == OWGUI.TableBarItem.BarRole and val.varType == orange.VarTypes.Continuous \
90                    and not val.isSpecial() and attr not in self.metas:
91            dist = self.dist[col]
92            return QVariant((float(val) - dist.min) / (dist.max - dist.min or 1))
93        elif role == OWGUI.TableValueRole:
94            # The actual value
95            return QVariant(val)
96        elif role == OWGUI.TableClassValueRole: 
97            # The class value for the row's example
98            return QVariant(example.get_class())
99        elif role == OWGUI.TableVariable: 
100            # The variable descriptor for column
101            return QVariant(val.variable)
102       
103        return self._other_data.get((index.row(), index.column(), role), QVariant())
104       
105    def setData(self, index, variant, role):
106        self._other_data[index.row(), index.column(), role] = variant
107        self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), index, index)
108       
109    def index(self, row, col, parent=QModelIndex()):
110        return self.createIndex(row, col, 0)
111   
112    def parent(self, index):
113        return QModelIndex()
114   
115    def rowCount(self, parent=QModelIndex()):
116        if parent.isValid():
117            return 0
118        else:
119            return max([len(self.examples)] + [row for row, _, _ in self._other_data.keys()])
120       
121    def columnCount(self, index=QModelIndex()):
122        return max([len(self.all_attrs)] + [col for _, col, _ in self._other_data.keys()])
123   
124    @safe_call
125    def headerData(self, section, orientation, role):
126        if orientation == Qt.Horizontal:
127            attr = self.all_attrs[section]
128            if role ==Qt.DisplayRole:
129                values = [attr.name] + ([str(attr.attributes.get(label, "")) for label in self.attr_labels] if self.show_attr_labels else [])
130                return QVariant("\n".join(values))
131            if role == Qt.ToolTipRole:
132                pairs = [(key, str(attr.attributes[key])) for key in self.attr_labels if key in attr.attributes]
133                tip = "<b>%s</b>" % attr.name
134                tip = "<br>".join([tip] + ["%s = %s" % pair for pair in pairs])
135                return QVariant(tip) 
136        else:
137            if role == Qt.DisplayRole:
138                return QVariant(section + 1)
139        return QVariant()
140   
141    def sort(self, column, order=Qt.AscendingOrder):
142        self.emit(SIGNAL("layoutAboutToBeChanged()"))
143        attr = self.all_attrs[column] 
144        values = [(ex[attr], i) for i, ex in enumerate(self.examples)]
145        values = sorted(values, key=lambda t: t[0] if not t[0].isSpecial() else sys.maxint, reverse=(order!=Qt.AscendingOrder))
146        self.sorted_map = [v[1] for v in values]
147        self.emit(SIGNAL("layoutChanged()"))
148        self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"),
149                  self.index(0,0),
150                  self.index(len(self.examples) - 1, len(self.all_attrs) - 1)
151                  )
152           
153
154class OWDataTable(OWWidget):
155    settingsList = ["showDistributions", "showMeta", "distColorRgb", "showAttributeLabels", "autoCommit", "selectedSchemaIndex", "colorByClass"]
156
157    def __init__(self, parent=None, signalManager = None):
158        OWWidget.__init__(self, parent, signalManager, "Data Table")
159
160        self.inputs = [("Data", ExampleTable, self.dataset, Multiple + Default)]
161        self.outputs = [("Selected Data", ExampleTable, Default), ("Other Data", ExampleTable)]
162
163        self.data = {}          # key: id, value: ExampleTable
164        self.showMetas = {}     # key: id, value: (True/False, columnList)
165        self.showMeta = 1
166        self.showAttributeLabels = 1
167        self.showDistributions = 1
168        self.distColorRgb = (220,220,220, 255)
169        self.distColor = QColor(*self.distColorRgb)
170        self.locale = QLocale()
171        self.autoCommit = False
172        self.colorSettings = None
173        self.selectedSchemaIndex = 0
174        self.colorByClass = True
175       
176        self.loadSettings()
177
178        # info box
179        infoBox = OWGUI.widgetBox(self.controlArea, "Info")
180        self.infoEx = OWGUI.widgetLabel(infoBox, 'No data on input.')
181        self.infoMiss = OWGUI.widgetLabel(infoBox, ' ')
182        OWGUI.widgetLabel(infoBox, ' ')
183        self.infoAttr = OWGUI.widgetLabel(infoBox, ' ')
184        self.infoMeta = OWGUI.widgetLabel(infoBox, ' ')
185        OWGUI.widgetLabel(infoBox, ' ')
186        self.infoClass = OWGUI.widgetLabel(infoBox, ' ')
187        infoBox.setMinimumWidth(200)
188        OWGUI.separator(self.controlArea)
189
190        # settings box
191        boxSettings = OWGUI.widgetBox(self.controlArea, "Settings", addSpace=True)
192        self.cbShowMeta = OWGUI.checkBox(boxSettings, self, "showMeta", 'Show meta attributes', callback = self.cbShowMetaClicked)
193        self.cbShowMeta.setEnabled(False)
194        self.cbShowAttLbls = OWGUI.checkBox(boxSettings, self, "showAttributeLabels", 'Show attribute labels (if any)', callback = self.cbShowAttLabelsClicked)
195        self.cbShowAttLbls.setEnabled(True)
196
197        box = OWGUI.widgetBox(self.controlArea, "Colors")
198        OWGUI.checkBox(box, self, "showDistributions", 'Visualize continuous values', callback = self.cbShowDistributions)
199        OWGUI.checkBox(box, self, "colorByClass", 'Color by class value', callback = self.cbShowDistributions)
200        OWGUI.button(box, self, "Set colors", self.setColors, tooltip = "Set the canvas background color and color palette for coloring continuous variables", debuggingEnabled = 0)
201
202        resizeColsBox = OWGUI.widgetBox(boxSettings, 0, "horizontal", 0)
203        OWGUI.label(resizeColsBox, self, "Resize columns: ")
204        OWGUI.toolButton(resizeColsBox, self, "+", self.increaseColWidth, tooltip = "Increase the width of the columns", width=20, height=20)
205        OWGUI.toolButton(resizeColsBox, self, "-", self.decreaseColWidth, tooltip = "Decrease the width of the columns", width=20, height=20)
206        OWGUI.rubber(resizeColsBox)
207
208        self.btnResetSort = OWGUI.button(boxSettings, self, "Restore Order of Examples", callback = self.btnResetSortClicked, tooltip = "Show examples in the same order as they appear in the file")
209       
210        OWGUI.separator(self.controlArea)
211        selectionBox = OWGUI.widgetBox(self.controlArea, "Selection")
212        self.sendButton = OWGUI.button(selectionBox, self, "Send selections", self.commit, default=True)
213        cb = OWGUI.checkBox(selectionBox, self, "autoCommit", "Commit on any change", callback=self.commitIf)
214        OWGUI.setStopper(self, self.sendButton, cb, "selectionChangedFlag", self.commit)
215
216        OWGUI.rubber(self.controlArea)
217
218        dlg = self.createColorDialog()
219        self.discPalette = dlg.getDiscretePalette("discPalette")
220
221        # GUI with tabs
222        self.tabs = OWGUI.tabWidget(self.mainArea)
223        self.id2table = {}  # key: widget id, value: table
224        self.table2id = {}  # key: table, value: widget id
225        self.connect(self.tabs, SIGNAL("currentChanged(QWidget*)"), self.tabClicked)
226       
227        self.selectionChangedFlag = False
228       
229
230    def createColorDialog(self):
231        c = OWColorPalette.ColorPaletteDlg(self, "Color Palette")
232        c.createDiscretePalette("discPalette", "Discrete Palette")
233        box = c.createBox("otherColors", "Other Colors")
234        c.createColorButton(box, "Default", "Default color", QColor(Qt.white))
235        c.setColorSchemas(self.colorSettings, self.selectedSchemaIndex)
236        return c
237
238    def setColors(self):
239        dlg = self.createColorDialog()
240        if dlg.exec_():
241            self.colorSettings = dlg.getColorSchemas()
242            self.selectedSchemaIndex = dlg.selectedSchemaIndex
243            self.discPalette = dlg.getDiscretePalette("discPalette")
244            self.distColorRgb = dlg.getColor("Default")
245
246    def increaseColWidth(self):
247        table = self.tabs.currentWidget()
248        if table:
249            for col in range(table.model().columnCount(QModelIndex())):
250                w = table.columnWidth(col)
251                table.setColumnWidth(col, w + 10)
252
253    def decreaseColWidth(self):
254        table = self.tabs.currentWidget()
255        if table:
256            for col in range(table.model().columnCount(QModelIndex())):
257                w = table.columnWidth(col)
258                minW = table.sizeHintForColumn(col)
259                table.setColumnWidth(col, max(w - 10, minW))
260
261
262    def dataset(self, data, id=None):
263        """Generates a new table and adds it to a new tab when new data arrives;
264        or hides the table and removes a tab when data==None;
265        or replaces the table when new data arrives together with already existing id."""
266        if data != None:  # can be an empty table!
267            if self.data.has_key(id):
268                # remove existing table
269                self.data.pop(id)
270                self.showMetas.pop(id)
271                self.id2table[id].hide()
272                self.tabs.removeTab(self.tabs.indexOf(self.id2table[id]))
273                self.table2id.pop(self.id2table.pop(id))
274            self.data[id] = data
275            self.showMetas[id] = (True, [])
276
277            table = QTableView()
278            table.setSelectionBehavior(QAbstractItemView.SelectRows)
279            table.setSortingEnabled(True)
280            table.setHorizontalScrollMode(QTableWidget.ScrollPerPixel)
281            table.horizontalHeader().setMovable(True)
282            table.horizontalHeader().setClickable(True)
283            table.horizontalHeader().setSortIndicatorShown(False)
284           
285            option = table.viewOptions()
286            size = table.style().sizeFromContents(QStyle.CT_ItemViewItem, option, QSize(20, 20), table) #QSize(20, QFontMetrics(option.font).lineSpacing()), table)
287           
288            table.verticalHeader().setDefaultSectionSize(size.height() + 2) #int(size.height() * 1.25) + 2)
289
290            self.id2table[id] = table
291            self.table2id[table] = id
292            if data.name:
293                tabName = "%s " % data.name
294            else:
295                tabName = ""
296            tabName += "(" + str(id[1]) + ")"
297            if id[2] != None:
298                tabName += " [" + str(id[2]) + "]"
299            self.tabs.addTab(table, tabName)
300
301            self.progressBarInit()
302            self.setTable(table, data)
303            self.progressBarFinished()
304            self.tabs.setCurrentIndex(self.tabs.indexOf(table))
305            self.setInfo(data)
306            self.sendButton.setEnabled(not self.autoCommit)
307
308        elif self.data.has_key(id):
309            table = self.id2table[id]
310            self.data.pop(id)
311            self.showMetas.pop(id)
312            table.hide()
313            self.tabs.removeTab(self.tabs.indexOf(table))
314            self.table2id.pop(self.id2table.pop(id))
315            self.setInfo(self.data.get(self.table2id.get(self.tabs.currentWidget(),None),None))
316
317        if len(self.data) == 0:
318            self.sendButton.setEnabled(False)
319
320        self.setCbShowMeta()
321
322    def setCbShowMeta(self):
323        for ti in range(self.tabs.count()):
324            if len(self.tabs.widget(ti).model().metas)>0:
325                self.cbShowMeta.setEnabled(True)
326                break
327        else:
328            self.cbShowMeta.setEnabled(False)
329           
330    def sendReport(self):
331        qTableInstance = self.tabs.currentWidget()
332        id = self.table2id.get(qTableInstance, None)
333        data = self.data.get(id, None)
334        self.reportData(data)
335        table = self.id2table[id]
336        import OWReport
337        self.reportRaw(OWReport.reportTable(table))
338       
339       
340    # Writes data into table, adjusts the column width.
341    def setTable(self, table, data):
342        if data==None:
343            return
344        qApp.setOverrideCursor(Qt.WaitCursor)
345        vars = data.domain.variables
346        m = data.domain.getmetas(False)
347        ml = [(k, m[k]) for k in m]
348        ml.sort(lambda x,y: cmp(y[0], x[0]))
349        metas = [x[1] for x in ml]
350        metaKeys = [x[0] for x in ml]
351
352        mo = data.domain.getmetas(True).items()
353        if mo:
354            mo.sort(lambda x,y: cmp(x[1].name.lower(),y[1].name.lower()))
355            metas.append(None)
356            metaKeys.append(None)
357
358        varsMetas = vars + metas
359
360        numVars = len(data.domain.variables)
361        numMetas = len(metas)
362        numVarsMetas = numVars + numMetas
363        numEx = len(data)
364        numSpaces = int(math.log(max(numEx,1), 10))+1
365
366#        table.clear()
367        table.oldSortingIndex = -1
368        table.oldSortingOrder = 1
369#        table.setColumnCount(numVarsMetas)
370#        table.setRowCount(numEx)
371
372        dist = getCached(data, orange.DomainBasicAttrStat, (data,))
373       
374        datamodel = ExampleTableModel(data, dist, self)
375       
376#        proxy = QSortFilterProxyModel(self)
377#        proxy.setSourceModel(datamodel)
378       
379        color_schema = self.discPalette if self.colorByClass else None
380        table.setItemDelegate(OWGUI.TableBarItem(self, color=self.distColor, color_schema=color_schema) \
381                              if self.showDistributions else QStyledItemDelegate(self)) #TableItemDelegate(self, table))
382       
383        table.setModel(datamodel)
384        def p():
385            try:
386                table.updateGeometries()
387                table.viewport().update()
388            except RuntimeError:
389                pass
390       
391        size = table.verticalHeader().sectionSizeHint(0)
392        table.verticalHeader().setDefaultSectionSize(size)
393       
394        self.connect(datamodel, SIGNAL("layoutChanged()"), lambda *args: QTimer.singleShot(50, p))
395       
396        id = self.table2id.get(table, None)
397
398        # set the header (attribute names)
399
400        self.drawAttributeLabels(table)
401
402        self.showMetas[id][1].extend([i for i, attr in enumerate(table.model().all_attrs) if attr in table.model().metas])
403        self.connect(table.horizontalHeader(), SIGNAL("sectionClicked(int)"), self.sortByColumn)
404        self.connect(table.selectionModel(), SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.updateSelection)
405        #table.verticalHeader().setMovable(False)
406
407        qApp.restoreOverrideCursor() 
408
409    def setCornerText(self, table, text):
410        """
411        Set table corner text. As this is an ugly hack, do everything in
412        try - except blocks, as it may stop working in newer Qt.
413        """
414
415        if not hasattr(table, "btn") and not hasattr(table, "btnfailed"):
416            try:
417                btn = table.findChild(QAbstractButton)
418
419                class efc(QObject):
420                    def eventFilter(self, o, e):
421                        if (e.type() == QEvent.Paint):
422                            if isinstance(o, QAbstractButton):
423                                btn = o
424                                #paint by hand (borrowed from QTableCornerButton)
425                                opt = QStyleOptionHeader()
426                                opt.init(btn)
427                                state = QStyle.State_None;
428                                if (btn.isEnabled()):
429                                    state |= QStyle.State_Enabled;
430                                if (btn.isActiveWindow()):
431                                    state |= QStyle.State_Active;
432                                if (btn.isDown()):
433                                    state |= QStyle.State_Sunken;
434                                opt.state = state;
435                                opt.rect = btn.rect();
436                                opt.text = btn.text();
437                                opt.position = QStyleOptionHeader.OnlyOneSection;
438                                painter = QStylePainter(btn);
439                                painter.drawControl(QStyle.CE_Header, opt);
440                                return True # eat evebt
441                        return False
442               
443                table.efc = efc()
444                btn.installEventFilter(table.efc)
445                table.btn = btn
446            except:
447                table.btnfailed = True
448
449        if hasattr(table, "btn"):
450            try:
451                btn = table.btn
452                btn.setText(text)
453                opt = QStyleOptionHeader()
454                opt.text = btn.text()
455                s = btn.style().sizeFromContents(QStyle.CT_HeaderSection, opt, QSize(), btn).expandedTo(QApplication.globalStrut())
456                if s.isValid():
457                    table.verticalHeader().setMinimumWidth(s.width())
458                   
459            except:
460                pass
461
462    def sortByColumn(self, index):
463        table = self.tabs.currentWidget()
464        table.horizontalHeader().setSortIndicatorShown(1)
465        header = table.horizontalHeader()
466        if index == table.oldSortingIndex:
467            order = table.oldSortingOrder == Qt.AscendingOrder and Qt.DescendingOrder or Qt.AscendingOrder
468        else:
469            order = Qt.AscendingOrder
470        table.sortByColumn(index, order)
471        table.oldSortingIndex = index
472        table.oldSortingOrder = order
473        #header.setSortIndicator(index, order)
474
475    def tabClicked(self, qTableInstance):
476        """Updates the info box and showMetas checkbox when a tab is clicked.
477        """
478        id = self.table2id.get(qTableInstance,None)
479        self.setInfo(self.data.get(id,None))
480        show_col = self.showMetas.get(id,None)
481        if show_col:
482            self.cbShowMeta.setChecked(show_col[0])
483            self.cbShowMeta.setEnabled(len(show_col[1])>0)
484        self.updateSelection()
485
486    def cbShowMetaClicked(self):
487        table = self.tabs.currentWidget()
488        id = self.table2id.get(table, None)
489        if self.showMetas.has_key(id):
490            show,col = self.showMetas[id]
491            self.showMetas[id] = (not show,col)
492        if show:
493            for c in col:
494                table.hideColumn(c)
495        else:
496            for c in col:
497                table.showColumn(c)
498                table.resizeColumnToContents(c)
499
500    def drawAttributeLabels(self, table):
501#        table.setHorizontalHeaderLabels(table.variableNames)
502        table.model().show_attr_labels = bool(self.showAttributeLabels)
503        if self.showAttributeLabels:
504            labelnames = set()
505            for a in table.model().examples.domain:
506                labelnames.update(a.attributes.keys())
507            labelnames = sorted(list(labelnames))
508#            if len(labelnames):
509#                table.setHorizontalHeaderLabels([table.variableNames[i] + "\n" + "\n".join(["%s" % a.attributes.get(lab, "") for lab in labelnames]) for (i, a) in enumerate(table.data.domain.attributes)])
510            self.setCornerText(table, "\n".join([""] + labelnames))
511        else:
512            self.setCornerText(table, "")
513        table.repaint()
514
515    def cbShowAttLabelsClicked(self):
516        for table in self.table2id.keys():
517            self.drawAttributeLabels(table)
518
519    def cbShowDistributions(self):
520        for ti in range(self.tabs.count()):
521            color_schema = self.discPalette if self.colorByClass else None
522            delegate = OWGUI.TableBarItem(self, color=self.distColor,
523                                          color_schema=color_schema) \
524                       if self.showDistributions else QStyledItemDelegate(self)
525            self.tabs.widget(ti).setItemDelegate(delegate)
526        tab = self.tabs.currentWidget()
527        if tab:
528            tab.reset()
529
530    # show data in the default order
531    def btnResetSortClicked(self):
532        table = self.tabs.currentWidget()
533        if table:
534            id = self.table2id[table]
535            data = self.data[id]
536            table.horizontalHeader().setSortIndicatorShown(False)
537            self.progressBarInit()
538            self.setTable(table, data)
539            self.progressBarFinished()
540
541    def setInfo(self, data):
542        """Updates data info.
543        """
544        def sp(l, capitalize=False):
545            n = len(l)
546            if n == 0:
547                if capitalize:
548                    return "No", "s"
549                else:
550                    return "no", "s"
551            elif n == 1:
552                return str(n), ''
553            else:
554                return str(n), 's'
555
556        if data == None:
557            self.infoEx.setText('No data on input.')
558            self.infoMiss.setText('')
559            self.infoAttr.setText('')
560            self.infoMeta.setText('')
561            self.infoClass.setText('')
562        else:
563            self.infoEx.setText("%s example%s," % sp(data))
564            missData = orange.Preprocessor_takeMissing(data)
565            self.infoMiss.setText('%s (%.1f%s) with missing values.' % (len(missData), len(data) and 100.*len(missData)/len(data), "%"))
566            self.infoAttr.setText("%s attribute%s," % sp(data.domain.attributes,True))
567            self.infoMeta.setText("%s meta attribute%s." % sp(data.domain.getmetas()))
568            if data.domain.classVar:
569                if data.domain.classVar.varType == orange.VarTypes.Discrete:
570                    self.infoClass.setText('Discrete class with %s value%s.' % sp(data.domain.classVar.values))
571                elif data.domain.classVar.varType == orange.VarTypes.Continuous:
572                    self.infoClass.setText('Continuous class.')
573                else:
574                    self.infoClass.setText("Class is neither discrete nor continuous.")
575            else:
576                self.infoClass.setText('Classless domain.')
577
578    def updateSelection(self, *args):
579        self.sendButton.setEnabled(bool(self.getCurrentSelection()) and not self.autoCommit)
580        self.commitIf()
581           
582    def getCurrentSelection(self):
583        table = self.tabs.currentWidget()
584        if table and table.model():
585            model = table.model()
586            new = table.selectionModel().selectedIndexes()
587            return sorted(set([model.sorted_map[ind.row()] for ind in new]))
588       
589    def commitIf(self):
590        if self.autoCommit:
591            self.commit()
592        else:
593            self.selectionChangedFlag = True
594           
595    def commit(self):
596        table = self.tabs.currentWidget()
597        if table and table.model():
598            model = table.model()
599            selected = self.getCurrentSelection()
600            selection = [1 if i in selected else 0 for i in range(len(model.examples))]
601            data = model.examples.select(selection)
602            self.send("Selected Data", data if len(data) > 0 else None)
603            data = model.examples.select(selection, 0)
604            self.send("Other Data", data if len(data) > 0 else None)
605        else:
606            self.send("Selected Data", None)
607            self.send("Other Data", None)
608           
609        self.selectionChangedFlag = False
610           
611       
612
613if __name__=="__main__":
614    a = QApplication(sys.argv)
615    ow = OWDataTable()
616
617    #d1 = orange.ExampleTable(r'..\..\doc\datasets\auto-mpg')
618    #d2 = orange.ExampleTable('test-labels')
619    #d3 = orange.ExampleTable(r'..\..\doc\datasets\sponge.tab')
620    #d4 = orange.ExampleTable(r'..\..\doc\datasets\wpbc.csv')
621    d5 = orange.ExampleTable('../../doc/datasets/adult_sample.tab')
622    #d5 = orange.ExampleTable(r"E:\Development\Orange Datasets\UCI\wine.tab")
623#    d5 = orange.ExampleTable("adult_sample")
624#    d5 = orange.ExampleTable("/home/marko/tdw")
625    #d5 = orange.ExampleTable(r"e:\Development\Orange Datasets\Cancer\SRBCT.tab")
626    ow.show()
627    #ow.dataset(d1,"auto-mpg")
628    #ow.dataset(d2,"voting")
629    #ow.dataset(d4,"wpbc")
630    ow.dataset(d5,"adult_sample")
631    a.exec_()
632    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.