Skip to content

Commit 509a10f

Browse files
committed
owselectcolumns: Fix move up/down with filtering
1 parent a20b32f commit 509a10f

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

Orange/widgets/data/owselectcolumns.py

+17-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from AnyQt.QtWidgets import QListView
66
from AnyQt.QtCore import (
77
Qt, QTimer, QSortFilterProxyModel, QItemSelection, QItemSelectionModel,
8-
QMimeData
8+
QMimeData, QAbstractItemModel
99
)
1010

1111
from 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):

Orange/widgets/data/tests/test_owselectcolumns.py

+23
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,26 @@ def _drag_enter_event(self, variables):
363363
mime.setProperty("_items", variables)
364364
return QDragEnterEvent(QPoint(0, 0), Qt.MoveAction, mime,
365365
Qt.NoButton, Qt.NoModifier)
366+
367+
def test_move_rows(self):
368+
data = Table("iris")[:5]
369+
w = self.widget
370+
self.send_signal(w.Inputs.data, data)
371+
view = w.used_attrs_view
372+
model = view.model()
373+
selmodel = view.selectionModel()
374+
midx = model.index(1, 0)
375+
selmodel.select(midx, selmodel.ClearAndSelect)
376+
377+
w.move_up(view)
378+
d1 = self.get_output(w.Outputs.data, w)
379+
self.assertEqual(
380+
d1.domain.attributes,
381+
data.domain.attributes[:2][::-1] + data.domain.attributes[2:]
382+
)
383+
w.move_down(view)
384+
d1 = self.get_output(w.Outputs.data, w)
385+
self.assertEqual(
386+
d1.domain.attributes,
387+
data.domain.attributes
388+
)

0 commit comments

Comments
 (0)