Skip to content

Commit 163485e

Browse files
authored
Merge pull request #4595 from aturanjanin/owselectbydataindex
[ENH] SelectByDataIndex: data info displayed in the status bar
2 parents 4ad7608 + 20778de commit 163485e

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

Orange/widgets/data/owselectbydataindex.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import numpy as np
22

3+
from AnyQt.QtCore import Qt
4+
35
from Orange.data import Table
46
from Orange.widgets import widget, gui
57
from Orange.widgets.utils import itemmodels
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_summary_details, \
11+
format_multiple_summaries
812
from Orange.widgets.widget import Input, Output
913
from Orange.widgets.utils.annotated_data import (create_annotated_table)
1014

@@ -49,6 +53,9 @@ def __init__(self):
4953
self.infoBoxExtraData = gui.label(
5054
box, self, self.data_info_text(None), box="Data Subset")
5155

56+
self.info.set_input_summary(self.info.NoInput)
57+
self.info.set_output_summary(self.info.NoOutput)
58+
5259
@Inputs.data
5360
@check_sql_input
5461
def set_data(self, data):
@@ -62,6 +69,19 @@ def set_data_subset(self, data):
6269
self.infoBoxExtraData.setText(self.data_info_text(data))
6370

6471
def handleNewSignals(self):
72+
summary, details, kwargs = self.info.NoInput, "", {}
73+
if self.data or self.data_subset:
74+
n_data = len(self.data) if self.data else 0
75+
n_data_subset = len(self.data_subset) if self.data_subset else 0
76+
summary = f"{self.info.format_number(n_data)}, " \
77+
f"{self.info.format_number(n_data_subset)}"
78+
kwargs = {"format": Qt.RichText}
79+
details = format_multiple_summaries([
80+
("Data", self.data),
81+
("Data subset", self.data_subset)
82+
])
83+
self.info.set_input_summary(summary, details, **kwargs)
84+
6585
self._invalidate()
6686

6787
@staticmethod
@@ -89,6 +109,10 @@ def commit(self):
89109
matching_output = self.data[row_sel]
90110
non_matching_output = self.data[~row_sel]
91111
annotated_output = create_annotated_table(self.data, row_sel)
112+
113+
summary = self.info.NoOutput if matching_output is None else len(matching_output)
114+
details = "" if matching_output is None else format_summary_details(matching_output)
115+
self.info.set_output_summary(summary, details)
92116
self.Outputs.matching_data.send(matching_output)
93117
self.Outputs.non_matching_data.send(non_matching_output)
94118
self.Outputs.annotated_data.send(annotated_output)

Orange/widgets/data/tests/test_owselectbydataindex.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
# pylint: disable=protected-access
12
from Orange.data import Table, Domain
23
from Orange.widgets.data.owselectbydataindex import OWSelectByDataIndex
34
from Orange.widgets.tests.base import WidgetTest
45
from Orange.widgets.utils.annotated_data import ANNOTATED_DATA_FEATURE_NAME
6+
from Orange.widgets.utils.state_summary import format_summary_details, \
7+
format_multiple_summaries
58

69

710
class TestOWSelectSubset(WidgetTest):
@@ -43,3 +46,42 @@ def test_subset_nosubset(self):
4346
self.assertTrue(self.widget.Warning.instances_not_matching.is_shown())
4447
self.assertEqual([], list(matching))
4548
self.assertEqual(list(data), list(non_matching))
49+
50+
def test_summary(self):
51+
"""Check if the status bar is updated when data is received"""
52+
data = Table("iris")
53+
info = self.widget.info
54+
no_input, no_output = "No data on input", "No data on output"
55+
56+
self.send_signal(self.widget.Inputs.data, data)
57+
data_list = [("Data", data), ("Data subset", None)]
58+
summary, details = f"{len(data)}, 0", format_multiple_summaries(data_list)
59+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
60+
self.assertEqual(info._StateInfo__input_summary.details, details)
61+
self.assertEqual(info._StateInfo__output_summary.brief, "0")
62+
63+
self.send_signal(self.widget.Inputs.data_subset, data)
64+
data_list = [("Data", data), ("Data subset", data)]
65+
summary = f"{len(data)}, {len(data)}"
66+
details = format_multiple_summaries(data_list)
67+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
68+
self.assertEqual(info._StateInfo__input_summary.details, details)
69+
output = self.get_output(self.widget.Outputs.matching_data)
70+
summary, details = f"{len(output)}", format_summary_details(output)
71+
self.assertEqual(info._StateInfo__output_summary.brief, summary)
72+
self.assertEqual(info._StateInfo__output_summary.details, details)
73+
74+
self.send_signal(self.widget.Inputs.data, None)
75+
data_list = [("Data", None), ("Data subset", data)]
76+
summary, details = f"0, {len(data)}", format_multiple_summaries(
77+
data_list)
78+
self.assertEqual(info._StateInfo__input_summary.brief, summary)
79+
self.assertEqual(info._StateInfo__input_summary.details, details)
80+
self.assertEqual(info._StateInfo__output_summary.brief, "")
81+
self.assertEqual(info._StateInfo__output_summary.details, no_output)
82+
83+
self.send_signal(self.widget.Inputs.data_subset, None)
84+
self.assertEqual(info._StateInfo__input_summary.brief, "")
85+
self.assertEqual(info._StateInfo__input_summary.details, no_input)
86+
self.assertEqual(info._StateInfo__output_summary.brief, "")
87+
self.assertEqual(info._StateInfo__output_summary.details, no_output)

0 commit comments

Comments
 (0)