Created
February 7, 2018 22:47
-
-
Save eyllanesc/5170fb413e38951ec1ab9f6886b77e80 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from PySide import QtGui, QtCore | |
class AssetDelegate(QtGui.QStyledItemDelegate): | |
def paint(self, painter, option, index): | |
if isinstance(self.parent(), QtGui.QAbstractItemView): | |
self.parent().openPersistentEditor(index) | |
QtGui.QStyledItemDelegate.paint(self, painter, option, index) | |
def createEditor(self, parent, option, index): | |
combobox = QtGui.QComboBox(parent) | |
combobox.addItems(index.data(AssetModel.ItemsRole)) | |
combobox.currentIndexChanged.connect(self.onCurrentIndexChanged) | |
return combobox | |
def onCurrentIndexChanged(self, ix): | |
editor = self.sender() | |
self.commitData.emit(editor) | |
self.closeEditor.emit(editor, QtGui.QAbstractItemDelegate.NoHint) | |
def setEditorData(self, editor, index): | |
ix = index.data(AssetModel.ActiveRole) | |
editor.setCurrentIndex(ix) | |
def setModelData(self, editor, model, index): | |
ix = editor.currentIndex() | |
model.setData(index, ix, AssetModel.ActiveRole) | |
class Asset(object): | |
def __init__(self, name, items=[], active=0): | |
self.active = active | |
self.name = name | |
self.items = items | |
@property | |
def status(self): | |
return self.active == len(self.items) - 1 | |
class AssetModel(QtCore.QAbstractTableModel): | |
attr = ["Name", "Options"] | |
ItemsRole = QtCore.Qt.UserRole + 1 | |
ActiveRole = QtCore.Qt.UserRole + 2 | |
def __init__(self, *args, **kwargs): | |
QtCore.QAbstractTableModel.__init__(self, *args, **kwargs) | |
self._items = [] | |
def flags(self, index): | |
fl = QtCore.QAbstractTableModel.flags(self, index) | |
if index.column() == 1: | |
fl |= QtCore.Qt.ItemIsEditable | |
return fl | |
def clear(self): | |
self.beginResetModel() | |
self._items = [] | |
self.endResetModel() | |
def rowCount(self, index=QtCore.QModelIndex()): | |
return len(self._items) | |
def columnCount(self, index=QtCore.QModelIndex()): | |
return len(self.attr) | |
def addItem(self, sbsFileObject): | |
self.beginInsertRows(QtCore.QModelIndex(), self.rowCount(), self.rowCount()) | |
self._items.append(sbsFileObject) | |
self.endInsertRows() | |
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): | |
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: | |
return AssetModel.attr[section] | |
return QtCore.QAbstractTableModel.headerData(self, section, orientation, role) | |
def data(self, index, role=QtCore.Qt.DisplayRole): | |
if not index.isValid(): | |
return None | |
if 0 <= index.row() < self.rowCount(): | |
item = self._items[index.row()] | |
col = index.column() | |
if role == AssetModel.ItemsRole: | |
return getattr(item, 'items') | |
if role == AssetModel.ActiveRole: | |
return getattr(item, 'active') | |
if 0 <= col < self.columnCount(): | |
if role == QtCore.Qt.DisplayRole: | |
if col == 0: | |
return getattr(item, 'name', '') | |
if col == 1: | |
return getattr(item, 'items')[getattr(item, 'active')] | |
elif role == QtCore.Qt.DecorationRole: | |
if col == 0: | |
status = getattr(item, 'status') | |
col = QtGui.QColor(QtCore.Qt.red) if status else QtGui.QColor(QtCore.Qt.green) | |
px = QtGui.QPixmap(120, 120) | |
px.fill(QtCore.Qt.transparent) | |
painter = QtGui.QPainter(px) | |
painter.setRenderHint(QtGui.QPainter.Antialiasing) | |
px_size = px.rect().adjusted(12, 12, -12, -12) | |
painter.setBrush(col) | |
painter.setPen(QtGui.QPen(QtCore.Qt.black, 4, | |
QtCore.Qt.SolidLine, | |
QtCore.Qt.RoundCap, | |
QtCore.Qt.RoundJoin)) | |
painter.drawEllipse(px_size) | |
painter.end() | |
return QtGui.QIcon(px) | |
def setData(self, index, value, role=QtCore.Qt.EditRole): | |
if 0 <= index.row() < self.rowCount(): | |
item = self._items[index.row()] | |
if role == AssetModel.ActiveRole: | |
setattr(item, 'active', value) | |
return True | |
return QtCore.QAbstractTableModel.setData(self, index, value, role) | |
class Example(QtGui.QWidget): | |
def __init__(self): | |
super(Example, self).__init__() | |
self.resize(400, 300) | |
# controls | |
asset_model = QtGui.QSortFilterProxyModel() | |
asset_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) | |
asset_model.setSourceModel(AssetModel()) | |
self.ui_assets = QtGui.QTableView() | |
self.ui_assets.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) | |
self.ui_assets.setModel(asset_model) | |
self.ui_assets.verticalHeader().hide() | |
self.ui_assets.setItemDelegateForColumn(1, AssetDelegate(self.ui_assets)) | |
main_layout = QtGui.QVBoxLayout() | |
main_layout.addWidget(self.ui_assets) | |
self.setLayout(main_layout) | |
self.unit_test() | |
def unit_test(self): | |
assets = [ | |
Asset('Doug', ['v01', 'v02', 'v03'], 0), | |
Asset('Amy', ['v10', 'v11', 'v13'], 1), | |
Asset('Kevin', ['v11', 'v22', 'v53'], 2), | |
Asset('Leslie', ['v13', 'v21', 'v23'], 0) | |
] | |
self.ui_assets.model().sourceModel().clear() | |
for i, obj in enumerate(assets): | |
self.ui_assets.model().sourceModel().addItem(obj) | |
def main(): | |
app = QtGui.QApplication(sys.argv) | |
ex = Example() | |
ex.show() | |
sys.exit(app.exec_()) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment