Skip to content

Commit c103b40

Browse files
committed
OWMergeData: data info displayed in the status bar
1 parent e0f241b commit c103b40

File tree

2 files changed

+62
-17
lines changed

2 files changed

+62
-17
lines changed

Orange/widgets/data/owmergedata.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
from Orange.widgets.utils.itemmodels import DomainModel
1717
from Orange.widgets.utils.sql import check_sql_input
1818
from Orange.widgets.utils.widgetpreview import WidgetPreview
19+
from Orange.widgets.utils.state_summary import format_multiple_summaries, \
20+
format_summary_details
1921
from Orange.widgets.widget import Input, Output, Msg
2022

2123
INSTANCEID = "Instance id"
@@ -315,10 +317,8 @@ def __init__(self):
315317
self.model = DomainModelWithTooltips(content)
316318
self.extra_model = DomainModelWithTooltips(content)
317319

318-
box = gui.hBox(self.controlArea, box=None)
319-
no_info = self.data_info(None)
320-
self.info_box_data = gui.label(box, self, no_info, box="Data")
321-
self.info_box_extra_data = gui.label(box, self, no_info, box="Extra Data")
320+
self.info.set_input_summary(self.info.NoInput)
321+
self.info.set_output_summary(self.info.NoOutput)
322322

323323
grp = gui.radioButtons(
324324
self.controlArea, self, "merging", box="Merging",
@@ -346,14 +346,12 @@ def change_merging(self):
346346
def set_data(self, data):
347347
self.data = data
348348
self.model.set_domain(data and data.domain)
349-
self.info_box_data.setText(self.data_info(data))
350349

351350
@Inputs.extra_data
352351
@check_sql_input
353352
def set_extra_data(self, data):
354353
self.extra_data = data
355354
self.extra_model.set_domain(data and data.domain)
356-
self.info_box_extra_data.setText(self.data_info(data))
357355

358356
def store_combo_state(self):
359357
self.attr_pairs = self.attr_boxes.current_state()
@@ -364,6 +362,20 @@ def handleNewSignals(self):
364362
self.openContext(self.data and self.data.domain,
365363
self.extra_data and self.extra_data.domain)
366364
self.attr_boxes.set_state(self.attr_pairs)
365+
366+
summary, details, kwargs = self.info.NoInput, "", {}
367+
if self.data or self.extra_data:
368+
n_data = len(self.data) if self.data else 0
369+
n_extra_data = len(self.extra_data) if self.extra_data else 0
370+
summary = f"{self.info.format_number(n_data)}, " \
371+
f"{self.info.format_number(n_extra_data)}"
372+
kwargs = {"format": Qt.RichText}
373+
details = format_multiple_summaries([
374+
("Data", self.data),
375+
("Extra data", self.extra_data)
376+
])
377+
self.info.set_input_summary(summary, details, **kwargs)
378+
367379
self.unconditional_commit()
368380

369381
def _find_best_match(self):
@@ -384,20 +396,13 @@ def get_unique_str_metas_names(model_):
384396
n_max_intersect, attr, extra_attr = n_inter, m_a, m_b
385397
return attr, extra_attr
386398

387-
@staticmethod
388-
def data_info(data):
389-
if data is None:
390-
return "No data."
391-
else:
392-
return \
393-
f"{data.name}\n" \
394-
f"{len(data)} instances\n" \
395-
f"{len(data.domain) + len(data.domain.metas)} variables"
396-
397399
def commit(self):
398400
self.clear_messages()
399401
merged = self.merge() if self.data and self.extra_data else None
400402
self.Outputs.data.send(merged)
403+
details = format_summary_details(merged) if merged else ""
404+
summary = len(merged) if merged else self.info.NoOutput
405+
self.info.set_output_summary(summary, details)
401406

402407
def send_report(self):
403408
# pylint: disable=invalid-sequence-index

Orange/widgets/data/tests/test_owmergedata.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
33
# There are never too many tests, so:
4-
# pylint: disable=too-many-lines,too-many-public-methods
4+
# pylint: disable=too-many-lines,too-many-public-methods, protected-access
55
from itertools import chain
66
import unittest
77
from unittest.mock import Mock
@@ -16,6 +16,8 @@
1616
from Orange.widgets.data.owmergedata import OWMergeData, INSTANCEID, INDEX, \
1717
MergeDataContextHandler
1818
from Orange.widgets.tests.base import WidgetTest
19+
from Orange.widgets.utils.state_summary import format_multiple_summaries, \
20+
format_summary_details
1921
from Orange.tests import test_filename
2022

2123

@@ -1019,6 +1021,44 @@ def test_keep_non_duplicate_variables_missing_rows(self):
10191021
self.assertListEqual([m.name for m in merged_data.domain.variables],
10201022
["A", "B", "C"])
10211023

1024+
def test_summary(self):
1025+
"""Check if the status bar is updated when data is received"""
1026+
data = self.dataA
1027+
info = self.widget.info
1028+
no_input, no_output = "No data on input", "No data on output"
1029+
1030+
self.send_signal(self.widget.Inputs.data, data)
1031+
data_list = [("Data", data), ("Extra data", None)]
1032+
summary, details = f"{len(data)}, 0", format_multiple_summaries(data_list)
1033+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1034+
self.assertEqual(info._StateInfo__input_summary.details, details)
1035+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1036+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
1037+
1038+
self.send_signal(self.widget.Inputs.extra_data, data)
1039+
data_list = [("Data", data), ("Extra data", data)]
1040+
summary = f"{len(data)}, {len(data)}"
1041+
details = format_multiple_summaries(data_list)
1042+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1043+
self.assertEqual(info._StateInfo__input_summary.details, details)
1044+
output = self.get_output(self.widget.Outputs.data)
1045+
summary, details = f"{len(output)}", format_summary_details(output)
1046+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
1047+
self.assertEqual(info._StateInfo__output_summary.details, details)
1048+
1049+
self.send_signal(self.widget.Inputs.data, None)
1050+
data_list = [("Data", None), ("Extra data", data)]
1051+
summary, details = f"0, {len(data)}", format_multiple_summaries(data_list)
1052+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1053+
self.assertEqual(info._StateInfo__input_summary.details, details)
1054+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1055+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
1056+
1057+
self.send_signal(self.widget.Inputs.extra_data, None)
1058+
self.assertEqual(info._StateInfo__input_summary.brief, "")
1059+
self.assertEqual(info._StateInfo__input_summary.details, no_input)
1060+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1061+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
10221062

10231063
class MergeDataContextHandlerTest(unittest.TestCase):
10241064
# These units are too small to test individually, so they are tested

0 commit comments

Comments
 (0)