--- a/MultiProject/MultiProject.py Tue Oct 03 19:37:44 2017 +0200 +++ b/MultiProject/MultiProject.py Wed Oct 04 20:06:26 2017 +0200 @@ -91,8 +91,8 @@ self.description = "" # description of the multi project self.name = "" self.opened = False - self.projects = [] - # list of project info; each info entry is a dictionary + self.__projects = {} + # dict of project info keyed by 'uid'; each info entry is a dictionary # 'name' : name of the project # 'file' : project file name # 'master' : flag indicating the master @@ -186,20 +186,20 @@ dirty state of the multi project is changed accordingly. """ removelist = [] - for project in self.projects: + for key, project in self.__projects.items(): if not os.path.exists(project['file']): - removelist.append(project) + removelist.append(key) if removelist: - for project in removelist: - self.projects.remove(project) + for key in removelist: + del self.__projects[key] self.setDirty(True) def __extractCategories(self): """ Private slot to extract the categories used in the project definitions. """ - for project in self.projects: + for project in self.__projects.values(): if project['category'] and \ project['category'] not in self.categories: self.categories.append(project['category']) @@ -293,10 +293,19 @@ return res + def addProject(self, project): + """ + Public method to add a project to the multi-project. + + @param project dictionary containing the project data to be added + @type dict + """ + self.__projects[project['uid']] = project + @pyqtSlot() - def addProject(self, startdir=None): + def addNewProject(self, startdir=None): """ - Public slot used to add files to the project. + Public slot used to add a new project to the multi-project. @param startdir start directory for the selection dialog (string) """ @@ -312,13 +321,13 @@ dlg.getData() # step 1: check, if project was already added - for project in self.projects: + for project in self.__projects.values(): if project['file'] == filename: return # step 2: check, if master should be changed if isMaster: - for project in self.projects: + for project in self.__projects.values(): if project['master']: project['master'] = False self.projectDataChanged.emit(project) @@ -334,7 +343,7 @@ 'category': category, 'uid': uid, } - self.projects.append(project) + self.__projects[uid] = project if category not in self.categories: self.categories.append(category) self.projectAdded.emit(project) @@ -348,7 +357,7 @@ """ # step 1: check, if master should be changed if pro['master']: - for project in self.projects: + for project in self.__projects.values(): if project['master']: if project['uid'] != pro['uid']: project['master'] = False @@ -357,18 +366,17 @@ break # step 2: change the entry - for project in self.projects: - if project['uid'] == pro['uid']: - # project UID is not changeable via interface - project['file'] = pro['file'] - project['name'] = pro['name'] - project['master'] = pro['master'] - project['description'] = pro['description'] - project['category'] = pro['category'] - if project['category'] not in self.categories: - self.categories.append(project['category']) - self.projectDataChanged.emit(project) - self.setDirty(True) + project = self.__projects[pro['uid']] + # project UID is not changeable via interface + project['file'] = pro['file'] + project['name'] = pro['name'] + project['master'] = pro['master'] + project['description'] = pro['description'] + project['category'] = pro['category'] + if project['category'] not in self.categories: + self.categories.append(project['category']) + self.projectDataChanged.emit(project) + self.setDirty(True) def getProjects(self): """ @@ -376,34 +384,35 @@ @return list of all project entries (list of dictionaries) """ - return self.projects + return self.__projects.values() - def getProject(self, fn): + def getProject(self, uid): """ Public method to get a reference to a project entry. - @param fn filename of the project (string) + @param uid UID of the project to get + @type str @return dictionary containing the project data + @rtype dict """ - for project in self.projects: - if project['file'] == fn: - return project - - return None + if uid in self.__projects: + return self.__projects[uid] + else: + return None - def removeProject(self, fn): + def removeProject(self, uid): """ Public slot to remove a project from the multi project. - @param fn filename of the project to be removed from the multi - project (string) + @param uid UID of the project to be removed from the multi + project + @type str """ - for project in self.projects: - if project['file'] == fn: - self.projects.remove(project) - self.projectRemoved.emit(project) - self.setDirty(True) - break + if uid in self.__projects: + project = self.__projects[uid] + del self.__projects[uid] + self.projectRemoved.emit(project) + self.setDirty(True) def __newMultiProject(self): """ @@ -587,7 +596,7 @@ # now close the current project, if it belongs to the multi project pfile = self.projectObject.getProjectFile() if pfile: - for project in self.projects: + for project in self.__projects.values(): if project['file'] == pfile: if not self.projectObject.closeProject(): return False @@ -690,7 +699,7 @@ """<p>This opens a dialog for adding a project""" """ to the current multiproject.</p>""" )) - self.addProjectAct.triggered.connect(self.addProject) + self.addProjectAct.triggered.connect(self.addNewProject) self.actions.append(self.addProjectAct) self.propsAct = E5Action( @@ -897,7 +906,7 @@ @param reopen flag indicating, that the master project should be reopened, if it has been opened already (boolean) """ - for project in self.projects: + for project in self.__projects.values(): if project['master']: if reopen or \ not self.projectObject.isOpen() or \ @@ -911,7 +920,7 @@ @return name of the master project file (string) """ - for project in self.projects: + for project in self.__projects: if project['master']: return project['file'] @@ -924,7 +933,7 @@ @return names of the dependent project files (list of strings) """ files = [] - for project in self.projects: + for project in self.__projects.values(): if not project['master']: files.append(project['file']) return files