Skip to content

Commit d096f17

Browse files
committed
owtable: Do not resend outputs on subset input update
1 parent 89ac3bf commit d096f17

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

Orange/widgets/data/owtable.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ def __init__(self):
220220
self._subset_ids: Optional[set] = None
221221
self.__pending_selection: Optional[_Selection] = self.stored_selection
222222
self.__pending_sort: Optional[_Sorting] = self.stored_sort
223+
self.__have_new_data = False
224+
self.__have_new_subset = False
223225
self.dist_color = QColor(220, 220, 220, 255)
224226

225227
info_box = gui.vBox(self.controlArea, "Info")
@@ -297,6 +299,7 @@ def update(_):
297299
summary.len.add_done_callback(update)
298300
else:
299301
self.input = None
302+
self.__have_new_data = True
300303

301304
@Inputs.data_subset
302305
def set_subset_dataset(self, subset: Optional[Table]):
@@ -306,25 +309,38 @@ def set_subset_dataset(self, subset: Optional[Table]):
306309
else:
307310
ids = None
308311
self._subset_ids = ids
312+
self.__have_new_subset = True
309313

310314
def handleNewSignals(self):
311315
super().handleNewSignals()
312316
self.Warning.non_sortable_input.clear()
313317
self.Warning.missing_sort_columns.clear()
314318
data: Optional[Table] = self.input.table if self.input else None
315-
self._setup_table_view()
316-
self._update_input_summary()
319+
model = self.input.model if self.input else None
320+
321+
if self.__have_new_data:
322+
self._setup_table_view()
323+
self._update_input_summary()
324+
325+
if data is not None and self.__pending_sort is not None:
326+
self.__restore_sort()
317327

318-
if data is not None and self.__pending_sort is not None:
319-
self.__restore_sort()
328+
if data is not None and self.__pending_selection is not None:
329+
selection = self.__pending_selection
330+
self.__pending_selection = None
331+
rows = selection["rows"]
332+
columns = selection["columns"]
333+
self.set_selection(rows, columns)
320334

321-
if data is not None and self.__pending_selection is not None:
322-
selection = self.__pending_selection
323-
self.__pending_selection = None
324-
rows = selection["rows"]
325-
columns = selection["columns"]
326-
self.set_selection(rows, columns)
327-
self.commit.now()
335+
if self.__have_new_subset and model is not None:
336+
model.setSubsetRowIds(self._subset_ids or set())
337+
self.__have_new_subset = False
338+
339+
self._setup_view_delegate()
340+
341+
if self.__have_new_data:
342+
self.commit.now()
343+
self.__have_new_data = False
328344

329345
def _setup_table_view(self):
330346
"""Setup the view with current input data."""
@@ -409,7 +425,8 @@ def _on_distribution_color_changed(self):
409425
self._setup_view_delegate()
410426

411427
def _setup_view_delegate(self):
412-
assert self.input is not None
428+
if self.input is None:
429+
return
413430
model = self.input.model
414431
data = model.source
415432
class_var = data.domain.class_var

Orange/widgets/data/tests/test_owtable.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ def test_show_attribute_labels(self):
202202
def test_subset_input(self):
203203
w = self.widget
204204
self.send_signal(w.Inputs.data, self.data)
205-
self.send_signal(w.Inputs.data_subset, self.data[[0, 1, 5]])
205+
with patch.object(w.signalManager, "send") as m:
206+
self.send_signal(w.Inputs.data_subset, self.data[[0, 1, 5]])
207+
m.assert_not_called()
206208
w.view.grab() # cover delegate painting methods
207209

208210
model = w.view.model()
@@ -211,7 +213,10 @@ def test_subset_input(self):
211213
self.assertTrue(model.headerData(0, Qt.Vertical, model.SubsetRole))
212214
self.assertFalse(model.headerData(2, Qt.Vertical, model.SubsetRole))
213215

214-
self.send_signal(w.Inputs.data_subset, None)
216+
with patch.object(w.signalManager, "send") as m:
217+
self.send_signal(w.Inputs.data_subset, None)
218+
m.assert_not_called()
219+
215220
w.view.grab()
216221

217222
model = w.view.model()

0 commit comments

Comments
 (0)