Skip to content

Commit 4c9a0aa

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

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

Orange/widgets/data/owmergedata.py

Lines changed: 20 additions & 6 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,19 @@ 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+
if self.data and self.extra_data:
367+
data_list = [("Data", self.data), ("Extra Data", self.extra_data)]
368+
summary = f"{len(self.data)}, {len(self.extra_data)}"
369+
details = format_multiple_summaries(data_list)
370+
self.info.set_input_summary(summary, details, format=Qt.RichText)
371+
elif not self.data and not self.extra_data:
372+
self.info.set_input_summary(self.info.NoInput)
373+
else:
374+
summary = len(self.data) if self.data else len(self.extra_data)
375+
details = format_summary_details(self.data if self.data else self.extra_data)
376+
self.info.set_input_summary(summary, details)
377+
367378
self.unconditional_commit()
368379

369380
def _find_best_match(self):
@@ -398,6 +409,9 @@ def commit(self):
398409
self.clear_messages()
399410
merged = self.merge() if self.data and self.extra_data else None
400411
self.Outputs.data.send(merged)
412+
details = format_summary_details(merged) if merged else ""
413+
summary = len(merged) if merged else self.info.NoOutput
414+
self.info.set_output_summary(summary, details)
401415

402416
def send_report(self):
403417
# pylint: disable=invalid-sequence-index

Orange/widgets/data/tests/test_owmergedata.py

Lines changed: 43 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,46 @@ 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+
NoInput, NoOutput = "No data on input", "No data on output"
1029+
self.assertEqual(info._StateInfo__input_summary.brief, "")
1030+
self.assertEqual(info._StateInfo__input_summary.details, NoInput)
1031+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1032+
self.assertEqual(info._StateInfo__output_summary.details, NoOutput)
1033+
1034+
self.send_signal(self.widget.Inputs.data, data)
1035+
summary, details = f"{len(data)}", format_summary_details(data)
1036+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1037+
self.assertEqual(info._StateInfo__input_summary.details, details)
1038+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1039+
self.assertEqual(info._StateInfo__output_summary.details, NoOutput)
1040+
1041+
self.send_signal(self.widget.Inputs.extra_data, self.dataA)
1042+
data_list = [("Data", data), ("Extra Data", data)]
1043+
summary = f"{len(data)}, {len(data)}"
1044+
details = format_multiple_summaries(data_list)
1045+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1046+
self.assertEqual(info._StateInfo__input_summary.details, details)
1047+
output = self.get_output(self.widget.Outputs.data)
1048+
summary, details = f"{len(output)}", format_summary_details(output)
1049+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
1050+
self.assertEqual(info._StateInfo__output_summary.details, details)
1051+
1052+
self.send_signal(self.widget.Inputs.data, None)
1053+
summary, details = f"{len(data)}", format_summary_details(data)
1054+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
1055+
self.assertEqual(info._StateInfo__input_summary.details, details)
1056+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1057+
self.assertEqual(info._StateInfo__output_summary.details, NoOutput)
1058+
1059+
self.send_signal(self.widget.Inputs.extra_data, None)
1060+
self.assertEqual(info._StateInfo__input_summary.brief, "")
1061+
self.assertEqual(info._StateInfo__input_summary.details, NoInput)
1062+
self.assertEqual(info._StateInfo__output_summary.brief, "")
1063+
self.assertEqual(info._StateInfo__output_summary.details, NoOutput)
10221064

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

0 commit comments

Comments
 (0)