MultiProject/MultiProjectBrowser.py

changeset 0
de9c2efb9d02
child 7
c679fb30c8f3
diff -r 000000000000 -r de9c2efb9d02 MultiProject/MultiProjectBrowser.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MultiProject/MultiProjectBrowser.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,249 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2008 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the multi project browser.
+"""
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from E4Gui.E4Application import e4App
+
+from AddProjectDialog import AddProjectDialog
+
+import UI.PixmapCache
+
+class MultiProjectBrowser(QListWidget):
+    """
+    Class implementing the multi project browser.
+    """
+    def __init__(self, multiProject, parent = None):
+        """
+        Constructor
+        
+        @param project reference to the multi project object
+        @param parent parent widget (QWidget)
+        """
+        QListWidget.__init__(self, parent)
+        self.multiProject = multiProject
+        
+        self.setWindowIcon(UI.PixmapCache.getIcon("eric.png"))
+        self.setAlternatingRowColors(True)
+        
+        self.connect(self.multiProject, SIGNAL("newMultiProject"), 
+                     self.__newMultiProject)
+        self.connect(self.multiProject, SIGNAL("multiProjectOpened"), 
+                     self.__multiProjectOpened)
+        self.connect(self.multiProject, SIGNAL("multiProjectClosed"), 
+                     self.__multiProjectClosed)
+        self.connect(self.multiProject, SIGNAL("projectDataChanged"), 
+                     self.__projectDataChanged)
+        self.connect(self.multiProject, SIGNAL("projectAdded"), 
+                     self.__projectAdded)
+        self.connect(self.multiProject, SIGNAL("projectRemoved"), 
+                     self.__projectRemoved)
+        self.connect(self.multiProject, SIGNAL("projectOpened"), 
+                     self.__projectOpened)
+        
+        self.__createPopupMenu()
+        self.setContextMenuPolicy(Qt.CustomContextMenu)
+        self.connect(self, SIGNAL("customContextMenuRequested(const QPoint &)"),
+                     self.__contextMenuRequested)
+        self.connect(self, SIGNAL("itemActivated(QListWidgetItem*)"), self.__openItem)
+    
+    ############################################################################
+    ## Slot handling methods below
+    ############################################################################
+    
+    def __newMultiProject(self):
+        """
+        Private slot to handle the creation of a new multi project.
+        """
+        self.clear()
+    
+    def __multiProjectOpened(self):
+        """
+        Private slot to handle the opening of a multi project.
+        """
+        for project in self.multiProject.getProjects():
+            self.__addProject(project)
+        
+        self.sortItems()
+    
+    def __multiProjectClosed(self):
+        """
+        Private slot to handle the closing of a multi project.
+        """
+        self.clear()
+    
+    def __projectAdded(self, project):
+        """
+        Private slot to handle the addition of a project to the multi project.
+        
+        @param project reference to the project data dictionary
+        """
+        self.__addProject(project)
+        self.sortItems()
+    
+    def __projectRemoved(self, project):
+        """
+        Private slot to handle the removal of a project from the multi project.
+        
+        @param project reference to the project data dictionary
+        """
+        row = self.__findProjectItem(project)
+        if row > -1:
+            itm = self.takeItem(row)
+            del itm
+    
+    def __projectDataChanged(self, project):
+        """
+        Private slot to handle the change of a project of the multi project.
+        
+        @param project reference to the project data dictionary
+        """
+        row = self.__findProjectItem(project)
+        if row > -1:
+            self.__setItemData(self.item(row), project)
+            
+            self.sortItems()
+    
+    def __projectOpened(self, projectfile):
+        """
+        Private slot to handle the opening of a project.
+        """
+        project = {
+            'name' : "", 
+            'file' : projectfile, 
+            'master' : False, 
+            'description' : "", 
+        }
+        row = self.__findProjectItem(project)
+        if row > -1:
+            self.item(row).setSelected(True)
+    
+    def __contextMenuRequested(self, coord):
+        """
+        Private slot to show the context menu.
+        
+        @param coord the position of the mouse pointer (QPoint)
+        """
+        itm = self.itemAt(coord)
+        if itm is None:
+            self.__backMenu.popup(self.mapToGlobal(coord))
+        else:
+            self.__menu.popup(self.mapToGlobal(coord))
+    
+    def __openItem(self, itm = None):
+        """
+        Private slot to open a project.
+        
+        @param itm reference to the project item to be opened (QListWidgetItem)
+        """
+        if itm is None:
+            itm = self.currentItem()
+            if itm is None:
+                return
+        
+        filename = itm.data(Qt.UserRole).toString()
+        if filename:
+            self.multiProject.openProject(filename)
+    
+    ############################################################################
+    ## Private methods below
+    ############################################################################
+    
+    def __addProject(self, project):
+        """
+        Private method to add a project to the list.
+        
+        @param project reference to the project data dictionary
+        """
+        itm = QListWidgetItem(self)
+        self.__setItemData(itm, project)
+    
+    def __setItemData(self, itm, project):
+        """
+        Private method to set the data of a project item.
+        
+        @param itm reference to the item to be set (QListWidgetItem)
+        @param project reference to the project data dictionary
+        """
+        itm.setText(project['name'])
+        if project['master']:
+            itm.setIcon(UI.PixmapCache.getIcon("masterProject.png"))
+        else:
+            itm.setIcon(UI.PixmapCache.getIcon("empty.png"))
+        itm.setToolTip(project['file'])
+        itm.setData(Qt.UserRole, QVariant(project['file']))
+    
+    def __findProjectItem(self, project):
+        """
+        Private method to search a specific project item.
+        
+        @param project reference to the project data dictionary
+        @return row number of the project, -1 if not found (integer)
+        """
+        row = 0
+        while row < self.count():
+            itm = self.item(row)
+            data = itm.data(Qt.UserRole).toString()
+            if data == project['file']:
+                return row
+            row += 1
+        
+        return -1
+    
+    def __removeProject(self):
+        """
+        Private method to handle the Remove context menu entry.
+        """
+        itm = self.currentItem()
+        if itm is not None:
+            filename = itm.data(Qt.UserRole).toString()
+            if filename:
+                self.multiProject.removeProject(filename)
+    
+    def __showProjectProperties(self):
+        """
+        Private method to show the data of a project entry.
+        """
+        itm = self.currentItem()
+        if itm is not None:
+            filename = itm.data(Qt.UserRole).toString()
+            if filename:
+                project = self.multiProject.getProject(filename)
+                if project is not None:
+                    dlg = AddProjectDialog(self, project = project)
+                    if dlg.exec_() == QDialog.Accepted:
+                        name, filename, isMaster, description = dlg.getData()
+                        project = {
+                            'name' : name, 
+                            'file' : filename, 
+                            'master' : isMaster, 
+                            'description' : description, 
+                        }
+                        self.multiProject.changeProjectProperties(project)
+    
+    def __createPopupMenu(self):
+        """
+        Private method to create the popup menu.
+        """
+        self.__menu = QMenu(self)
+        self.__menu.addAction(self.trUtf8("Open"), self.__openItem)
+        self.__menu.addAction(self.trUtf8("Remove"), self.__removeProject)
+        self.__menu.addAction(self.trUtf8("Properties"), self.__showProjectProperties)
+        self.__menu.addSeparator()
+        self.__menu.addAction(self.trUtf8("Configure..."), self.__configure)
+        
+        self.__backMenu = QMenu(self)
+        self.__backMenu.addAction(self.trUtf8("Configure..."), self.__configure)
+    
+    def __configure(self):
+        """
+        Private method to open the configuration dialog.
+        """
+        e4App().getObject("UserInterface").showPreferences("multiProjectPage")

eric ide

mercurial