Skip to content

Commit df63250

Browse files
committed
VariablesSelection: Do not plot embedding until VariableSelection is initialized
1 parent 1e8a286 commit df63250

File tree

6 files changed

+32
-13
lines changed

6 files changed

+32
-13
lines changed

Orange/widgets/utils/itemmodels.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ class PyListModel(QAbstractListModel):
496496
"""
497497
MIME_TYPE = "application/x-Orange-PyListModelData"
498498
Separator = object()
499+
moved = Signal()
499500

500501
def __init__(self, iterable=None, parent=None,
501502
flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled,
@@ -616,6 +617,7 @@ def removeRows(self, row, count, parent=QModelIndex()):
616617
"""
617618
if not parent.isValid():
618619
del self[row:row + count]
620+
self.moved.emit()
619621
return True
620622
else:
621623
return False

Orange/widgets/utils/plot/owplotgui.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from AnyQt.QtWidgets import QWidget, QToolButton, QVBoxLayout, QHBoxLayout, QGridLayout, QMenu, QAction,\
3939
QDialog, QSizePolicy, QPushButton, QListView, QLabel
4040
from AnyQt.QtGui import QIcon, QKeySequence
41-
from AnyQt.QtCore import Qt, pyqtSignal, QPoint, QSize
41+
from AnyQt.QtCore import Qt, pyqtSignal, QPoint, QSize, QObject
4242

4343
from .owconstants import NOTHING, ZOOMING, SELECT, SELECT_POLYGON, PANNING, SELECTION_ADD,\
4444
SELECTION_REMOVE, SELECTION_TOGGLE, SELECTION_REPLACE
@@ -49,6 +49,8 @@
4949

5050

5151
class AddVariablesDialog(QDialog):
52+
add = pyqtSignal()
53+
5254
def __init__(self, master, model):
5355
QDialog.__init__(self)
5456

@@ -131,10 +133,16 @@ def add_variables(self):
131133
del model[i]
132134

133135
self.master.model_selected.extend(variables)
136+
self.add.emit()
137+
134138

139+
class VariablesSelection(QObject):
140+
added = pyqtSignal()
141+
removed = pyqtSignal()
135142

136-
class VariablesSelection:
137-
def __init__(self, master, model_selected, model_other, widget=None):
143+
def __init__(self, master, model_selected, model_other,
144+
widget=None, parent=None):
145+
super().__init__(parent)
138146
self.master = master
139147
self.model_selected = model_selected
140148
self.model_other = model_other
@@ -194,9 +202,11 @@ def __deactivate_selection(self):
194202
del model[i]
195203

196204
self.model_other.extend(variables)
205+
self.removed.emit()
197206

198207
def _action_add(self):
199208
self.add_variables_dialog = AddVariablesDialog(self, self.model_other)
209+
self.add_variables_dialog.add.connect(lambda: self.added.emit())
200210

201211

202212
class OrientedWidget(QWidget):

Orange/widgets/visualize/owlinearprojection.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,7 @@ class Error(OWAnchorProjectionWidget.Error):
270270

271271
def __init__(self):
272272
self.model_selected = VariableListModel(enable_dnd=True)
273-
self.model_selected.rowsInserted.connect(self.__model_selected_changed)
274-
self.model_selected.rowsRemoved.connect(self.__model_selected_changed)
273+
self.model_selected.moved.connect(self.__model_selected_changed)
275274
self.model_other = VariableListModel(enable_dnd=True)
276275

