def rowCount(self, parent_index): if parent_index.isValid(): if isinstance(parent_index.internalPointer(), bpQtCore.IndexPath): # connections do not have any children of their own row_count = 0 elif isinstance( parent_index.internalPointer(), (bfPropertyQtCache.BfPropertyId, bfSceneQtCache.BfIdData, bfSceneQtCache.BfIdDummyData)): # connection level row_count = self._connection_count(parent_index) return row_count else: raise bfQtCore.BfQtError( "Unrecognised valid parent index, cannot get row count: {} {}" .format(parent_index, parent_index.internalPointer())) # print "row count {} {}".format(row_count, # parent_index.internalPointer()) else: # root level row_count = super(BfConnectedProxyModelBase, self).rowCount(parent_index) return row_count
def parent(self, index): data = index.internalPointer() if isinstance( data, (bfSceneQtCache.BfIdConData, bfPropertyQtCache.BfPropertyConId)): # connection level # get parent row parent_row = self._connected_model.find_row(data.value()) parent_data = self._connected_model.get_id_object(data.value()) parent_index = self.createIndex(parent_row, 0, parent_data) return parent_index elif isinstance(data, ( bfSceneQtCache.BfIdData, bfSceneQtCache.BfIdDummyData, bfPropertyQtCache.BfPropertyId, )): # connected level # return invalid index to indicate root level return Qt.QtCore.QModelIndex() else: raise bfQtCore.BfQtError( "Failed to create parent index: {} {}".format(index, data))
def get_id_con_object(self, object_id): """Get cached BfIdConData object for specified uid """ if object_id not in self.id_con_objects: raise bfQtCore.BfQtError( "Failed to get id con object: {} {}".format(object_id)) return self.id_con_objects[object_id]
def index(self, row, column, parent_index): """ if at root level behaviour is normal if at child level then get property index... get fbx_object id, then get corresponding property mapping dict Then construct a bpCore.IndexPath for parent_index and append row, then use this to find proxy index. """ if not parent_index.isValid(): print "debugging: getting child index: {} {} {} {}".format( row, column, parent_index.internalPointer(), parent_index) return self._index_list[row] # find proxy index source_parent_index = self.mapToSource(parent_index) property_model = self.get_property_model(parent_index) if self.is_scene_index(source_parent_index, reject_dummys=True): source_property_index = property_model.index( row, column, Qt.QtCore.QModelIndex()) elif self.is_scene_index(source_parent_index, reject_dummys=False): raise bfQtCore.BfQtError( "Cannot create child property index of Dummy object index: {}". format(parent_index)) elif self.is_property_index(source_parent_index): source_property_index = property_model.index( row, column, source_parent_index) else: raise bfQtCore.BfQtError( "Failed to find child property source index: {}".format( parent_index)) return self.mapFromSource(source_property_index)
def get_id_con_object(self, value): uid = self.get_id_value(value) if uid not in self._id_con_objects: raise bfQtCore.BfQtError( "Failed to get id con object: {} {}".format( uid, value ) ) return self._id_con_objects[uid]
def rowCount(self, parent_index): """ TODO if parent_index belongs to scene model, the get parent object, then get property model for object and return property model root row count. else if parent_index belongs to property model, then return property row count for source index. """ # if at root level behaviour is normal # if at child level then get property data property_model = self.get_property_model(parent_index) if self.is_scene_index(parent_index, reject_dummys=True): return property_model.rowCount(Qt.QtCore.QModelIndex()) elif self.is_scene_index(parent_index, reject_dummys=False): # Dummy objects should display no properties return 0 elif self.is_property_index(parent_index): if not parent_index.isValid(): raise Exception( "Cannot get property row count for invalid index: {}". format(parent_index)) source_parent_index = self.mapToSource(parent_index) row_count = property_model.rowCount(source_parent_index) print "debug rowCount: {}".format(row_count) return row_count elif not parent_index.isValid(): # print "debug getting scene rowCount: {} {}".format( # parent_index, parent_index.internalPointer() # ) row_count = len(self._index_list) # print "debug rowCount: {}".format(row_count) return row_count else: raise bfQtCore.BfQtError("Failed to get row count")
def get_id_value(self, value): if isinstance(value, BFbxPropertyRoot): uid = value.unique_id() elif isinstance(value, (int, long)): uid = value else: raise bfQtCore.BfQtError( "Failed to retreive unique id: {}".format(value) ) return uid
def get_connected(self, proxy_index): if self.sourceModel() is None: raise bfQtCore.BfQtError( "Cannot retreive connected object or property when sourceModel is None" ) # source_index = self.map_to_root(proxy_index) if isinstance(self.get_root_model(), bfPropertyModels.BFbxPropertyModel): fbx_property = self.get_root_model().get_fbx_property(proxy_index) return fbx_property elif isinstance(self.get_root_model(), bfSceneModels.BFbxSceneTreeQtModel): fbx_object = self.get_root_model().get_fbx_object(proxy_index) return fbx_object else: raise bfQtCore.BfQtError( "Failed to retreive connected object or property: {}".format( proxy_index))
def get_property_id(self, index): """Use IdObject to retrieve unique id. Index can be either proxy index or source index. """ id_object = index.internalPointer() if self.is_scene_index(index, reject_dummys=False): raise bfQtCore.BfQtError("Cannot get property id from scene index") elif self.is_property_index(index): return id_object.value() else: return None
def get_id_con_object(self, value): # id_value = self.get_id_value(value) # id_con_object = self._get_id_con_object(id_value) # return id_con_object raise bfQtCore.BfQtError( "Cannot retrieve id_con_object from base class")
def data(self, index, role): """ TODO more checks and helper methods """ # check index is valid if not index.isValid(): return if not index.parent().isValid(): data = self._connected_model.data(index, role) return data else: row = index.row() column = index.column() if row > self.rowCount(None): return Qt.QtCore.QModelIndex() # get connected property objects con_property = self.get_connection(row) if con_property is None: raise bfQtCore.BfQtError("Failed to get connected FbxProperty") con_property_id = bfFbxUtils.get_fbx_property_object_index( con_property) con_object = con_property.GetFbxObject() con_object_id = con_object.GetUniqueID() con_property_cache = self.scene_cache().get_property_cache( con_object_id) if con_property_cache is None: raise bfQtCore.BfQtError( "Failed to find cache for connected Property") con_property_item = con_property_cache.get_item_from_unique_id( con_property_id) if con_property_item is None: raise bfQtCore.BfQtError( "Failed to find item for connected Property") # get connected property data if column == 0: con_object_data = self._scene_model.get_fbx_object_data( con_object_id, column, role) if role in [Qt.QtCore.Qt.DisplayRole]: # append property name con_property_data = self._scene_model.property_model( )._get_prop_fn_data(column, role, con_property_item) data = "{}.{}".format(con_object_data, con_property_data) return data else: return con_object_data else: con_property_data = self._scene_model.property_model( )._get_prop_fn_data(column, role, con_property_item) return con_property_data return None