Skip to content

Commit 23dd2e4

Browse files
committed
autotune: improve combo box to be searchable
1 parent 985a607 commit 23dd2e4

2 files changed

Lines changed: 46 additions & 6 deletions

File tree

autotune/data_selection_window.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import numpy as np
88

99
from data_extractor import DataExtractor
10+
from searchable_combo_box import SearchableComboBox
1011

1112
class DataSelectionWindow(QDialog):
1213
def __init__(self, filename):
@@ -39,15 +40,11 @@ def __init__(self, filename):
3940
self.combo_preset.currentIndexChanged.connect(self.selectPreset)
4041
in_out_group.addRow(QLabel("Preset:"), self.combo_preset)
4142

42-
self.combo_u = QComboBox()
43-
self.combo_u.setEditable(True)
44-
self.combo_u.setInsertPolicy(QComboBox.NoInsert)
43+
self.combo_u = SearchableComboBox()
4544
self.combo_u.currentIndexChanged.connect(self.selectUData)
4645
in_out_group.addRow(QLabel("Input:"), self.combo_u)
4746

48-
self.combo_y = QComboBox()
49-
self.combo_y.setEditable(True)
50-
self.combo_y.setInsertPolicy(QComboBox.NoInsert)
47+
self.combo_y = SearchableComboBox()
5148
self.combo_y.currentIndexChanged.connect(self.selectYData)
5249
in_out_group.addRow(QLabel("Output:"), self.combo_y)
5350
top_group.addLayout(in_out_group)

autotune/searchable_combo_box.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from PyQt5.QtCore import Qt, QSortFilterProxyModel
2+
from PyQt5.QtWidgets import QComboBox, QCompleter
3+
4+
class SearchableComboBox(QComboBox):
5+
def __init__(self, parent=None):
6+
super(SearchableComboBox, self).__init__(parent)
7+
8+
self.setFocusPolicy(Qt.ClickFocus)
9+
self.setEditable(True)
10+
11+
# prevent insertions into combobox
12+
self.setInsertPolicy(QComboBox.NoInsert)
13+
14+
# filter model for matching items
15+
self.pFilterModel = QSortFilterProxyModel(self)
16+
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
17+
self.pFilterModel.setSourceModel(self.model())
18+
19+
# completer that uses filter model
20+
self.completer = QCompleter(self.pFilterModel, self)
21+
self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
22+
self.setCompleter(self.completer)
23+
24+
# connect signals
25+
self.lineEdit().textEdited[str].connect(self.pFilterModel.setFilterFixedString)
26+
self.completer.activated.connect(self.on_completer_activated)
27+
28+
def on_completer_activated(self, text):
29+
if text:
30+
index = self.findText(text)
31+
self.setCurrentIndex(index)
32+
self.activated[str].emit(self.itemText(index))
33+
34+
def setModel(self, model):
35+
super(SearchableComboBox, self).setModel(model)
36+
self.pFilterModel.setSourceModel(model)
37+
self.completer.setModel(self.pFilterModel)
38+
39+
def setModelColumn(self, column):
40+
self.completer.setCompletionColumn(column)
41+
self.pFilterModel.setFilterKeyColumn(column)
42+
super(SearchableComboBox, self).setModelColumn(column)
43+

0 commit comments

Comments
 (0)