Source code for cgl.ui.widgets.combo
from PySide6 import QtCore, QtWidgets
from cgl.ui.widgets.button import LJButton
[docs]
class LabelComboRow(QtWidgets.QVBoxLayout):
def __init__(self, label, button=True, bold=True, text=""):
QtWidgets.QVBoxLayout.__init__(self)
if bold:
self.label = QtWidgets.QLabel("<b>%s</b>" % label)
else:
self.label = QtWidgets.QLabel("%s" % label)
self.combo = AdvComboBox()
self.h_layout = QtWidgets.QHBoxLayout()
self.h_layout.addWidget(self.label)
self.h_layout.addWidget(self.combo)
if button:
self.button = button
self.add_button = LJButton
if not text:
self.add_button.setText("+")
else:
self.add_button.setText(text)
self.h_layout.addWidget(self.add_button)
self.addLayout(self.h_layout)
# self.addWidget(self.combo)
else:
self.h_layout.addWidget(self.combo)
self.addLayout(self.h_layout)
[docs]
def hide(self):
self.label.hide()
self.combo.hide()
if self.button:
self.add_button.hide()
[docs]
def show(self):
self.label.show()
self.combo.show()
if self.button:
self.add_button.show()
[docs]
class AdvComboBoxLabeled(QtWidgets.QVBoxLayout):
def __init__(self, label):
QtWidgets.QVBoxLayout.__init__(self)
self.label = QtWidgets.QLabel("<b>%s</b>" % label)
[docs]
class AdvComboBox(QtWidgets.QComboBox):
def __init__(self, parent=None):
super(AdvComboBox, self).__init__(parent)
self.user_selected = False
self.setFocusPolicy(QtCore.Qt.StrongFocus)
self.setEditable(True)
self.setMinimumWidth(90)
self.SizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
# self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
self.setSizePolicy(
QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum
)
# add a filter model to filter matching items
self.pFilterModel = QtCore.QSortFilterProxyModel(self)
self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.pFilterModel.setSourceModel(self.model())
# add a completer
self.completer = QtWidgets.QCompleter(self)
# Set the model that the QCompleter uses
# - in PySide doing this as a separate step worked better
self.completer.setModel(self.pFilterModel)
# always show all (filtered) completions
self.completer.setCompletionMode(QtWidgets.QCompleter.UnfilteredPopupCompletion)
self.setCompleter(self.completer)
# connect signals
def filter_(text):
self.pFilterModel.setFilterFixedString(str(text))
self.lineEdit().textEdited.connect(filter_)
self.completer.activated.connect(self.on_completer_activated)
self.set_placeholder_text()
[docs]
def set_placeholder_text(self, text="Type or Choose below..."):
self.lineEdit().setPlaceholderText(text)
# on selection of an item from the completer, select the corresponding item from combobox
[docs]
def on_completer_activated(self, text):
if text:
index = self.findText(str(text))
self.setCurrentIndex(index)
# on model change, update the models of the filter and completer as well
[docs]
def setModel(self, model):
super(AdvComboBox, self).setModel(model)
self.pFilterModel.setSourceModel(model)
self.completer.setModel(self.pFilterModel)
# on model column change, update the model column of the filter and completer as well
[docs]
def setModelColumn(self, column):
self.completer.setCompletionColumn(column)
self.pFilterModel.setFilterKeyColumn(column)
super(AdvComboBox, self).setModelColumn(column)
[docs]
def populate_from_project(self, keys):
self.clear()
# load the shading/texture assets from the library
# clear duplicates
obj_list = []
for key in keys:
if str(key) not in obj_list:
obj_list.append(str(key))
for item in obj_list:
self.addItem(item)