1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
from ost import gui
from ost import gfx
import os
import ost
from PyQt5 import QtCore, QtWidgets, QtGui
from .immutable_gradient_info_handler import ImmutableGradientInfoHandler
from .gradient_info_handler import GradientInfoHandler
class GradientListModel(QtCore.QAbstractListModel):
IMMUTABLE_GRADIENTS_PATH = os.path.join(ost.GetSharedDataPath(),"scene",
"gradients.xml")
MUTABLE_GRADIENTS_PATH = "user_gradients.xml"
dataChanged = QtCore.pyqtSignal(int, int, name="dataChanged")
def __init__(self, parent=None, *args):
QtCore.QAbstractListModel.__init__(self, parent, *args)
self.data_ = list()
#Info Handler
self.immutable_infoh_ = ImmutableGradientInfoHandler(GradientListModel.IMMUTABLE_GRADIENTS_PATH)
self.infoh_ = GradientInfoHandler(GradientListModel.MUTABLE_GRADIENTS_PATH)
self.LoadGradientFromInfo()
def AddItem(self, name, gradient, row, editable, save):
if self.NameIsValid(name):
icon = self.GetIcon(gradient)
self.insertRow(row, QtCore.QModelIndex())
self.data_[row] = [name, gradient, icon, editable]
model_index = self.createIndex(row,0)
index = self.index(row)
end_index = self.createIndex(self.rowCount(),0)
if save:
self.AddGradientToInfo(gradient,name)
self.dataChanged.emit(model_index, end_index)
return True
return False
def IsEditable(self, row):
return self.data_[row][3]
def RemoveItem(self, row):
if self.IsEditable(row):
name = self.data_[row][0]
self.removeRow(row, QtCore.QModelIndex())
model_index = self.createIndex(row,0)
self.infoh_.RemoveGradient(name)
self.dataChanged.emit(model_index, model_index)
return True
return False
def AddGradientToInfo(self,gradient,name):
self.infoh_.StoreQGradient(gradient,str(name))
def LoadGradientFromInfo(self):
if self.immutable_infoh_:
qgradients = self.immutable_infoh_.GetQGradients()
for k, v in qgradients.items():
self.AddItem(k, v, self.GetLastRow(), False, False)
qgradients = self.infoh_.GetQGradients()
for k, v in qgradients.items():
self.AddItem(k, v, self.GetLastRow(), True, False)
def GetGradient(self, model_index):
if model_index.isValid():
return self.data_[model_index.row()][1]
def GetLastRow(self):
return self.rowCount()
#Helper
def GetIcon(self, gradient):
pixmap = QtGui.QPixmap(64, 64)
pixmap.fill(QtCore.Qt.transparent)
painter = QtGui.QPainter()
if painter.begin(pixmap):
gradient.setStart(QtCore.QPointF(0, 0))
gradient.setFinalStop(QtCore.QPointF(64, 0))
brush = QtGui.QBrush(gradient)
painter.setBrush(brush)
painter.drawRect(0, 0, 64, 64)
painter.end()
return QtGui.QIcon(pixmap)
def NameIsValid(self, string):
if len(string)==0:
return False
for values in self.data_:
if string == values[0]:
return False
return True
#Overwritten Methods
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.data_)
def data(self, index, role):
if index.isValid() and index.row()< self.rowCount():
data = self.data_[index.row()]
if role == QtCore.Qt.DisplayRole:
return QtCore.QVariant(data[0])
elif role == QtCore.Qt.DecorationRole:
return QtCore.QVariant(data[2])
return QtCore.QVariant()
def setData(self, index, value, role):
if index.isValid():
row = index.row()
if not self.data_[row]:
self.data_[row] = list()
if role == QtCore.Qt.EditRole and self.NameIsValid(value.toString()):
old_name = str(self.data_[row][0])
new_name = value.toString()
self.data_[row][0] = new_name
self.infoh_.RenameGradient(old_name,str(new_name))
self.dataChanged.emit(index, index)
return True
elif role == QtCore.Qt.DisplayRole:
self.data_[row][0] = value.toString()
elif role == QtCore.Qt.DecorationRole:
self.data_[row][2] = value.toPyObject()
return False
def flags(self, index):
if index.isValid():
flags = QtCore.QAbstractItemModel.flags(self,index)
if self.IsEditable(index.row()):
return flags | QtCore.Qt.ItemIsEditable
else:
return flags
return QtCore.Qt.ItemIsEnabled
def insertRow(self, position, index):
self.beginInsertRows(index, position, position)
self.data_.insert(position,list())
self.endInsertRows()
return True
def removeRow(self, position, index):
self.beginRemoveRows(index, position, position)
del self.data_[position]
self.endRemoveRows()
return True
|