# gui/delegates.py from PySide6.QtWidgets import QStyledItemDelegate, QLineEdit, QComboBox from PySide6.QtCore import Qt, QModelIndex from config import ALLOWED_ASSET_TYPES, ALLOWED_FILE_TYPES # Import config lists class LineEditDelegate(QStyledItemDelegate): """Delegate for editing string values using a QLineEdit.""" def createEditor(self, parent, option, index): # Creates the QLineEdit editor widget used for editing. editor = QLineEdit(parent) return editor def setEditorData(self, editor: QLineEdit, index: QModelIndex): # Sets the editor's initial data based on the model's data. # Use EditRole to get the raw data suitable for editing. value = index.model().data(index, Qt.EditRole) editor.setText(str(value) if value is not None else "") def setModelData(self, editor: QLineEdit, model, index: QModelIndex): # Commits the editor's data back to the model. value = editor.text() # Pass the potentially modified text back to the model's setData. model.setData(index, value, Qt.EditRole) def updateEditorGeometry(self, editor, option, index): # Ensures the editor widget is placed correctly within the cell. editor.setGeometry(option.rect) class ComboBoxDelegate(QStyledItemDelegate): """ Delegate for editing string values from a predefined list using a QComboBox. Determines the list source based on column index. """ def createEditor(self, parent, option, index: QModelIndex): # Creates the QComboBox editor widget. editor = QComboBox(parent) column = index.column() model = index.model() # Get the model instance # Add a "clear" option first, associating None with it. editor.addItem("---", None) # UserData = None # Populate based on column using lists from config items_list = None if column == 2: # Asset-Type Override (AssetRule) items_list = ALLOWED_ASSET_TYPES elif column == 4: # Item-Type Override (FileRule) items_list = ALLOWED_FILE_TYPES if items_list: for item_str in items_list: # Add item with the string itself as text and UserData editor.addItem(item_str, item_str) else: # If the delegate is incorrectly applied to another column, # it will just have the "---" option. pass return editor def setEditorData(self, editor: QComboBox, index: QModelIndex): # Sets the combo box's current item based on the model's string data. # Get the current string value (or None) from the model via EditRole. value = index.model().data(index, Qt.EditRole) # This should be a string or None idx = -1 if value is not None: # Find the index corresponding to the string value. idx = editor.findText(value) else: # If the model value is None, find the "---" item. idx = editor.findData(None) # Find the item with UserData == None # Set the current index, defaulting to 0 ("---") if not found. editor.setCurrentIndex(idx if idx != -1 else 0) def setModelData(self, editor: QComboBox, model, index: QModelIndex): # Commits the selected combo box data (string or None) back to the model. # Get the UserData associated with the currently selected item. # This will be the string value or None (for the "---" option). value = editor.currentData() # This is either the string or None # Pass this string value or None back to the model's setData. model.setData(index, value, Qt.EditRole) def updateEditorGeometry(self, editor, option, index): # Ensures the editor widget is placed correctly within the cell. editor.setGeometry(option.rect)