Skip to content

Commit b6a88e3

Browse files
authored
Merge pull request #3627 from VesnaT/concurrent_widget_mixin
[ENH] Offload work to a separate thread
2 parents b415bca + 8ac9f33 commit b6a88e3

File tree

9 files changed

+748
-389
lines changed

9 files changed

+748
-389
lines changed

Orange/projection/base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import inspect
23
import threading
34

@@ -135,6 +136,7 @@ def proj_variable(i, name):
135136

136137
super().__init__(proj=proj)
137138
self.orig_domain = domain
139+
self.n_components = n_components
138140
var_names = self._get_var_names(n_components)
139141
self.domain = Orange.data.Domain(
140142
[proj_variable(i, var_names[i]) for i in range(n_components)],
@@ -145,6 +147,13 @@ def _get_var_names(self, n):
145147
names = [f"{self.var_prefix}-{postfix}" for postfix in postfixes]
146148
return get_unique_names(self.orig_domain, names)
147149

150+
def copy(self):
151+
proj = copy.deepcopy(self.proj)
152+
model = type(self)(proj, self.domain.copy(), self.n_components)
153+
model.pre_domain = self.pre_domain.copy()
154+
model.name = self.name
155+
return model
156+
148157

149158
class LinearProjector(Projector):
150159
name = "Linear Projection"

Orange/widgets/tests/base.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -857,10 +857,13 @@ def _compare_selected_annotated_domains(self, selected, annotated):
857857
annotated_vars = annotated.domain.variables
858858
self.assertLessEqual(set(selected_vars), set(annotated_vars))
859859

860-
def test_setup_graph(self):
860+
def test_setup_graph(self, timeout=DEFAULT_TIMEOUT):
861861
"""Plot should exist after data has been sent in order to be
862862
properly set/updated"""
863863
self.send_signal(self.widget.Inputs.data, self.data)
864+
if self.widget.isBlocking():
865+
spy = QSignalSpy(self.widget.blockingStateChanged)
866+
self.assertTrue(spy.wait(timeout))
864867
self.assertIsNotNone(self.widget.graph.scatterplot_item)
865868

866869
def test_default_attrs(self, timeout=DEFAULT_TIMEOUT):
@@ -1013,12 +1016,18 @@ def test_invalidated_embedding(self, timeout=DEFAULT_TIMEOUT):
10131016
self.widget.graph.update_coordinates.assert_not_called()
10141017
self.widget.graph.update_point_props.assert_called_once()
10151018

1016-
def test_saved_selection(self):
1019+
def test_saved_selection(self, timeout=DEFAULT_TIMEOUT):
10171020
self.send_signal(self.widget.Inputs.data, self.data)
1021+
if self.widget.isBlocking():
1022+
spy = QSignalSpy(self.widget.blockingStateChanged)
1023+
self.assertTrue(spy.wait(timeout))
10181024
self.widget.graph.select_by_indices(list(range(0, len(self.data), 10)))
10191025
settings = self.widget.settingsHandler.pack_data(self.widget)
10201026
w = self.create_widget(self.widget.__class__, stored_settings=settings)
10211027
self.send_signal(self.widget.Inputs.data, self.data, widget=w)
1028+
if w.isBlocking():
1029+
spy = QSignalSpy(w.blockingStateChanged)
1030+
self.assertTrue(spy.wait(timeout))
10221031
self.assertEqual(np.sum(w.graph.selection), 15)
10231032
np.testing.assert_equal(self.widget.graph.selection, w.graph.selection)
10241033

0 commit comments

Comments
 (0)