Skip to content

Commit 746b97f

Browse files
committed
OWApplyDomain: data info displayed in the status bar
1 parent bd2f7ec commit 746b97f

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

Orange/widgets/data/owtransform.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from typing import Optional
22

3+
from AnyQt.QtCore import Qt
4+
35
from Orange.data import Table, Domain
46
from Orange.widgets import gui
57
from Orange.widgets.report.report import describe_data
68
from Orange.widgets.utils.sql import check_sql_input
79
from Orange.widgets.utils.widgetpreview import WidgetPreview
10+
from Orange.widgets.utils.state_summary import format_multiple_summaries, \
11+
format_summary_details
812
from Orange.widgets.widget import OWWidget, Input, Output, Msg
913

1014

@@ -31,6 +35,7 @@ class Error(OWWidget.Error):
3135
def __init__(self):
3236
super().__init__()
3337
self.data = None # type: Optional[Table]
38+
self.template_data = None # type: Optional[Table]
3439
self.template_domain = None # type: Optional[Domain]
3540
self.transformed_info = describe_data(None) # type: OrderedDict
3641

@@ -41,6 +46,9 @@ def __init__(self):
4146
self.set_input_label_text()
4247
self.set_template_label_text()
4348

49+
self.info.set_input_summary(self.info.NoInput)
50+
self.info.set_output_summary(self.info.NoOutput)
51+
4452
def set_input_label_text(self):
4553
text = "No data on input."
4654
if self.data:
@@ -75,8 +83,21 @@ def set_data(self, data):
7583
@check_sql_input
7684
def set_template_data(self, data):
7785
self.template_domain = data and data.domain
86+
self.template_data = data
7887

7988
def handleNewSignals(self):
89+
summary, details, kwargs = self.info.NoInput, "", {}
90+
if self.data or self.template_data:
91+
n_data = len(self.data) if self.data else 0
92+
n_template = len(self.template_data) if self.template_data else 0
93+
summary = f"{self.info.format_number(n_data)}, " \
94+
f"{self.info.format_number(n_template)}"
95+
kwargs = {"format": Qt.RichText}
96+
details = format_multiple_summaries([
97+
("Data", self.data),
98+
("Template data", self.template_data)
99+
])
100+
self.info.set_input_summary(summary, details, **kwargs)
80101
self.apply()
81102

82103
def apply(self):
@@ -89,6 +110,9 @@ def apply(self):
89110
self.Error.error(ex)
90111

91112
data = transformed_data
113+
summary = len(data) if data else self.info.NoOutput
114+
details = format_summary_details(data) if data else ""
115+
self.info.set_output_summary(summary, details)
92116
self.transformed_info = describe_data(data)
93117
self.Outputs.transformed_data.send(data)
94118
self.set_template_label_text()

Orange/widgets/data/tests/test_owtransform.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Test methods with long descriptive names can omit docstrings
2-
# pylint: disable=missing-docstring
2+
# pylint: disable=missing-docstring, protected-access
33
from unittest.mock import Mock
44

55
from numpy import testing as npt
@@ -9,6 +9,8 @@
99
from Orange.widgets.data.owtransform import OWTransform
1010
from Orange.widgets.tests.base import WidgetTest
1111
from Orange.widgets.unsupervised.owpca import OWPCA
12+
from Orange.widgets.utils.state_summary import format_summary_details, \
13+
format_multiple_summaries
1214

1315

1416
class TestOWTransform(WidgetTest):
@@ -19,6 +21,8 @@ def setUp(self):
1921

2022
def test_output(self):
2123
# send data and template data
24+
info = self.widget.info
25+
no_input, no_output = "No data on input", "No data on output"
2226
self.send_signal(self.widget.Inputs.data, self.data[::15])
2327
self.send_signal(self.widget.Inputs.template_data, self.disc_data)
2428
output = self.get_output(self.widget.Outputs.transformed_data)
@@ -29,6 +33,14 @@ def test_output(self):
2933
self.widget.template_label.text())
3034
self.assertEqual("Output data includes 4 features.",
3135
self.widget.output_label.text())
36+
data_list = [("Data", self.data[::15]), ("Template data", self.disc_data)]
37+
summary, details = "10, 150", format_multiple_summaries(data_list)
38+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
39+
self.assertEqual(info._StateInfo__input_summary.details, details)
40+
summary, details = "10", format_summary_details(output)
41+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
42+
self.assertEqual(info._StateInfo__output_summary.details, details)
43+
3244

3345
# remove template data
3446
self.send_signal(self.widget.Inputs.template_data, None)
@@ -39,6 +51,12 @@ def test_output(self):
3951
self.assertEqual("No template data on input.",
4052
self.widget.template_label.text())
4153
self.assertEqual("", self.widget.output_label.text())
54+
data_list = [("Data", self.data[::15]), ("Template data", None)]
55+
summary, details = "10, 0", format_multiple_summaries(data_list)
56+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
57+
self.assertEqual(info._StateInfo__input_summary.details, details)
58+
self.assertEqual(info._StateInfo__output_summary.brief, "")
59+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
4260

4361
# send template data
4462
self.send_signal(self.widget.Inputs.template_data, self.disc_data)
@@ -59,13 +77,23 @@ def test_output(self):
5977
self.assertEqual("Template data includes 4 features.",
6078
self.widget.template_label.text())
6179
self.assertEqual("", self.widget.output_label.text())
80+
data_list = [("Data", None), ("Template data", self.disc_data)]
81+
summary, details = "0, 150", format_multiple_summaries(data_list)
82+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
83+
self.assertEqual(info._StateInfo__input_summary.details, details)
84+
self.assertEqual(info._StateInfo__output_summary.brief, "")
85+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
6286

6387
# remove template data
6488
self.send_signal(self.widget.Inputs.template_data, None)
6589
self.assertEqual("No data on input.", self.widget.input_label.text())
6690
self.assertEqual("No template data on input.",
6791
self.widget.template_label.text())
6892
self.assertEqual("", self.widget.output_label.text())
93+
self.assertEqual(info._StateInfo__input_summary.brief, "")
94+
self.assertEqual(info._StateInfo__input_summary.details, no_input)
95+
self.assertEqual(info._StateInfo__output_summary.brief, "")
96+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
6997

7098
def assertTableEqual(self, table1, table2):
7199
self.assertIs(table1.domain, table2.domain)

0 commit comments

Comments
 (0)