11import math
22import itertools
3+
4+ from PyQt4 .QtCore import Qt
35from collections import defaultdict
46
57from PyQt4 import QtGui
68import numpy
79
810import Orange
9- from Orange .widgets import widget
10- from Orange .widgets import gui
11+ from Orange .widgets import widget , gui , settings
1112from Orange .widgets .utils import itemmodels
1213from 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
1819class 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-
173165def allvars (data ):
174166 return (INDEX ,) + data .domain .attributes + data .domain .class_vars + data .domain .metas
175167
0 commit comments