From 0831eb1c7ce2a2dba5b6eba502a7edfb5d16e8d5 Mon Sep 17 00:00:00 2001 From: janezd Date: Fri, 17 Nov 2017 21:58:12 +0100 Subject: [PATCH] gui.listView: Add test, refactor --- Orange/widgets/gui.py | 16 ++++------- Orange/widgets/tests/test_gui.py | 47 ++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/Orange/widgets/gui.py b/Orange/widgets/gui.py index 1e52d7778dd..4bcac5b2f77 100644 --- a/Orange/widgets/gui.py +++ b/Orange/widgets/gui.py @@ -14,7 +14,7 @@ import pkg_resources from AnyQt import QtWidgets, QtCore, QtGui -from AnyQt.QtCore import Qt, QSize, pyqtSignal as Signal +from AnyQt.QtCore import Qt, QSize, QItemSelection, pyqtSignal as Signal from AnyQt.QtGui import QCursor, QColor from AnyQt.QtWidgets import ( QApplication, QStyle, QSizePolicy, QWidget, QLabel, QGroupBox, QSlider, @@ -2477,20 +2477,13 @@ def action(self, values): model = view.model() sel_model = view.selectionModel() - if view.selectionMode == view.SingleSelection: - flags = sel_model.ClearAndSelect - else: - sel_model.clearSelection() - flags = sel_model.Select - if not isinstance(values, Sequence): values = [values] + selection = QItemSelection() for value in values: if not isinstance(value, int): - if isinstance(value, str): - search_role = Qt.DisplayRole - elif isinstance(value, Variable): + if isinstance(value, Variable): search_role = TableVariable else: search_role = Qt.DisplayRole @@ -2499,7 +2492,8 @@ def action(self, values): if model.data(model.index(i), search_role) == value: value = i break - sel_model.select(model.index(value), flags) + selection.select(model.index(value), model.index(value)) + sel_model.select(selection, sel_model.ClearAndSelect) class CallFrontListBox(ControlledCallFront): diff --git a/Orange/widgets/tests/test_gui.py b/Orange/widgets/tests/test_gui.py index ff8e17ff075..a0616440086 100644 --- a/Orange/widgets/tests/test_gui.py +++ b/Orange/widgets/tests/test_gui.py @@ -17,25 +17,62 @@ def test_checked_extension(self): class TestListModel(GuiTest): - def test_select(self): - widget = OWWidget() - widget.foo = None + def setUp(self): + self.widget = OWWidget() + self.widget.foo = None self.attrs = VariableListModel() - view = gui.listView(widget.controlArea, widget, "foo", model=self.attrs) + self.view = gui.listView( + self.widget.controlArea, self.widget, "foo", model=self.attrs) + + def test_select_callback(self): + widget = self.widget + view = self.view + self.assertIsNone(widget.foo) + a, b, c = (ContinuousVariable(x) for x in "abc") self.attrs[:] = [a, b, c] + view.setCurrentIndex(self.attrs.index(0, 0)) self.assertIs(widget.foo, a) view.setCurrentIndex(self.attrs.index(2, 0)) self.assertIs(widget.foo, c) + view.setSelectionMode(view.MultiSelection) + sel_model = view.selectionModel() + sel_model.clear() + view.setCurrentIndex(self.attrs.index(1, 0)) + self.assertEqual(widget.foo, [b]) + + def test_select_callfront(self): + widget = self.widget + view = self.view + + a, b, c = (ContinuousVariable(x) for x in "abc") + self.attrs[:] = [a, b, c] + widget.foo = b selection = view.selectedIndexes() self.assertEqual(len(selection), 1) self.assertEqual(selection[0].row(), 1) -class ComboBoxText(GuiTest): + view.setSelectionMode(view.MultiSelection) + widget.foo = [a, c] + selection = view.selectedIndexes() + self.assertEqual(len(selection), 2) + self.assertEqual({selection[0].row(), selection[1].row()}, {0, 2}) + + widget.foo = [] + selection = view.selectedIndexes() + self.assertEqual(len(selection), 0) + + widget.foo = [2, "b"] + selection = view.selectedIndexes() + self.assertEqual(len(selection), 2) + self.assertEqual({selection[0].row(), selection[1].row()}, {1, 2}) + + +class ComboBoxTest(GuiTest): def test_set_initial_value(self): widget = OWWidget() variables = [ContinuousVariable(x) for x in "abc"]