def populateClassItem(self, parentItem, repopulate): " Populates a class item " parentItem.populated = True # Count the number of items count = len( parentItem.sourceObj.decorators ) + \ len( parentItem.sourceObj.functions ) if parentItem.sourceObj.classes: count += 1 if parentItem.sourceObj.classAttributes: count += 1 if parentItem.sourceObj.instanceAttributes: count += 1 if count == 0: return # Insert rows if repopulate: self.beginInsertRows( self.createIndex(parentItem.row(), 0, parentItem), 0, count - 1) for item in parentItem.sourceObj.decorators: node = TreeViewDecoratorItem(parentItem, item) if parentItem.columnCount() > 1: node.appendData([parentItem.data(1), item.line]) node.setPath(self.findParentPath(parentItem)) self._addItem(node, parentItem) for item in parentItem.sourceObj.functions: node = TreeViewFunctionItem(parentItem, item) if parentItem.columnCount() > 1: node.appendData([parentItem.data(1), item.line]) node.setPath(self.findParentPath(parentItem)) self._addItem(node, parentItem) if parentItem.sourceObj.classes: node = TreeViewClassesItem(parentItem, parentItem.sourceObj) if parentItem.columnCount() > 1: node.appendData(["", ""]) self._addItem(node, parentItem) if parentItem.sourceObj.classAttributes: node = TreeViewStaticAttributesItem(parentItem) if parentItem.columnCount() > 1: node.appendData(["", ""]) self._addItem(node, parentItem) if parentItem.sourceObj.instanceAttributes: node = TreeViewInstanceAttributesItem(parentItem) if parentItem.columnCount() > 1: node.appendData(["", ""]) self._addItem(node, parentItem) if repopulate: self.endInsertRows() return
def onFSChanged( self, addedPythonFiles, deletedPythonFiles ): " Triggered when some files appeared or disappeared " needUpdate = False itemsToDelete = [] for path in deletedPythonFiles: for item in self.rootItem.childItems: if os.path.realpath( path ) == \ os.path.realpath( item.getPath() ): itemsToDelete.append( item ) for item in itemsToDelete: needUpdate = True self.removeTreeItem( item ) for path in addedPythonFiles: try: info = self.globalData.briefModinfoCache.get( path ) except: # It could be that a file was created and deleted straight # away. In this case the cache will generate an exception. continue for funcObj in info.functions: needUpdate = True newItem = TreeViewFunctionItem( self.rootItem, funcObj ) newItem.appendData( [ basename( path ), funcObj.line ] ) newItem.setPath( path ) self.addTreeItem( self.rootItem, newItem ) return needUpdate
def updateFunctionsItem( self, treeItem, functionsObj ): " Updates functions item " if not treeItem.populated: return existingFunctions = [] itemsToRemove = [] for functionItem in treeItem.childItems: name = functionItem.sourceObj.name found = False for func in functionsObj: if func.name == name: found = True existingFunctions.append( name ) if cmpFunctionDisplayName( functionItem.sourceObj, func ): functionItem.updateData( func ) functionItem.setData( 2, func.line ) else: # Appearence changed functionItem.updateData( func ) functionItem.setData( 2, func.line ) self.signalItemUpdated( functionItem ) self.updateSingleFuncItem( functionItem, func ) break if not found: itemsToRemove.append( functionItem ) for item in itemsToRemove: self.removeTreeItem( item ) # Add those which have been introduced for func in functionsObj: if func.name not in existingFunctions: newItem = TreeViewFunctionItem( treeItem, func ) if treeItem.columnCount() > 1: newItem.appendData( [ treeItem.data( 1 ), func.line ] ) newItem.setPath( self.findParentPath( treeItem ) ) self.addTreeItem( treeItem, newItem ) return
def __populateModel( self ): " Populates the project browser model " self.clear() project = self.globalData.project cache = self.globalData.briefModinfoCache for fname in project.filesList: if detectFileType( fname ) in [ PythonFileType, Python3FileType ]: info = cache.get( fname ) for func in info.functions: item = TreeViewFunctionItem( self.rootItem, func ) item.appendData( [ basename( fname ), func.line ] ) item.setPath( fname ) self.rootItem.appendChild( item ) return
def onFileUpdated( self, fileName ): " Triggered when a file was updated " # Here: python file which belongs to the project info = self.globalData.briefModinfoCache.get( fileName ) existingFunctions = [] itemsToRemove = [] needUpdate = False # For all root items path = os.path.realpath( fileName ) for treeItem in self.rootItem.childItems: if os.path.realpath( treeItem.getPath() ) != path: continue # Item belongs to the modified file name = treeItem.sourceObj.name found = False for func in info.functions: if func.name == name: found = True existingFunctions.append( name ) treeItem.updateData( func ) treeItem.setData( 2, func.line ) self.signalItemUpdated( treeItem ) self.updateSingleFuncItem( treeItem, func ) break if not found: itemsToRemove.append( treeItem ) for item in itemsToRemove: needUpdate = True self.removeTreeItem( item ) # Add those which have been introduced for item in info.functions: if not item.name in existingFunctions: needUpdate = True newItem = TreeViewFunctionItem( self.rootItem, item ) newItem.appendData( [ basename( fileName ), item.line ] ) newItem.setPath( fileName ) self.addTreeItem( self.rootItem, newItem ) return needUpdate
def updateFunctionsItem(self, treeItem, functionsObj): " Updates functions item " if not treeItem.populated: return existingFunctions = [] itemsToRemove = [] for functionItem in treeItem.childItems: name = functionItem.sourceObj.name found = False for func in functionsObj: if func.name == name: found = True existingFunctions.append(name) if cmpFunctionDisplayName(functionItem.sourceObj, func): functionItem.updateData(func) functionItem.setData(2, func.line) else: # Appearence changed functionItem.updateData(func) functionItem.setData(2, func.line) self.signalItemUpdated(functionItem) self.updateSingleFuncItem(functionItem, func) break if not found: itemsToRemove.append(functionItem) for item in itemsToRemove: self.removeTreeItem(item) # Add those which have been introduced for func in functionsObj: if func.name not in existingFunctions: newItem = TreeViewFunctionItem(treeItem, func) if treeItem.columnCount() > 1: newItem.appendData([treeItem.data(1), func.line]) newItem.setPath(self.findParentPath(treeItem)) self.addTreeItem(treeItem, newItem) return
def updateSingleClassItem(self, treeItem, classObj): " Updates single class item " if not treeItem.populated: return # There might be decorators, classes, methods, static attributes and # instance attributes existingDecors = [] existingMethods = [] hadStaticAttributes = False hadInstanceAttributes = False hadClasses = False itemsToRemove = [] for classChildItem in treeItem.childItems: if classChildItem.itemType == DecoratorItemType: name = classChildItem.sourceObj.name found = False for decor in classObj.decorators: if decor.name == name: found = True existingDecors.append(name) if cmpDecoratorDisplayName(classChildItem.sourceObj, decor): classChildItem.updateData(decor) classChildItem.setData(2, decor.line) else: # Appearence changed classChildItem.updateData(decor) classChildItem.setData(2, decor.line) self.signalItemUpdated(classChildItem) break if not found: itemsToRemove.append(classChildItem) continue elif classChildItem.itemType == ClassesItemType: hadClasses = True if not classObj.classes: itemsToRemove.append(classChildItem) else: classChildItem.updateData(classObj) self.updateClassesItem(classChildItem, classObj.classes) continue elif classChildItem.itemType == FunctionItemType: name = classChildItem.sourceObj.name found = False for method in classObj.functions: if method.name == name: found = True existingMethods.append(name) if cmpFunctionDisplayName(classChildItem.sourceObj, method): classChildItem.updateData(method) classChildItem.setData(2, method.line) else: # Appearence changed classChildItem.updateData(method) classChildItem.setData(2, method.line) self.signalItemUpdated(classChildItem) self.updateSingleFuncItem(classChildItem, method) break if not found: itemsToRemove.append(classChildItem) continue elif classChildItem.itemType == StaticAttributesItemType: hadStaticAttributes = True if not classObj.classAttributes: itemsToRemove.append(classChildItem) else: self.updateAttrItem(classChildItem, classObj.classAttributes) continue elif classChildItem.itemType == InstanceAttributesItemType: hadInstanceAttributes = True if not classObj.instanceAttributes: itemsToRemove.append(classChildItem) else: self.updateAttrItem(classChildItem, classObj.instanceAttributes) continue for item in itemsToRemove: self.removeTreeItem(item) # Add those which have been introduced for decor in classObj.decorators: if decor.name not in existingDecors: newItem = TreeViewDecoratorItem(treeItem, decor) if treeItem.columnCount() > 1: newItem.appendData([treeItem.data(1), decor.line]) newItem.setPath(self.findParentPath(treeItem)) self.addTreeItem(treeItem, newItem) for method in classObj.functions: if method.name not in existingMethods: newItem = TreeViewFunctionItem(treeItem, method) if treeItem.columnCount() > 1: newItem.appendData([treeItem.data(1), method.line]) newItem.setPath(self.findParentPath(treeItem)) self.addTreeItem(treeItem, newItem) if not hadClasses and classObj.classes: newItem = TreeViewClassesItem(treeItem, classObj) if treeItem.columnCount() > 1: newItem.appendData(["", ""]) self.addTreeItem(treeItem, newItem) if not hadStaticAttributes and \ classObj.classAttributes: newItem = TreeViewStaticAttributesItem(treeItem) if treeItem.columnCount() > 1: newItem.appendData(["", ""]) self.addTreeItem(treeItem, newItem) if not hadInstanceAttributes and \ classObj.instanceAttributes: newItem = TreeViewInstanceAttributesItem(treeItem) if treeItem.columnCount() > 1: newItem.appendData(["", ""]) self.addTreeItem(treeItem, newItem) return