Skip to content

Commit cfb2bc8

Browse files
committed
Tree Viewer: new signals and minor refactoring
1 parent 61ba36c commit cfb2bc8

File tree

2 files changed

+26
-30
lines changed

2 files changed

+26
-30
lines changed

Orange/widgets/visualize/owtreeviewer.py

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
from AnyQt.QtCore import Qt, QPointF, QSizeF, QRectF
1010

1111
from Orange.base import TreeModel, SklModel
12+
from Orange.widgets.utils.signals import Input, Output
1213
from Orange.widgets.visualize.owtreeviewer2d import \
1314
GraphicsNode, GraphicsEdge, OWTreeViewer2D
1415
from Orange.widgets.utils import to_html
1516
from Orange.data import Table
1617

1718
from Orange.widgets.settings import ContextSetting, ClassValuesContextHandler, \
1819
Setting
19-
from Orange.widgets import gui, widget
20+
from Orange.widgets import gui
2021
from Orange.widgets.utils.colorpalette import ContinuousPaletteGenerator
2122
from Orange.widgets.utils.annotated_data import (create_annotated_table,
2223
ANNOTATED_DATA_SIGNAL_NAME)
@@ -158,21 +159,15 @@ class OWTreeGraph(OWTreeViewer2D):
158159
name = "Tree Viewer"
159160
icon = "icons/TreeViewer.svg"
160161
priority = 35
161-
inputs = [
162-
widget.InputSignal(
163-
"Tree", TreeModel, "ctree",
164-
# Had different input names before merging from
165-
# Classification/Regression tree variants
166-
replaces=["Classification Tree", "Regression Tree"])
167-
]
168-
outputs = [
169-
widget.OutputSignal(
170-
"Selected Data", Table, widget.Default, id="selected-data",
171-
),
172-
widget.OutputSignal(
173-
ANNOTATED_DATA_SIGNAL_NAME, Table, id="annotated-data")
174-
]
175162

163+
class Inputs:
164+
# Had different input names before merging from
165+
# Classification/Regression tree variants
166+
tree = Input("Tree", TreeModel, replaces=["Classification Tree", "Regression Tree"])
167+
168+
class Outputs:
169+
selected_data = Output("Selected Data", Table, default=True, id="selected-data")
170+
annotated_data = Output(ANNOTATED_DATA_SIGNAL_NAME, Table, id="annotated-data")
176171

177172
settingsHandler = ClassValuesContextHandler()
178173
target_class_index = ContextSetting(0)
@@ -257,6 +252,7 @@ def toggle_color_reg(self):
257252
self.set_node_info()
258253
self.scene.update()
259254

255+
@Inputs.tree
260256
def ctree(self, model=None):
261257
"""Input signal handler"""
262258
self.clear_scene()
@@ -297,9 +293,8 @@ def ctree(self, model=None):
297293
self.tree_adapter.num_nodes,
298294
len(self.tree_adapter.leaves(self.tree_adapter.root))))
299295
self.setup_scene()
300-
self.send("Selected Data", None)
301-
self.send(ANNOTATED_DATA_SIGNAL_NAME,
302-
create_annotated_table(self.dataset, []))
296+
self.Outputs.selected_data.send(None)
297+
self.Outputs.annotated_data.send(create_annotated_table(self.dataset, []))
303298

304299
def walkcreate(self, node, parent=None):
305300
"""Create a structure of tree nodes from the given model"""
@@ -324,10 +319,9 @@ def update_selection(self):
324319
nodes = [item.node_inst for item in self.scene.selectedItems()
325320
if isinstance(item, TreeNode)]
326321
data = self.tree_adapter.get_instances_in_nodes(nodes)
327-
self.send("Selected Data", data)
328-
self.send(ANNOTATED_DATA_SIGNAL_NAME, create_annotated_table(
329-
self.dataset,
330-
self.tree_adapter.get_indices(nodes)))
322+
self.Outputs.selected_data.send(data)
323+
self.Outputs.annotated_data.send(create_annotated_table(
324+
self.dataset, self.tree_adapter.get_indices(nodes)))
331325

332326
def send_report(self):
333327
if not self.model:

Orange/widgets/visualize/tests/test_owtreegraph.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,18 @@ def _select_data(self):
3838

3939
def test_target_class_changed(self):
4040
"""Check if node content has changed after selecting target class"""
41-
self.send_signal(self.signal_name, self.signal_data)
42-
nodes = self.widget.scene.nodes()
41+
w = self.widget
42+
self.send_signal(w.Inputs.tree, self.signal_data)
43+
nodes = w.scene.nodes()
4344
text = nodes[0].toPlainText()
44-
self.widget.color_combo.activated.emit(1)
45-
self.widget.color_combo.setCurrentIndex(1)
45+
w.color_combo.activated.emit(1)
46+
w.color_combo.setCurrentIndex(1)
4647
self.assertNotEqual(nodes[0].toPlainText(), text)
4748

4849
def test_tree_determinism(self):
4950
"""Check that the tree is drawn identically upon receiving the same
5051
dataset with no parameter changes."""
52+
w = self.widget
5153
n_tries = 10
5254

5355
def _check_all_same(data):
@@ -62,8 +64,8 @@ def _check_all_same(data):
6264
# Make sure the tree are deterministic for iris
6365
scene_nodes = []
6466
for _ in range(n_tries):
65-
self.send_signal(self.signal_name, self.signal_data)
66-
scene_nodes.append([n.pos() for n in self.widget.scene.nodes()])
67+
self.send_signal(w.Inputs.tree, self.signal_data)
68+
scene_nodes.append([n.pos() for n in w.scene.nodes()])
6769
for node_row in zip(*scene_nodes):
6870
self.assertTrue(
6971
_check_all_same(node_row),
@@ -75,8 +77,8 @@ def _check_all_same(data):
7577
# the same entropy
7678
scene_nodes = []
7779
for _ in range(n_tries):
78-
self.send_signal(self.signal_name, self.data_same_entropy)
79-
scene_nodes.append([n.pos() for n in self.widget.scene.nodes()])
80+
self.send_signal(w.Inputs.tree, self.data_same_entropy)
81+
scene_nodes.append([n.pos() for n in w.scene.nodes()])
8082
for node_row in zip(*scene_nodes):
8183
self.assertTrue(
8284
_check_all_same(node_row),

0 commit comments

Comments
 (0)