MultiProject/MultiProject.py

changeset 5889
092d06e0193f
parent 5389
9b1c800daff3
child 6048
82ad8ec9548c
--- 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

eric ide

mercurial