Skip to content

Commit 442fd16

Browse files
authored
Merge pull request #3327 from robertcv/fixes/table_select
[FIX] OWDataTable: reset selections on domain change
2 parents 849ae1f + 8371be7 commit 442fd16

File tree

2 files changed

+33
-11
lines changed

2 files changed

+33
-11
lines changed

Orange/widgets/data/owtable.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@
1414
from scipy.sparse import issparse
1515

1616
from AnyQt.QtWidgets import (
17-
QTableView, QHeaderView, QAbstractButton, QAction, QApplication,
18-
QStyleOptionHeader, QStyle, QStylePainter, QStyledItemDelegate
17+
QTableView, QHeaderView, QAbstractButton, QApplication, QStyleOptionHeader,
18+
QStyle, QStylePainter, QStyledItemDelegate
1919
)
20-
from AnyQt.QtGui import QColor, QKeySequence, QClipboard
20+
from AnyQt.QtGui import QColor, QClipboard
2121
from AnyQt.QtCore import (
2222
Qt, QSize, QEvent, QByteArray, QMimeData, QObject, QMetaObject,
2323
QAbstractProxyModel, QIdentityProxyModel, QModelIndex,
24-
QItemSelectionModel, QItemSelection, QItemSelectionRange,
25-
QT_VERSION
24+
QItemSelectionModel, QItemSelection, QItemSelectionRange
2625
)
2726
from AnyQt.QtCore import pyqtSlot as Slot
2827

@@ -33,8 +32,7 @@
3332
from Orange.statistics import basic_stats
3433

3534
from Orange.widgets import widget, gui
36-
from Orange.widgets.settings import (Setting, ContextSetting,
37-
DomainContextHandler)
35+
from Orange.widgets.settings import Setting, DomainContextHandler
3836
from Orange.widgets.widget import Input, Output
3937
from Orange.widgets.utils import datacaching
4038
from Orange.widgets.utils.annotated_data import (create_annotated_table,
@@ -390,14 +388,19 @@ class Outputs:
390388
color_by_class = Setting(True)
391389
settingsHandler = DomainContextHandler(
392390
match_values=DomainContextHandler.MATCH_VALUES_ALL)
393-
selected_rows = ContextSetting([])
394-
selected_cols = ContextSetting([])
391+
selected_rows = Setting([], schema_only=True)
392+
selected_cols = Setting([], schema_only=True)
395393

396394
def __init__(self):
397395
super().__init__()
398396

399397
self._inputs = OrderedDict()
400398

399+
self.__pending_selected_rows = self.selected_rows
400+
self.selected_rows = None
401+
self.__pending_selected_cols = self.selected_cols
402+
self.selected_cols = None
403+
401404
self.dist_color = QColor(*self.dist_color_RGB)
402405

403406
info_box = gui.vBox(self.controlArea, "Info")
@@ -514,9 +517,20 @@ def update(f):
514517
self.set_info(current._input_slot.summary)
515518

516519
self.tabs.tabBar().setVisible(self.tabs.count() > 1)
517-
self.selected_rows = []
518-
self.selected_cols = []
519520
self.openContext(data)
521+
522+
if self.__pending_selected_rows is not None:
523+
self.selected_rows = self.__pending_selected_rows
524+
self.__pending_selected_rows = None
525+
else:
526+
self.selected_rows = []
527+
528+
if self.__pending_selected_cols is not None:
529+
self.selected_cols = self.__pending_selected_cols
530+
self.__pending_selected_cols = None
531+
else:
532+
self.selected_cols = []
533+
520534
self.set_selection()
521535
self.commit()
522536

Orange/widgets/data/tests/test_owtable.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# pylint: disable=missing-docstring
33
from Orange.widgets.data.owtable import OWDataTable
44
from Orange.widgets.tests.base import WidgetTest, WidgetOutputsTestMixin
5+
from Orange.data import Table
56

67

78
class TestOWDataTable(WidgetTest, WidgetOutputsTestMixin):
@@ -30,6 +31,13 @@ def test_data_model(self):
3031
self.assertEqual(self.widget.tabs.widget(0).model().rowCount(),
3132
len(self.data))
3233

34+
def test_reset_select(self):
35+
self.send_signal(self.widget.Inputs.data, self.data)
36+
self._select_data()
37+
self.send_signal(self.widget.Inputs.data, Table('heart_disease'))
38+
self.assertListEqual([], self.widget.selected_cols)
39+
self.assertListEqual([], self.widget.selected_rows)
40+
3341
def _select_data(self):
3442
self.widget.selected_cols = list(range(len(self.data.domain)))
3543
self.widget.selected_rows = list(range(0, len(self.data.domain), 10))

0 commit comments

Comments
 (0)