Skip to content

Commit 3353676

Browse files
committed
Data sets: Disable combos when filter overrides them
1 parent 3ce867f commit 3353676

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

Orange/widgets/data/owdatasets.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
GENERAL_DOMAIN = None
4242
ALL_DOMAINS = "" # The setting is Optional[str], so don't use other types here
4343

44+
# The number of characters at which filter overrides the domain and language
45+
FILTER_OVERRIDE_LENGTH = 4
46+
4447

4548
def ensure_local(index_url, file_path, local_cache_path,
4649
force=False, progress_advance=None):
@@ -180,7 +183,7 @@ def filterAcceptsRow(self, row, parent):
180183
data = source.index(row, 0).data(Qt.UserRole)
181184
in_filter = (
182185
self.__filter is not None
183-
and len(self.__filter) >= 4
186+
and len(self.__filter) >= FILTER_OVERRIDE_LENGTH
184187
and self.__filter in data.title.casefold()
185188
)
186189
published_ok = data.publication_status == Namespace.PUBLISHED
@@ -190,7 +193,6 @@ def filterAcceptsRow(self, row, parent):
190193
and (published_ok and domain_ok and language_ok
191194
or in_filter))
192195

193-
194196
class OWDataSets(OWWidget):
195197
name = "Datasets"
196198
description = "Load a dataset from an online repository"
@@ -276,8 +278,13 @@ def __init__(self):
276278
"Typing four letters or more overrides domain and language filters")
277279
layout.addWidget(self.filterLineEdit)
278280

281+
self.combo_elements = []
282+
279283
layout.addSpacing(20)
280-
layout.addWidget(QLabel("Show data sets in "))
284+
label = QLabel("Show data sets in ")
285+
layout.addWidget(label)
286+
self.combo_elements.append(label)
287+
281288
lang_combo = self.language_combo = QComboBox()
282289
languages = [self.DEFAULT_LANG, self.ALL_LANGUAGES]
283290
if self.language is not None and self.language not in languages:
@@ -289,14 +296,19 @@ def __init__(self):
289296
lang_combo.setCurrentText(self.language)
290297
lang_combo.activated.connect(self._on_language_changed)
291298
layout.addWidget(lang_combo)
299+
self.combo_elements.append(lang_combo)
292300

293301
layout.addSpacing(20)
294-
layout.addWidget(QLabel("Domain:"))
302+
label = QLabel("Domain:")
303+
layout.addWidget(label)
304+
self.combo_elements.append(label)
305+
295306
domain_combo = self.domain_combo = QComboBox()
296307
domain_combo.addItem(self.GENERAL_DOMAIN_LABEL)
297308
domain_combo.activated.connect(self._on_domain_changed)
298309
if self.core_widget:
299310
layout.addWidget(domain_combo)
311+
self.combo_elements.append(domain_combo)
300312

301313
self.mainArea.layout().addLayout(layout)
302314

@@ -494,17 +506,20 @@ def update_model(self):
494506
self.domain = datainfo.domain
495507
if self.domain == "sc": # domain from the list of ignored domain
496508
self.domain = ALL_DOMAINS
497-
combo = self.domain_combo
498-
if self.domain == GENERAL_DOMAIN:
499-
combo.setCurrentIndex(0)
500-
elif self.domain == ALL_DOMAINS:
501-
combo.setCurrentIndex(combo.count() - 1)
502-
else:
503-
combo.setCurrentText(self.domain)
509+
self.__update_domain_combo()
504510
self._on_domain_changed()
505511

506512
return model, current_index
507513

514+
def __update_domain_combo(self):
515+
combo = self.domain_combo
516+
if self.domain == GENERAL_DOMAIN:
517+
combo.setCurrentIndex(0)
518+
elif self.domain == ALL_DOMAINS:
519+
combo.setCurrentIndex(combo.count() - 1)
520+
else:
521+
combo.setCurrentText(self.domain)
522+
508523
def _on_language_changed(self):
509524
combo = self.language_combo
510525
if combo.currentIndex() == combo.count() - 1:
@@ -622,6 +637,17 @@ def selected_dataset(self):
622637

