55from AnyQt .QtWidgets import QWidget , QGridLayout
66from AnyQt .QtWidgets import QListView # pylint: disable=unused-import
77from AnyQt .QtCore import (
8- Qt , QTimer , QSortFilterProxyModel , QItemSelection , QItemSelectionModel
8+ Qt , QTimer , QSortFilterProxyModel , QItemSelection , QItemSelectionModel ,
9+ QMimeData
910)
1011
11- from Orange .util import deprecated
1212from Orange .widgets import gui , widget
1313from Orange .widgets .data .contexthandlers import \
1414 SelectAttributesDomainContextHandler
@@ -41,43 +41,59 @@ def source_indexes(indexes, view):
4141 return indexes
4242
4343
44- # owloadcorpus in orange3-text used this
45- @deprecated ('Orange.widgets.utils.itemmodels.VariableListModel' )
46- def VariablesListItemModel (* args , ** kwargs ):
47- return VariableListModel (* args , enable_dnd = True , ** kwargs )
44+ class VariablesListItemModel (VariableListModel ):
45+ """
46+ An Variable list item model specialized for Drag and Drop.
47+ """
48+ MIME_TYPE = "application/x-Orange-VariableListModelData"
4849
50+ def flags (self , index ):
51+ flags = super ().flags (index )
52+ if index .isValid ():
53+ flags |= Qt .ItemIsDragEnabled
54+ else :
55+ flags |= Qt .ItemIsDropEnabled
56+ return flags
4957
50- class ClassVarListItemModel (VariableListModel ):
51- def dropMimeData (self , mime , action , row , column , parent ):
52- """ Ensure only one variable can be dropped onto the view.
53- """
54- vars = mime .property ('_items' )
55- if vars is None :
56- return False
57- if action == Qt .IgnoreAction :
58- return True
59- return VariableListModel .dropMimeData (
60- self , mime , action , row , column , parent )
58+ def supportedDropActions (self ):
59+ return Qt .MoveAction # pragma: no cover
6160
61+ def supportedDragActions (self ):
62+ return Qt .MoveAction # pragma: no cover
6263
63- class ClassVariableItemView (VariablesListItemView ):
64- def __init__ (self , parent = None , acceptedType = Orange .data .Variable ):
65- VariablesListItemView .__init__ (self , parent , acceptedType )
66- self .setDropIndicatorShown (False )
64+ def mimeTypes (self ):
65+ return [self .MIME_TYPE ]
6766
68- def acceptsDropEvent (self , event ):
67+ def mimeData (self , indexlist ):
6968 """
70- Reimplemented
69+ Reimplemented.
7170
72- Ensure only one variable is in the model.
71+ For efficiency reasons only the variable instances are set on the
72+ mime data (under `'_items'` property)
7373 """
74- accepts = super ().acceptsDropEvent (event )
75- mime = event .mimeData ()
76- vars = mime .property ('_items' )
77- if vars is None :
78- return False
74+ items = [self [index .row ()] for index in indexlist ]
75+ mime = QMimeData ()
76+ # the encoded 'data' is empty, variables are passed by properties
77+ mime .setData (self .MIME_TYPE , b'' )
78+ mime .setProperty ("_items" , items )
79+ return mime
80+
81+ def dropMimeData (self , mime , action , row , column , parent ):
82+ """
83+ Reimplemented.
84+ """
85+ if action == Qt .IgnoreAction :
86+ return True # pragma: no cover
87+ if not mime .hasFormat (self .MIME_TYPE ):
88+ return False # pragma: no cover
89+ variables = mime .property ("_items" )
90+ if variables is None :
91+ return False # pragma: no cover
92+ if row < 0 :
93+ row = self .rowCount ()
7994
80- return accepts
95+ self [row :row ] = variables
96+ return True
8197
8298
8399class OWSelectAttributes (widget .OWWidget ):
@@ -126,7 +142,7 @@ def update_on_change(view):
126142 box = gui .vBox (self .controlArea , "Available Variables" ,
127143 addToLayout = False )
128144
129- self .available_attrs = VariableListModel ( enable_dnd = True )
145+ self .available_attrs = VariablesListItemModel ( )
130146 filter_edit , self .available_attrs_view = variables_filter (
131147 parent = self , model = self .available_attrs )
132148 box .layout ().addWidget (filter_edit )
@@ -143,7 +159,7 @@ def dropcompleted(action):
143159 layout .addWidget (box , 0 , 0 , 3 , 1 )
144160
145161 box = gui .vBox (self .controlArea , "Features" , addToLayout = False )
146- self .used_attrs = VariableListModel ( enable_dnd = True )
162+ self .used_attrs = VariablesListItemModel ( )
147163 self .used_attrs_view = VariablesListItemView (
148164 acceptedType = (Orange .data .DiscreteVariable ,
149165 Orange .data .ContinuousVariable ))
@@ -156,8 +172,8 @@ def dropcompleted(action):
156172 layout .addWidget (box , 0 , 2 , 1 , 1 )
157173
158174 box = gui .vBox (self .controlArea , "Target Variable" , addToLayout = False )
159- self .class_attrs = ClassVarListItemModel ( enable_dnd = True )
160- self .class_attrs_view = ClassVariableItemView (
175+ self .class_attrs = VariablesListItemModel ( )
176+ self .class_attrs_view = VariablesListItemView (
161177 acceptedType = (Orange .data .DiscreteVariable ,
162178 Orange .data .ContinuousVariable ))
163179 self .class_attrs_view .setModel (self .class_attrs )
@@ -169,7 +185,7 @@ def dropcompleted(action):
169185 layout .addWidget (box , 1 , 2 , 1 , 1 )
170186
171187 box = gui .vBox (self .controlArea , "Meta Attributes" , addToLayout = False )
172- self .meta_attrs = VariableListModel ( enable_dnd = True )
188+ self .meta_attrs = VariablesListItemModel ( )
173189 self .meta_attrs_view = VariablesListItemView (
174190 acceptedType = Orange .data .Variable )
175191 self .meta_attrs_view .setModel (self .meta_attrs )
0 commit comments