Skip to content

Commit 8b94e4c

Browse files
authored
Merge pull request #2695 from lanzagar/datasets_filter
[ENH] Data Sets: Add filter
2 parents b069855 + f23f069 commit 8b94e4c

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

Orange/widgets/data/owdatasets.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@
1212
from typing import Optional, Dict, Tuple
1313

1414
from AnyQt.QtWidgets import (
15-
QLabel, QTextBrowser, QSplitter, QTreeView,
15+
QLabel, QLineEdit, QTextBrowser, QSplitter, QTreeView,
1616
QStyleOptionViewItem, QStyledItemDelegate, QApplication
1717
)
18-
1918
from AnyQt.QtGui import QStandardItemModel, QStandardItem
2019
from AnyQt.QtCore import (
2120
Qt, QSize, QObject, QThread, QModelIndex, QSortFilterProxyModel,
@@ -26,12 +25,12 @@
2625
from serverfiles import LocalFiles, ServerFiles, sizeformat
2726

2827
import Orange.data
29-
3028
from Orange.misc.environ import data_dir
3129
from Orange.widgets import widget, settings, gui
3230
from Orange.widgets.utils.signals import Output
3331
from Orange.widgets.widget import Msg
3432

33+
3534
INDEX_URL = "http://datasets.orange.biolab.si/"
3635
log = logging.getLogger(__name__)
3736

@@ -141,6 +140,12 @@ def __init__(self):
141140
self.infolabel = QLabel(text="Initializing...\n\n")
142141
box.layout().addWidget(self.infolabel)
143142

143+
gui.widgetLabel(self.mainArea, "Filter")
144+
self.filterLineEdit = QLineEdit(
145+
textChanged=self.filter
146+
)
147+
self.mainArea.layout().addWidget(self.filterLineEdit)
148+
144149
self.splitter = QSplitter(orientation=Qt.Vertical)
145150

146151
self.view = QTreeView(
@@ -150,6 +155,7 @@ def __init__(self):
150155
rootIsDecorated=False,
151156
editTriggers=QTreeView.NoEditTriggers,
152157
)
158+
153159
box = gui.widgetBox(self.splitter, "Description", addToLayout=False)
154160
self.descriptionlabel = QLabel(
155161
wordWrap=True,
@@ -181,7 +187,9 @@ def __init__(self):
181187
model.setHorizontalHeaderLabels(HEADER)
182188
proxy = QSortFilterProxyModel()
183189
proxy.setSourceModel(model)
184-
self.view.setModel(model)
190+
proxy.setFilterKeyColumn(-1)
191+
proxy.setFilterCaseSensitivity(False)
192+
self.view.setModel(proxy)
185193

186194
if self.splitter_state:
187195
self.splitter.restoreState(self.splitter_state)
@@ -294,8 +302,8 @@ def info(prefix, filename):
294302
current_index = i
295303

296304
hs = self.view.header().saveState()
297-
model_ = self.view.model()
298-
self.view.setModel(model)
305+
model_ = self.view.model().sourceModel()
306+
self.view.model().setSourceModel(model)
299307
self.view.header().restoreState(hs)
300308
model_.deleteLater()
301309
model_.setParent(None)
@@ -344,6 +352,12 @@ def selected_dataset(self):
344352
info = None
345353
return info
346354

355+
def filter(self):
356+
filter_string = self.filterLineEdit.text().strip()
357+
proxyModel = self.view.model()
358+
if proxyModel:
359+
proxyModel.setFilterFixedString(filter_string)
360+
347361
def __on_selection(self):
348362
# Main data sets view selection has changed
349363
rows = self.view.selectionModel().selectedRows(0)

Orange/widgets/data/tests/test_owdatasets.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,34 @@
99
class TestOWDataSets(WidgetTest):
1010
@patch("Orange.widgets.data.owdatasets.list_remote",
1111
Mock(side_effect=requests.exceptions.ConnectionError))
12+
@patch("Orange.widgets.data.owdatasets.list_local", Mock(return_value={}))
1213
@patch("Orange.widgets.data.owdatasets.log", Mock())
13-
def test_works_without_internet_connection(self):
14+
def test_no_internet_connection(self):
1415
w = self.create_widget(OWDataSets) # type: OWDataSets
1516
self.assertTrue(w.Error.no_remote_datasets.is_shown())
17+
18+
@patch("Orange.widgets.data.owdatasets.list_remote",
19+
Mock(side_effect=requests.exceptions.ConnectionError))
20+
@patch("Orange.widgets.data.owdatasets.list_local",
21+
Mock(return_value={('core', 'foo.tab'): {}}))
22+
@patch("Orange.widgets.data.owdatasets.log", Mock())
23+
def test_only_local(self):
24+
w = self.create_widget(OWDataSets) # type: OWDataSets
25+
self.assertTrue(w.Warning.only_local_datasets.is_shown())
26+
self.assertEqual(w.view.model().rowCount(), 1)
27+
28+
@patch("Orange.widgets.data.owdatasets.list_remote",
29+
Mock(side_effect=requests.exceptions.ConnectionError))
30+
@patch("Orange.widgets.data.owdatasets.list_local",
31+
Mock(return_value={('core', 'foo.tab'): {},
32+
('core', 'bar.tab'): {}}))
33+
@patch("Orange.widgets.data.owdatasets.log", Mock())
34+
def test_filtering(self):
35+
w = self.create_widget(OWDataSets) # type: OWDataSets
36+
self.assertEqual(w.view.model().rowCount(), 2)
37+
w.filterLineEdit.setText("foo")
38+
self.assertEqual(w.view.model().rowCount(), 1)
39+
w.filterLineEdit.setText("baz")
40+
self.assertEqual(w.view.model().rowCount(), 0)
41+
w.filterLineEdit.setText("")
42+
self.assertEqual(w.view.model().rowCount(), 2)

0 commit comments

Comments
 (0)