99 QAbstractItemModel , QSortFilterProxyModel , QStringListModel ,
1010 QItemSelection , QItemSelectionModel
1111)
12+ from AnyQt .QtCore import pyqtSignal as Signal
1213
1314from Orange .util import deprecated
1415from Orange .widgets import gui , widget
@@ -90,17 +91,18 @@ class VariablesListItemView(QListView):
9091 """ A Simple QListView subclass initialized for displaying
9192 variables.
9293 """
94+ #: Emitted with a Qt.DropAction when a drag/drop (originating from this
95+ #: view) completed successfully
96+ dragDropActionDidComplete = Signal (int )
97+
9398 def __init__ (self , parent = None , acceptedType = Orange .data .Variable ):
9499 super ().__init__ (parent )
95100 self .setSelectionMode (self .ExtendedSelection )
96101 self .setAcceptDrops (True )
97102 self .setDragEnabled (True )
98103 self .setDropIndicatorShown (True )
99104 self .setDragDropMode (self .DragDrop )
100- if hasattr (self , "setDefaultDropAction" ):
101- # TODO do we still need this?
102- # For compatibility with Qt version < 4.6
103- self .setDefaultDropAction (Qt .MoveAction )
105+ self .setDefaultDropAction (Qt .MoveAction )
104106 self .setDragDropOverwriteMode (False )
105107 self .viewport ().setAcceptDrops (True )
106108
@@ -119,8 +121,7 @@ def startDrag(self, supported_actions):
119121 drag .setMimeData (data )
120122
121123 default_action = Qt .IgnoreAction
122- if hasattr (self , "defaultDropAction" ) and \
123- self .defaultDropAction () != Qt .IgnoreAction and \
124+ if self .defaultDropAction () != Qt .IgnoreAction and \
124125 supported_actions & self .defaultDropAction ():
125126 default_action = self .defaultDropAction ()
126127 elif (supported_actions & Qt .CopyAction and
@@ -132,6 +133,7 @@ def startDrag(self, supported_actions):
132133 rows = list (map (QModelIndex .row , selected ))
133134 for s1 , s2 in reversed (list (slices (rows ))):
134135 delslice (self .model (), s1 , s2 )
136+ self .dragDropActionDidComplete .emit (res )
135137
136138 def dragEnterEvent (self , event ):
137139 """
@@ -282,18 +284,25 @@ def __init__(self):
282284 self .completer_navigator = CompleterNavigator (self )
283285 self .filter_edit .installEventFilter (self .completer_navigator )
284286
285- self .available_attrs = VariableListModel (enable_dnd = True )
286- self .available_attrs .rowsRemoved .connect (self .update_completer_model )
287+ def dropcompleted (action ):
288+ if action == Qt .MoveAction :
289+ self .commit ()
287290
291+ self .available_attrs = VariableListModel (enable_dnd = True )
288292 self .available_attrs_proxy = VariableFilterProxyModel ()
289293 self .available_attrs_proxy .setSourceModel (self .available_attrs )
290294 self .available_attrs_view = VariablesListItemView (
291295 acceptedType = Orange .data .Variable )
292296 self .available_attrs_view .setModel (self .available_attrs_proxy )
293297
298+ aa = self .available_attrs
299+ aa .dataChanged .connect (self .update_completer_model )
300+ aa .rowsInserted .connect (self .update_completer_model )
301+ aa .rowsRemoved .connect (self .update_completer_model )
294302
295303 self .available_attrs_view .selectionModel ().selectionChanged .connect (
296304 partial (self .update_interface_state , self .available_attrs_view ))
305+ self .available_attrs_view .dragDropActionDidComplete .connect (dropcompleted )
297306 self .filter_edit .textChanged .connect (self .update_completer_prefix )
298307 self .filter_edit .textChanged .connect (
299308 self .available_attrs_proxy .set_filter_string )
@@ -303,38 +312,38 @@ def __init__(self):
303312
304313 box = gui .vBox (self .controlArea , "Features" , addToLayout = False )
305314 self .used_attrs = VariableListModel (enable_dnd = True )
306- self .used_attrs .rowsRemoved .connect (self .update_completer_model )
307315 self .used_attrs_view = VariablesListItemView (
308316 acceptedType = (Orange .data .DiscreteVariable ,
309317 Orange .data .ContinuousVariable ))
310318
311319 self .used_attrs_view .setModel (self .used_attrs )
312320 self .used_attrs_view .selectionModel ().selectionChanged .connect (
313321 partial (self .update_interface_state , self .used_attrs_view ))
322+ self .used_attrs_view .dragDropActionDidComplete .connect (dropcompleted )
314323 box .layout ().addWidget (self .used_attrs_view )
315324 layout .addWidget (box , 0 , 2 , 1 , 1 )
316325
317326 box = gui .vBox (self .controlArea , "Target Variable" , addToLayout = False )
318327 self .class_attrs = ClassVarListItemModel (enable_dnd = True )
319- self .class_attrs .rowsRemoved .connect (self .update_completer_model )
320328 self .class_attrs_view = ClassVariableItemView (
321329 acceptedType = (Orange .data .DiscreteVariable ,
322330 Orange .data .ContinuousVariable ))
323331 self .class_attrs_view .setModel (self .class_attrs )
324332 self .class_attrs_view .selectionModel ().selectionChanged .connect (
325333 partial (self .update_interface_state , self .class_attrs_view ))
334+ self .class_attrs_view .dragDropActionDidComplete .connect (dropcompleted )
326335 self .class_attrs_view .setMaximumHeight (24 )
327336 box .layout ().addWidget (self .class_attrs_view )
328337 layout .addWidget (box , 1 , 2 , 1 , 1 )
329338
330339 box = gui .vBox (self .controlArea , "Meta Attributes" , addToLayout = False )
331340 self .meta_attrs = VariableListModel (enable_dnd = True )
332- self .meta_attrs .rowsRemoved .connect (self .update_completer_model )
333341 self .meta_attrs_view = VariablesListItemView (
334342 acceptedType = Orange .data .Variable )
335343 self .meta_attrs_view .setModel (self .meta_attrs )
336344 self .meta_attrs_view .selectionModel ().selectionChanged .connect (
337345 partial (self .update_interface_state , self .meta_attrs_view ))
346+ self .meta_attrs_view .dragDropActionDidComplete .connect (dropcompleted )
338347 box .layout ().addWidget (self .meta_attrs_view )
339348 layout .addWidget (box , 2 , 2 , 1 , 1 )
340349
@@ -472,6 +481,8 @@ def move_rows(self, view, rows, offset):
472481 view .selectionModel ().select (
473482 selection , QItemSelectionModel .ClearAndSelect )
474483
484+ self .commit ()
485+
475486 def move_up (self , view ):
476487 selected = self .selected_rows (view )
477488 self .move_rows (view , selected , - 1 )
@@ -507,6 +518,8 @@ def move_from_to(self, src, dst, rows, exclusive=False):
507518
508519 dst_model .extend (attrs )
509520
521+ self .commit ()
522+
510523 def update_interface_state (self , focus = None , selected = None , deselected = None ):
511524 for view in [self .available_attrs_view , self .used_attrs_view ,
512525 self .class_attrs_view , self .meta_attrs_view ]:
@@ -553,7 +566,6 @@ def update_completer_model(self, *_):
553566 vars = list (self .available_attrs )
554567 items = [var .name for var in vars ]
555568 items += ["%s=%s" % item for v in vars for item in v .attributes .items ()]
556- self .commit ()
557569
558570 new = sorted (set (items ))
559571 if new != self .original_completer_items :
@@ -600,6 +612,7 @@ def reset(self):
600612 self .class_attrs [:] = self .data .domain .class_vars
601613 self .meta_attrs [:] = self .data .domain .metas
602614 self .update_domain_role_hints ()
615+ self .commit ()
603616
604617 def send_report (self ):
605618 if not self .data or not self .output_data :
0 commit comments