623638
def filter(self):
624639
filter_string = self.filterLineEdit.text().strip()
640+
enable_combos = len(filter_string) < FILTER_OVERRIDE_LENGTH
641+
if enable_combos is not self.domain_combo.isEnabled():
642+
for element in self.combo_elements:
643+
element.setEnabled(enable_combos)
644+
if enable_combos:
645+
self.__update_domain_combo()
646+
self.language_combo.setCurrentText(self.language)
647+
else:
648+
self.domain_combo.setCurrentText(self.ALL_DOMAINS_LABEL)
649+
self.language_combo.setCurrentText(self.ALL_LANGUAGES)
650+
625651
self.filter_hint = filter_string
626652
proxyModel = self.view.model()
627653
if proxyModel:

Orange/widgets/data/tests/test_owdatasets.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,27 @@ def test_filter_overrides_language_and_domain(self):
182182
self.wait_until_stop_blocking(w)
183183
w.language_combo.setCurrentText("Slovenščina")
184184
w.language_combo.activated.emit(w.language_combo.currentIndex())
185+
w.domain_combo.setCurrentText(w.GENERAL_DOMAIN_LABEL)
186+
w.domain_combo.activated.emit(w.domain_combo.currentIndex())
185187

186188
self.assertEqual(self.__titles(w), {"Bax data set"})
187189

188190
w.filterLineEdit.setText("data ")
189191
self.assertEqual(self.__titles(w), {"Foo data set",
190192
"Bar data set",
191193
"Bax data set"})
194+
self.assertEqual(w.language_combo.currentText(), w.ALL_LANGUAGES)
195+
self.assertFalse(w.language_combo.isEnabled())
196+
self.assertEqual(w.domain_combo.currentText(), w.ALL_DOMAINS_LABEL)
197+
self.assertFalse(w.domain_combo.isEnabled())
198+
199+
w.filterLineEdit.setText("da")
200+
self.assertEqual(self.__titles(w), {"Bax data set"})
201+
self.assertEqual(w.language_combo.currentText(), "Slovenščina")
202+
self.assertTrue(w.language_combo.isEnabled())
203+
self.assertEqual(w.domain_combo.currentText(), w.GENERAL_DOMAIN_LABEL)
204+
self.assertTrue(w.domain_combo.isEnabled())
205+
192206

193207
w.filterLineEdit.setText("bar d")
194208
self.assertEqual(self.__titles(w), {"Bar data set"})
@@ -211,7 +225,8 @@ def test_filter_overrides_language_and_domain(self):
211225
settings = w.settingsHandler.pack_data(w)
212226
w2 = self.create_widget(OWDataSets, stored_settings=settings)
213227
self.wait_until_stop_blocking(w2)
214-
self.assertEqual(w2.language_combo.currentText(), "English")
228+
self.assertEqual(w2.language_combo.currentText(), w2.ALL_LANGUAGES)
229+
self.assertFalse(w2.language_combo.isEnabled())
215230
self.assertEqual(w2.filterLineEdit.text(), "bax d")
216231
self.assertEqual(self.__titles(w2), {"Bax data set"})
217232

@@ -266,8 +281,8 @@ def test_download_iris(self):
266281
# select the only dataset
267282
sel_type = QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows
268283
w.view.selectionModel().select(w.view.model().index(0, 0), sel_type)
269-
self.assertEqual(w.selected_id, "iris.tab")
270284
w.commit()
285+
self.assertEqual(w.selected_id, "iris.tab")
271286
iris = self.get_output(w.Outputs.data, w)
272287
self.assertEqual(len(iris), 150)
273288

0 commit comments

Comments
 (0)