55from AnyQt .QtWidgets import QListView
66from AnyQt .QtCore import (
77 Qt , QTimer , QSortFilterProxyModel , QItemSelection , QItemSelectionModel ,
8- QMimeData
8+ QMimeData , QAbstractItemModel
99)
1010
1111from Orange .widgets import gui , widget
@@ -411,12 +411,20 @@ def selected_rows(view):
411411 rows = [model .mapToSource (r ) for r in rows ]
412412 return [r .row () for r in rows ]
413413
414- def move_rows (self , view , rows , offset ):
415- model = view .model ()
416- newrows = [min (max (0 , row + offset ), len (model ) - 1 ) for row in rows ]
414+ def move_rows (self , view : QListView , offset : int , roles = (Qt .EditRole ,)):
415+ rows = [idx .row () for idx in view .selectionModel ().selectedRows ()]
416+ model = view .model () # type: QAbstractItemModel
417+ rowcount = model .rowCount ()
418+ newrows = [min (max (0 , row + offset ), rowcount - 1 ) for row in rows ]
419+
420+ def itemData (index ):
421+ return {role : model .data (index , role ) for role in roles }
417422
418423 for row , newrow in sorted (zip (rows , newrows ), reverse = offset > 0 ):
419- model [row ], model [newrow ] = model [newrow ], model [row ]
424+ d1 = itemData (model .index (row , 0 ))
425+ d2 = itemData (model .index (newrow , 0 ))
426+ model .setItemData (model .index (row , 0 ), d2 )
427+ model .setItemData (model .index (newrow , 0 ), d1 )
420428
421429 selection = QItemSelection ()
422430 for nrow in newrows :
@@ -427,13 +435,11 @@ def move_rows(self, view, rows, offset):
427435
428436 self .commit ()
429437
430- def move_up (self , view ):
431- selected = self .selected_rows (view )
432- self .move_rows (view , selected , - 1 )
438+ def move_up (self , view : QListView ):
439+ self .move_rows (view , - 1 )
433440
434- def move_down (self , view ):
435- selected = self .selected_rows (view )
436- self .move_rows (view , selected , 1 )
441+ def move_down (self , view : QListView ):
442+ self .move_rows (view , 1 )
437443
438444 def move_selected (self , view ):
439445 if self .selected_rows (view ):
0 commit comments