00001 from ost import gui
00002 from ost import gfx
00003 import os
00004 import ost
00005 from PyQt4 import QtCore, QtGui
00006 from immutable_preset_info_handler import ImmutablePresetInfoHandler
00007 from preset_info_handler import PresetInfoHandler
00008
00009 class PresetListModel(QtCore.QAbstractListModel):
00010
00011 IMMUTABLE_PRESET_PATH = os.path.join(ost.GetSharedDataPath(),"scene",
00012 "presets.xml")
00013 MUTABLE_PRESET_PATH = "user_presets.xml"
00014
00015 def __init__(self, parent=None, *args):
00016 QtCore.QAbstractListModel.__init__(self, parent, *args)
00017
00018 self.data_ = list()
00019
00020
00021 self.immutable_infoh_ = ImmutablePresetInfoHandler(PresetListModel.IMMUTABLE_PRESET_PATH)
00022 self.infoh_ = PresetInfoHandler(PresetListModel.MUTABLE_PRESET_PATH)
00023 self.LoadPresetsFromInfo()
00024
00025 def AddItem(self, preset, row, editable, save):
00026 if self.NameIsValid(preset.GetName()):
00027 icon = self.GetIcon(preset)
00028 self.insertRow(row, QtCore.QModelIndex())
00029 self.data_[row] = [preset, icon, editable]
00030 model_index = self.createIndex(row,0)
00031 index = self.index(row)
00032 end_index = self.createIndex(self.rowCount(),0)
00033 if save:
00034 self.AddPresetToInfo(preset)
00035 self.emit(QtCore.SIGNAL("dataChanged"),model_index, end_index)
00036 return True
00037 return False
00038
00039 def IsEditable(self, row):
00040 return self.data_[row][2]
00041
00042 def RemoveItem(self, row):
00043 if self.IsEditable(row):
00044 name = self.data_[row][0].GetName()
00045 self.removeRow(row, QtCore.QModelIndex())
00046 model_index = self.createIndex(row,0)
00047 self.infoh_.RemovePreset(name)
00048 self.emit(QtCore.SIGNAL("dataChanged"),model_index, model_index)
00049 return True
00050 return False
00051
00052 def AddPresetToInfo(self,preset):
00053 self.infoh_.StorePreset(preset)
00054
00055 def LoadPresetsFromInfo(self):
00056 if self.immutable_infoh_:
00057 presets = self.immutable_infoh_.GetPresets()
00058 for k, v in presets.iteritems():
00059 self.AddItem(v, self.GetLastRow(), False, False)
00060
00061 presets = self.infoh_.GetPresets()
00062 for k, v in presets.iteritems():
00063 self.AddItem(v, self.GetLastRow(), True, False)
00064
00065 def GetPreset(self, model_index):
00066 if model_index.isValid():
00067 return self.data_[model_index.row()][0]
00068
00069 def GetLastRow(self):
00070 return self.rowCount()
00071
00072
00073 def GetIcon(self, preset):
00074 pixmap = QtGui.QPixmap(64, 64)
00075 pixmap.fill(QtCore.Qt.transparent)
00076 return QtGui.QIcon(pixmap)
00077
00078 def NameIsValid(self, string):
00079 if len(string)==0:
00080 return False
00081 for values in self.data_:
00082 if string == values[0].GetName():
00083 return False
00084 return True
00085
00086
00087 def rowCount(self, parent=QtCore.QModelIndex()):
00088 return len(self.data_)
00089
00090 def data(self, index, role):
00091 if index.isValid() and index.row()< self.rowCount():
00092 data = self.data_[index.row()]
00093 if role == QtCore.Qt.DisplayRole:
00094 return QtCore.QVariant(data[0].GetName())
00095 elif role == QtCore.Qt.DecorationRole:
00096 return QtCore.QVariant(data[1])
00097 return QtCore.QVariant()
00098
00099 def setData(self, index, value, role):
00100 if index.isValid():
00101 row = index.row()
00102 if not self.data_[row]:
00103 self.data_[row] = list()
00104 if role == QtCore.Qt.EditRole and self.NameIsValid(value.toString()):
00105 old_name = str(self.data_[row][0].GetName())
00106 new_name = value.toString()
00107 self.data_[row][0].SetName(str(new_name))
00108 self.infoh_.RenamePreset(old_name,str(new_name))
00109 self.emit(QtCore.SIGNAL("dataChanged"),index, index)
00110 return True
00111 elif role == QtCore.Qt.DisplayRole:
00112 self.data_[row][0].SetName(value.toString())
00113 elif role == QtCore.Qt.DecorationRole:
00114 self.dat_[row][1] = value.toPyObject()
00115 return False
00116
00117 def flags(self, index):
00118 if index.isValid():
00119 flags = QtCore.QAbstractItemModel.flags(self,index)
00120 if self.IsEditable(index.row()):
00121 return flags | QtCore.Qt.ItemIsEditable
00122 else:
00123 return flags
00124 return QtCore.Qt.ItemIsEnabled
00125
00126 def insertRow(self, position, index):
00127 self.beginInsertRows(index, position, position)
00128 self.data_.insert(position,list())
00129 self.endInsertRows()
00130 return True
00131
00132 def removeRow(self, position, index):
00133 self.beginRemoveRows(index, position, position)
00134 del self.data_[position]
00135 self.endRemoveRows()
00136 return True
00137
00138
00139
00140