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_loader_info_handler import ImmutableLoaderInfoHandler
00007 from loader_info_handler import LoaderInfoHandler
00008 from ost.gui import LoaderManager
00009
00010 class LoaderListModel(QtCore.QAbstractListModel):
00011
00012 IMMUTABLE_LOADERS_PATH = os.path.join(ost.GetSharedDataPath(),"scene",
00013 "loaders.xml")
00014 MUTABLE_LOADERS_PATH = "user_loaders.xml"
00015
00016 def __init__(self, parent=None, *args):
00017 QtCore.QAbstractListModel.__init__(self, parent, *args)
00018
00019 self.data_ = list()
00020
00021
00022 self.immutable_infoh_ = ImmutableLoaderInfoHandler(LoaderListModel.IMMUTABLE_LOADERS_PATH)
00023 self.infoh_ = LoaderInfoHandler(LoaderListModel.MUTABLE_LOADERS_PATH)
00024 self.LoadLoaderFromInfo()
00025
00026 self.loader_manager_ = gui.FileLoader.GetLoaderManager()
00027
00028 def AddItem(self, name, loader, row, editable, save):
00029 if self.NameIsValid(name):
00030 self.insertRow(row, QtCore.QModelIndex())
00031 self.data_[row] = [name, loader, editable]
00032 model_index = self.createIndex(row,0)
00033 index = self.index(row)
00034 end_index = self.createIndex(self.rowCount(),0)
00035 if save:
00036 self.AddLoaderToInfo(name, loader)
00037 self.emit(QtCore.SIGNAL("dataChanged"),model_index, end_index)
00038 gui.FileLoader.GetLoaderManager().AddRemoteSiteLoader(name, loader)
00039 if(loader.IsDefault()):
00040 gui.FileLoader.GetLoaderManager().SetDefaultRemoteSiteIdent(name)
00041 return True
00042 return False
00043
00044 def IsEditable(self, row):
00045 return self.data_[row][2]
00046
00047 def RemoveItem(self, row):
00048 if self.IsEditable(row):
00049 name = self.data_[row][0]
00050 self.removeRow(row, QtCore.QModelIndex())
00051 model_index = self.createIndex(row,0)
00052 self.infoh_.RemoveLoader(name)
00053 self.emit(QtCore.SIGNAL("dataChanged"),model_index, model_index)
00054 self.loader_manager_.RemoveRemoteSiteLoader(name)
00055 return True
00056 return False
00057
00058 def AddLoaderToInfo(self, name, loader):
00059 self.infoh_.StoreLoader(name, loader)
00060
00061 def RemoveLoaderFromInfo(self, name):
00062 self.infoh_.RemoveLoader(name)
00063
00064 def SetItem(self, model_index, loader):
00065 row = model_index.row()
00066 name = self.data_[row][0]
00067 self.data_[row][1] = loader
00068 model_index = self.createIndex(row,0)
00069 index = self.index(row)
00070 end_index = self.createIndex(self.rowCount(),0)
00071 self.RemoveLoaderFromInfo(self.data_[row][0])
00072 self.AddLoaderToInfo(self.data_[row][0], loader)
00073 self.emit(QtCore.SIGNAL("dataChanged"),model_index, end_index)
00074 self.loader_manager_.RemoveRemoteSiteLoader(name)
00075 self.loader_manager_.AddRemoteSiteLoader(name, loader)
00076 return True
00077
00078 def LoadLoaderFromInfo(self):
00079 if self.immutable_infoh_:
00080 loaders = self.immutable_infoh_.GetLoaders()
00081 for k, v in loaders.iteritems():
00082 self.AddItem(k, v, self.GetLastRow(), False, False)
00083
00084 loaders = self.infoh_.GetLoaders()
00085 for k, v in loaders.iteritems():
00086 self.AddItem(k, v, self.GetLastRow(), True, False)
00087
00088 def GetLoader(self, model_index):
00089 if model_index.isValid():
00090 return self.data_[model_index.row()][1]
00091
00092 def GetLastRow(self):
00093 return self.rowCount()
00094
00095
00096 def NameIsValid(self, string):
00097 if len(string)==0:
00098 return False
00099 for values in self.data_:
00100 if string == values[0]:
00101 return False
00102 return True
00103
00104
00105 def rowCount(self, parent=QtCore.QModelIndex()):
00106 return len(self.data_)
00107
00108 def data(self, index, role):
00109 if index.isValid() and index.row()< self.rowCount():
00110 data = self.data_[index.row()]
00111 if role == QtCore.Qt.DisplayRole:
00112 return QtCore.QVariant(data[0])
00113 return QtCore.QVariant()
00114
00115 def setData(self, index, value, role):
00116 if index.isValid():
00117 row = index.row()
00118 if not self.data_[row]:
00119 self.data_[row] = list()
00120 if role == QtCore.Qt.EditRole and self.NameIsValid(value.toString()):
00121 old_name = str(self.data_[row][0])
00122 new_name = value.toString()
00123 self.data_[row][0] = new_name
00124 self.infoh_.RenameLoader(old_name,str(new_name))
00125 self.emit(QtCore.SIGNAL("dataChanged"),index, index)
00126 self.loader_manager_.RemoveRemoteSiteLoader(old_name)
00127 self.loader_manager_.AddRemoteSiteLoader(str(new_name), self.data_[row][1])
00128 return True
00129 elif role == QtCore.Qt.DisplayRole:
00130 self.data_[row][0] = value.toString()
00131 return False
00132
00133 def flags(self, index):
00134 if index.isValid():
00135 flags = QtCore.QAbstractItemModel.flags(self,index)
00136 if self.IsEditable(index.row()):
00137 return flags | QtCore.Qt.ItemIsEditable
00138 else:
00139 return flags
00140 return QtCore.Qt.ItemIsEnabled
00141
00142 def insertRow(self, position, index):
00143 self.beginInsertRows(index, position, position)
00144 self.data_.insert(position,list())
00145 self.endInsertRows()
00146 return True
00147
00148 def removeRow(self, position, index):
00149 self.beginRemoveRows(index, position, position)
00150 del self.data_[position]
00151 self.endRemoveRows()
00152 return True
00153
00154
00155
00156