Graphics/UMLGraphicsView.py

changeset 2039
fa41ccd7f7bc
parent 2038
72557ef75de1
child 2194
0fce40af66b8
--- a/Graphics/UMLGraphicsView.py	Tue Sep 11 18:46:46 2012 +0200
+++ b/Graphics/UMLGraphicsView.py	Wed Sep 12 19:41:50 2012 +0200
@@ -121,8 +121,13 @@
                     self.trUtf8("Set size"), self)
         self.setSizeAct.triggered[()].connect(self.__setSize)
         
+        self.rescanAct = \
+            QAction(UI.PixmapCache.getIcon("rescan.png"),
+                    self.trUtf8("Re-Scan"), self)
+        self.rescanAct.triggered[()].connect(self.__rescan)
+        
         self.relayoutAct = \
-            QAction(UI.PixmapCache.getIcon("reload.png"),
+            QAction(UI.PixmapCache.getIcon("relayout.png"),
                     self.trUtf8("Re-Layout"), self)
         self.relayoutAct.triggered[()].connect(self.__relayout)
         
@@ -230,6 +235,7 @@
         toolBar.addAction(self.decHeightAct)
         toolBar.addAction(self.setSizeAct)
         toolBar.addSeparator()
+        toolBar.addAction(self.rescanAct)
         toolBar.addAction(self.relayoutAct)
         
         return toolBar
@@ -365,12 +371,39 @@
         
     def __relayout(self):
         """
-        Private method to handle the re-layout context menu entry.
+        Private slot to handle the re-layout context menu entry.
         """
         self.__itemId = -1
         self.scene().clear()
         self.relayout.emit()
         
+    def __rescan(self):
+        """
+        Private slot to handle the re-scan context menu entry.
+        """
+        # 1. save positions of all items and names of selected items
+        itemPositions = {}
+        selectedItems = []
+        for item in self.filteredItems(self.scene().items(), UMLItem):
+            name = item.getName()
+            if name:
+                itemPositions[name] = (item.x(), item.y())
+                if item.isSelected():
+                    selectedItems.append(name)
+        
+        # 2. save 
+        
+        # 2. re-layout the diagram
+        self.__relayout()
+        
+        # 3. move known items to the saved positions
+        for item in self.filteredItems(self.scene().items(), UMLItem):
+            name = item.getName()
+            if name in itemPositions:
+                item.setPos(*itemPositions[name])
+            if name in selectedItems:
+                item.setSelected(True)
+        
     def printDiagram(self):
         """
         Public slot called to print the diagram.
@@ -631,12 +664,26 @@
         """
         for item in self.scene().items():
             try:
-                itemID = item.getId()
+                if item.getId() == id:
+                    return item
             except AttributeError:
                 continue
-            
-            if itemID == id:
-                return item
+        
+        return None
+    
+    def findItemByName(self, name):
+        """
+        Public method to find an UML item based on it's name.
+        
+        @param name name to look for (string)
+        @return item found (UMLItem) or None
+        """
+        for item in self.scene().items():
+            try:
+                if item.getName() == name:
+                    return item
+            except AttributeError:
+                continue
         
         return None
     

eric ide

mercurial