Skip to content

Commit 564664e

Browse files
committed
OWMergeData: replace list views with combos, save settings
Fixes #1450
1 parent 020550c commit 564664e

File tree

1 file changed

+44
-52
lines changed

1 file changed

+44
-52
lines changed

Orange/widgets/data/owmergedata.py

Lines changed: 44 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import math
22
import itertools
3+
4+
from PyQt4.QtCore import Qt
35
from collections import defaultdict
46

57
from PyQt4 import QtGui
68
import numpy
79

810
import Orange
9-
from Orange.widgets import widget
10-
from Orange.widgets import gui
11+
from Orange.widgets import widget, gui, settings
1112
from Orange.widgets.utils import itemmodels
1213
from Orange.widgets.utils.sql import check_sql_input
1314

1415

15-
INSTANCEID = "Same source"
16-
INDEX = "Index"
16+
INSTANCEID = "Source position (index)"
17+
INDEX = "Position (index)"
1718

1819
class OWMergeData(widget.OWWidget):
1920
name = "Merge Data"
@@ -26,6 +27,11 @@ class OWMergeData(widget.OWWidget):
2627
outputs = [("Merged Data A+B", Orange.data.Table, ),
2728
("Merged Data B+A", Orange.data.Table, )]
2829

30+
settingsHandler = settings.DomainContextHandler()
31+
32+
attr_a = settings.ContextSetting('')
33+
attr_b = settings.ContextSetting('')
34+
2935
want_main_area = False
3036

3137
def __init__(self):
@@ -45,30 +51,24 @@ def __init__(self):
4551
# attribute A selection
4652
boxAttrA = gui.vBox(self, self.tr("Attribute A"), addToLayout=False)
4753
grid.addWidget(boxAttrA, 0, 0)
48-
self.attrViewA = QtGui.QListView(
49-
selectionMode=QtGui.QListView.SingleSelection
50-
)
5154

55+
self.attrViewA = gui.comboBox(boxAttrA, self, 'attr_a',
56+
orientation=Qt.Horizontal,
57+
sendSelectedValue=True,
58+
callback=self._invalidate)
5259
self.attrModelA = itemmodels.VariableListModel()
5360
self.attrViewA.setModel(self.attrModelA)
54-
self.attrViewA.selectionModel().selectionChanged.connect(
55-
self._selectedAttrAChanged)
56-
57-
boxAttrA.layout().addWidget(self.attrViewA)
5861

5962
# attribute B selection
6063
boxAttrB = gui.vBox(self, self.tr("Attribute B"), addToLayout=False)
6164
grid.addWidget(boxAttrB, 0, 1)
62-
self.attrViewB = QtGui.QListView(
63-
selectionMode=QtGui.QListView.SingleSelection
64-
)
6565

66+
self.attrViewB = gui.comboBox(boxAttrB, self, 'attr_b',
67+
orientation=Qt.Horizontal,
68+
sendSelectedValue=True,
69+
callback=self._invalidate)
6670
self.attrModelB = itemmodels.VariableListModel()
6771
self.attrViewB.setModel(self.attrModelB)
68-
self.attrViewB.selectionModel().selectionChanged.connect(
69-
self._selectedAttrBChanged)
70-
71-
boxAttrB.layout().addWidget(self.attrViewB)
7272

7373
# info A
7474
boxDataA = gui.vBox(self, self.tr("Data A Input"), addToLayout=False)
@@ -80,9 +80,7 @@ def __init__(self):
8080
grid.addWidget(boxDataB, 1, 1)
8181
self.infoBoxDataB = gui.widgetLabel(boxDataB, self.dataInfoText(None))
8282

83-
gui.rubber(self.buttonsArea)
84-
# resize
85-
self.resize(400, 500)
83+
gui.rubber(self)
8684

8785
def setAttrs(self):
8886
add = ()
@@ -100,16 +98,20 @@ def setAttrs(self):
10098

10199
@check_sql_input
102100
def setDataA(self, data):
103-
#self.closeContext()
104101
self.dataA = data
105102
self.setAttrs()
103+
self.closeContext()
104+
self.attr_a = next(iter(self.attrModelA), '')
105+
self.openContext(self.dataA)
106106
self.infoBoxDataA.setText(self.dataInfoText(data))
107107

108108
@check_sql_input
109109
def setDataB(self, data):
110-
#self.closeContext()
111110
self.dataB = data
112111
self.setAttrs()
112+
self.closeContext()
113+
self.attr_b = next(iter(self.attrModelB), '')
114+
self.openContext(self.dataB)
113115
self.infoBoxDataB.setText(self.dataInfoText(data))
114116

115117
def handleNewSignals(self):
@@ -126,50 +128,40 @@ def dataInfoText(self, data):
126128
attributes = self.tr("%n variable(s)", None, nvariables)
127129
return "\n".join([instances, attributes])
128130

129-
def selectedIndexA(self):
130-
return selected_row(self.attrViewA)
131-
132-
def selectedIndexB(self):
133-
return selected_row(self.attrViewB)
134-
135131
def commit(self):
136-
indexA = self.selectedIndexA()
137-
indexB = self.selectedIndexB()
138132
AB, BA = None, None
139-
if indexA is not None and indexB is not None:
140-
varA = self.attrModelA[indexA]
141-
varB = self.attrModelB[indexB]
133+
if (self.attr_a and self.attr_b and
134+
self.dataA is not None and
135+
self.dataB is not None):
136+
varA = (self.attr_a if self.attr_a in (INDEX, INSTANCEID) else
137+
self.dataA.domain[self.attr_a])
138+
varB = (self.attr_b if self.attr_b in (INDEX, INSTANCEID) else
139+
self.dataB.domain[self.attr_b])
142140
AB = merge(self.dataA, varA, self.dataB, varB)
143141
BA = merge(self.dataB, varB, self.dataA, varA)
144142
self.send("Merged Data A+B", AB)
145143
self.send("Merged Data B+A", BA)
146144

147-
def _selectedAttrAChanged(self, *args):
148-
self._invalidate()
149-
150-
def _selectedAttrBChanged(self, *args):
151-
self._invalidate()
152-
153145
def _invalidate(self):
154146
self.commit()
155147

156148
def send_report(self):
157-
attr_a = self.selectedIndexA()
158-
attr_b = self.selectedIndexB()
149+
attr_a = None
150+
attr_b = None
151+
if self.dataA is not None:
152+
attr_a = self.attr_a
153+
if attr_a in self.dataA.domain:
154+
attr_a = self.dataA.domain[attr_a]
155+
if self.dataB is not None:
156+
attr_b = self.attr_b
157+
if attr_b in self.dataB.domain:
158+
attr_b = self.dataB.domain[attr_b]
159159
self.report_items((
160-
("Attribute A", attr_a and self.attrModelA[attr_a]),
161-
("Attribute B", attr_b and self.attrModelB[attr_b])
160+
("Attribute A", attr_a),
161+
("Attribute B", attr_b),
162162
))
163163

164164

165-
def selected_row(view):
166-
rows = view.selectionModel().selectedRows()
167-
if rows:
168-
return rows[0].row()
169-
else:
170-
return None
171-
172-
173165
def allvars(data):
174166
return (INDEX,) + data.domain.attributes + data.domain.class_vars + data.domain.metas
175167

0 commit comments

Comments
 (0)