Skip to content

Commit f6233be

Browse files
committed
Time Series: Properly store and restore selection
1 parent 943856f commit f6233be

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

orangecontrib/timeseries/widgets/owdifference.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,17 @@ class Outputs:
4848
want_main_area = False
4949
resizing_enabled = False
5050

51+
settings_version = 2
5152
operation = settings.Setting(Diff)
5253
shift_period = settings.Setting(1)
5354
invert_direction = settings.Setting(False)
5455
assume_zero_before = settings.Setting(False)
55-
selection: List[str] = settings.Setting([])
56+
pending_selection: List[str] = settings.Setting([])
5657
autocommit = settings.Setting(True)
5758

5859
def __init__(self):
5960
self.data = None
60-
self.selection = self.persistent_selection = []
61+
self.selection = []
6162

6263
self.view = view = QListView(self,
6364
selectionMode=QListView.ExtendedSelection)
@@ -104,31 +105,30 @@ def _update_gui_state(self):
104105
and self.operation in (self.Diff, self.Diff2))
105106

106107
def _selection_changed(self):
107-
self.selection = [
108+
self.pending_selection = self.selection = [
108109
self.model.data(index)
109110
for index in self.view.selectionModel().selectedRows()]
110111
self.commit.deferred()
111112

112113
@Inputs.time_series
113114
def set_data(self, data):
114-
if self.selection:
115-
self.persistent_selection = self.selection[:]
116-
117115
if not data:
118116
self.data = None
119-
self.model.clear()
117+
with signal_blocking(self.view.selectionModel()):
118+
self.model.clear()
119+
self.selection = []
120120
self.commit.now()
121121
return
122122

123123
self.data = Timeseries.from_data_table(data)
124-
self.model[:] = [var for var in data.domain.variables
125-
if var.is_continuous and var is not
126-
self.data.time_variable]
127-
128-
names = [attr.name for attr in self.model]
129-
self.selection = [name for name in self.persistent_selection
130-
if name in names]
131124
with signal_blocking(self.view.selectionModel()):
125+
self.model[:] = [var for var in data.domain.variables
126+
if var.is_continuous and var is not
127+
self.data.time_variable]
128+
129+
names = [attr.name for attr in self.model]
130+
self.pending_selection = self.selection = [
131+
name for name in self.pending_selection if name in names]
132132
select_rows(self.view,
133133
[names.index(name) for name in self.selection])
134134
self.commit.now()
@@ -200,6 +200,11 @@ def compute(self, data, attr_names):
200200
columns = np.zeros((len(data), 0), dtype=float)
201201
return tuple(attrs), columns
202202

203+
@classmethod
204+
def migrate_settings(cls, settings, version):
205+
if version < 2:
206+
settings["pending_selection"] = settings.pop("selection", [])
207+
return super().migrate_settings(settings, version)
203208

204209
if __name__ == "__main__":
205210
WidgetPreview(OWDifference).run(set_data=Table.from_file('iris'))

orangecontrib/timeseries/widgets/tests/test_owdifference.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,25 @@ def test_saved_selection(self):
4747
self.send_signal(self.widget.Inputs.time_series, self.data[:, 2:])
4848
self.assertEqual(widget.selection, ["c"])
4949

50+
def test_selection_from_saved_workflow(self):
51+
settings = {
52+
'autocommit': True, 'controlAreaVisible': True,
53+
'invert_direction': False, 'operation': 0, 'shift_period': 1,
54+
'pending_selection': ['b', 'c'],
55+
'__version__': 2}
56+
widget = self.create_widget(OWDifference, stored_settings=settings)
57+
self.send_signal(widget.Inputs.time_series, self.data)
58+
self.assertEqual(widget.selection, ["b", "c"])
59+
60+
def test_migration_to_2(self):
61+
settings = {
62+
'autocommit': True, 'controlAreaVisible': True,
63+
'invert_direction': False, 'operation': 0, 'shift_period': 1,
64+
'selection': ['b', 'c']}
65+
widget = self.create_widget(OWDifference, stored_settings=settings)
66+
self.send_signal(widget.Inputs.time_series, self.data)
67+
self.assertEqual(widget.selection, ["b", "c"])
68+
5069
def test_difference(self):
5170
widget = self.widget
5271
widget.operation = widget.Diff
@@ -362,7 +381,7 @@ def sq(r, c, add):
362381
return np.arange(add, add + r * c, dtype=float).reshape(r, c)
363382

364383
widget = self.widget
365-
widget.selection = list("abc")
384+
widget.pending_selection = list("abc")
366385
widget.shift_period = 1
367386
widget.operation = 2
368387

0 commit comments

Comments
 (0)