Skip to content

Commit 2076142

Browse files
committed
OWMosaicDisplay: data info displayed in the status bar
1 parent 3f4c786 commit 2076142

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

Orange/widgets/visualize/owmosaic.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
ANNOTATED_DATA_SIGNAL_NAME)
2828
from Orange.widgets.utils.itemmodels import DomainModel
2929
from Orange.widgets.utils.widgetpreview import WidgetPreview
30+
from Orange.widgets.utils.state_summary import (format_multiple_summaries,
31+
format_summary_details)
3032
from Orange.widgets.visualize.utils import (
3133
CanvasText, CanvasRectangle, ViewWithPress, VizRankDialog)
3234
from Orange.widgets.visualize.utils.plotutils import wrap_legend_items
@@ -332,6 +334,9 @@ def __init__(self):
332334
self.canvas_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
333335
self.canvas_view.setRenderHint(QPainter.Antialiasing)
334336

337+
self.info.set_input_summary(self.info.NoInput)
338+
self.info.set_output_summary(self.info.NoOutput)
339+
335340
box = gui.vBox(self.controlArea, box=True)
336341
self.model_1 = DomainModel(
337342
order=DomainModel.MIXED, valid_types=DomainModel.PRIMITIVE)
@@ -467,10 +472,26 @@ def handleNewSignals(self):
467472
self.__pending_selection = None
468473
else:
469474
self.selection = set()
475+
self._set_input_summary()
470476
self.set_color_data()
471477
self.update_graph()
472478
self.send_selection()
473479

480+
def _set_input_summary(self):
481+
n_data = len(self.data) if self.data else 0
482+
n_subset = len(self.subset_data) if self.subset_data else 0
483+
484+
summary, details, kwargs = self.info.NoInput, "", {}
485+
if self.data or self.subset_data:
486+
summary = f"{self.info.format_number(n_data)}, " \
487+
f"{self.info.format_number(n_subset)}"
488+
kwargs = {"format": Qt.RichText}
489+
details = format_multiple_summaries([
490+
("Data", self.data),
491+
("Data subset", self.subset_data)
492+
])
493+
self.info.set_input_summary(summary, details, **kwargs)
494+
474495
def clear_selection(self):
475496
self.selection = set()
476497
self.update_selection_rects()
@@ -516,6 +537,7 @@ def send_selection(self):
516537
self.Outputs.selected_data.send(None)
517538
self.Outputs.annotated_data.send(
518539
create_annotated_table(self.data, []))
540+
self.info.set_output_summary(self.info.NoOutput)
519541
return
520542
filters = []
521543
self.Warning.no_cont_selection_sql.clear()
@@ -537,6 +559,10 @@ def send_selection(self):
537559
sel_idx = [i for i, id in enumerate(self.data.ids) if id in idset]
538560
if self.discrete_data is not self.data:
539561
selection = self.data[sel_idx]
562+
563+
summary = len(selection) if selection else self.info.NoOutput
564+
details = format_summary_details(selection) if selection else ""
565+
self.info.set_output_summary(summary, details)
540566
self.Outputs.selected_data.send(selection)
541567
self.Outputs.annotated_data.send(
542568
create_annotated_table(self.data, sel_idx))
@@ -992,5 +1018,5 @@ def get_conditional_distribution(data, attrs):
9921018

9931019

9941020
if __name__ == "__main__": # pragma: no cover
995-
data = Table("zoo")
996-
WidgetPreview(OWMosaicDisplay).run(data, set_subset_data=data[::10])
1021+
dataset = Table("zoo")
1022+
WidgetPreview(OWMosaicDisplay).run(dataset, set_subset_data=dataset[::10])

Orange/widgets/visualize/tests/test_owmosaic.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from Orange.widgets.tests.base import WidgetTest, WidgetOutputsTestMixin
1414
from Orange.widgets.visualize.owmosaic import OWMosaicDisplay
1515
from Orange.widgets.tests.utils import simulate
16+
from Orange.widgets.utils.state_summary import (format_multiple_summaries,
17+
format_summary_details)
1618

1719

1820
class TestOWMosaicDisplay(WidgetTest, WidgetOutputsTestMixin):
@@ -184,6 +186,54 @@ def test_selection_setting(self):
184186
self.assertEqual(w.selection, {1})
185187
self.assertIsNotNone(self.get_output(w.Outputs.selected_data, widget=w))
186188

189+
def test_summary(self):
190+
"""Check if status bar is updated when data is received"""
191+
info = self.widget.info
192+
data, subset = Table("zoo"), Table("zoo")[::10]
193+
no_input, no_output = "No data on input", "No data on output"
194+
195+
self.send_signal(self.widget.Inputs.data, data)
196+
data_list = [("Data", data), ("Data subset", None)]
197+
summary, details = f"{len(data)}, 0", format_multiple_summaries(data_list)
198+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
199+
self.assertEqual(info._StateInfo__input_summary.details, details)
200+
self.assertEqual(info._StateInfo__output_summary.brief, "")
201+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
202+
203+
self._select_data()
204+
output = self.get_output(self.widget.Outputs.selected_data)
205+
summary, details = f"{len(output)}", format_summary_details(output)
206+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
207+
self.assertEqual(info._StateInfo__output_summary.details, details)
208+
209+
self.send_signal(self.widget.Inputs.data_subset, subset)
210+
data_list = [("Data", data), ("Data subset", subset)]
211+
summary = f"{len(data)}, {len(subset)}"
212+
details = format_multiple_summaries(data_list)
213+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
214+
self.assertEqual(info._StateInfo__input_summary.details, details)
215+
self.assertEqual(info._StateInfo__output_summary.brief, "")
216+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
217+
self._select_data()
218+
output = self.get_output(self.widget.Outputs.selected_data)
219+
summary, details = f"{len(output)}", format_summary_details(output)
220+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
221+
self.assertEqual(info._StateInfo__output_summary.details, details)
222+
223+
self.send_signal(self.widget.Inputs.data, None)
224+
data_list = [("Data", None), ("Data subset", subset)]
225+
summary, details = f"0, {len(subset)}", format_multiple_summaries(data_list)
226+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
227+
self.assertEqual(info._StateInfo__input_summary.details, details)
228+
self.assertEqual(info._StateInfo__output_summary.brief, "")
229+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
230+
231+
self.send_signal(self.widget.Inputs.data_subset, None)
232+
self.assertEqual(info._StateInfo__input_summary.brief, "")
233+
self.assertEqual(info._StateInfo__input_summary.details, no_input)
234+
self.assertEqual(info._StateInfo__output_summary.brief, "")
235+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
236+
187237

188238
# Derive from WidgetTest to simplify creation of the Mosaic widget, although
189239
# we are actually testing the MosaicVizRank dialog and not the widget

0 commit comments

Comments
 (0)