277276
self.vizrank, self.btn_vizrank = LinearProjectionVizRank.add_vizrank(
@@ -295,6 +294,8 @@ def _add_controls_variables(self):
295294
self.variables_selection = VariablesSelection(
296295
self, self.model_selected, self.model_other, self.controlArea
297296
)
297+
self.variables_selection.added.connect(self.__model_selected_changed)
298+
self.variables_selection.removed.connect(self.__model_selected_changed)
298299
self.variables_selection.add_remove.layout().addWidget(
299300
self.btn_vizrank
300301
)
@@ -327,6 +328,7 @@ def __vizrank_set_attrs(self, attrs):
327328
self.model_selected[:] = attrs[:]
328329
self.model_other[:] = [var for var in self.continuous_variables
329330
if var not in attrs]
331+
self.__model_selected_changed()
330332

331333
def __model_selected_changed(self):
332334
self.selected_vars = [(var.name, vartype(var)) for var
@@ -367,6 +369,7 @@ def set_data(self, data):
367369

368370
self._check_options()
369371
self._init_vizrank()
372+
self.init_projection()
370373

371374
def _check_options(self):
372375
buttons = self.radio_placement.buttons
@@ -422,8 +425,6 @@ def init_attr_values(self):
422425
self.selected_vars = []
423426

424427
def init_projection(self):
425-
if not len(self.effective_variables):
426-
return
427428
if self.placement == self.Placement.Circular:
428429
self.projector = CircularPlacement()
429430
elif self.placement == self.Placement.LDA:

Orange/widgets/visualize/owradviz.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,7 @@ class Error(OWAnchorProjectionWidget.Error):
286286

287287
def __init__(self):
288288
self.model_selected = VariableListModel(enable_dnd=True)
289-
self.model_selected.rowsInserted.connect(self.__model_selected_changed)
290-
self.model_selected.rowsRemoved.connect(self.__model_selected_changed)
289+
self.model_selected.moved.connect(self.__model_selected_changed)
291290
self.model_other = VariableListModel(enable_dnd=True)
292291

293292
self.vizrank, self.btn_vizrank = RadvizVizRank.add_vizrank(
@@ -299,6 +298,8 @@ def _add_controls(self):
299298
self.variables_selection = VariablesSelection(
300299
self, self.model_selected, self.model_other, self.controlArea
301300
)
301+
self.variables_selection.added.connect(self.__model_selected_changed)
302+
self.variables_selection.removed.connect(self.__model_selected_changed)
302303
self.variables_selection.add_remove.layout().addWidget(
303304
self.btn_vizrank
304305
)
@@ -324,6 +325,7 @@ def __vizrank_set_attrs(self, attrs):
324325
self.model_selected[:] = attrs[:]
325326
self.model_other[:] = [var for var in self.primitive_variables
326327
if var not in attrs]
328+
self.__model_selected_changed()
327329

328330
def __model_selected_changed(self):
329331
self.selected_vars = [(var.name, vartype(var)) for var
@@ -358,6 +360,7 @@ def set_data(self, data):
358360
self.model_other[:] = variables[5:] + class_var
359361

360362
self._init_vizrank()
363+
self.init_projection()
361364

362365
def _init_vizrank(self):
363366
is_enabled = self.data is not None and \

Orange/widgets/visualize/tests/test_owlinearprojection.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,6 @@ class LinProjVizRankTests(WidgetTest):
169169
def setUpClass(cls):
170170
super().setUpClass()
171171
cls.data = Table("iris")
172-
# dom = Domain(cls.iris.domain.attributes, [])
173-
# cls.iris_no_class = Table(dom, cls.iris)
174172

175173
def setUp(self):
176174
self.widget = self.create_widget(OWLinearProjection)
@@ -192,6 +190,7 @@ def test_continuous_class(self):
192190
def test_set_attrs(self):
193191
self.send_signal(self.widget.Inputs.data, self.data)
194192
model_selected = self.widget.model_selected[:]
193+
c1 = self.get_output(self.widget.Outputs.components)
195194
self.vizrank.toggle()
196195
self.process_events(until=lambda: not self.vizrank.keep_running)
197196
self.assertEqual(len(self.vizrank.scores), self.vizrank.state_count())
@@ -200,3 +199,5 @@ def test_set_attrs(self):
200199
QItemSelectionModel.ClearAndSelect
201200
)
202201
self.assertNotEqual(self.widget.model_selected[:], model_selected)
202+
c2 = self.get_output(self.widget.Outputs.components)
203+
self.assertNotEqual(c1.domain.attributes, c2.domain.attributes)

Orange/widgets/visualize/tests/test_owradviz.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,12 @@ def test_not_enough_instances(self):
6363
def test_saved_features(self):
6464
self.send_signal(self.widget.Inputs.data, self.data)
6565
self.widget.model_selected.pop(0)
66+
self.widget.variables_selection.removed.emit()
67+
selected = [a.name for a in self.widget.model_selected]
68+
6669
settings = self.widget.settingsHandler.pack_data(self.widget)
6770
w = self.create_widget(OWRadviz, stored_settings=settings)
68-
self.send_signal(self.widget.Inputs.data, self.data, widget=w)
69-
selected = [a.name for a in self.widget.model_selected]
71+
self.send_signal(w.Inputs.data, self.data, widget=w)
7072
self.assertListEqual(selected, [a.name for a in w.model_selected])
7173
self.send_signal(self.widget.Inputs.data, self.heart_disease)
7274
selected = [a.name for a in self.widget.model_selected]

0 commit comments

Comments
 (0)