소스 검색

hide when add new shape
context menu , copy , delete and add new shape

Hussein 13 년 전
부모
커밋
55e489269f
3개의 변경된 파일77개의 추가작업 그리고 14개의 파일을 삭제
  1. 31 7
      canvas.py
  2. 35 6
      labelme.py
  3. 11 1
      shape.py

+ 31 - 7
canvas.py

@@ -29,6 +29,7 @@ class Canvas(QWidget):
         self.prevPoint=QPoint()
         self.scale = 1.0
         self.pixmap = None
+        self.hideShapesWhenNew=False
         # Set widget options.
         self.setMouseTracking(True)
         self.setFocusPolicy(Qt.WheelFocus)
@@ -41,7 +42,7 @@ class Canvas(QWidget):
 
     def mouseMoveEvent(self, ev):
         """Update line with last point and current coordinates."""
-        if ev.button() == Qt.RightButton:
+        if ev.buttons() & Qt.RightButton:
             if self.selectedShapeCopy:
                 if self.prevPoint:
                     point=QPoint(self.prevPoint)
@@ -55,6 +56,7 @@ class Canvas(QWidget):
                 for point in self.selectedShape.points:
                     newShape.addPoint(point)
                 self.selectedShapeCopy=newShape
+                self.selectedShapeCopy.fill=True
                 self.repaint()
             return
 
@@ -99,13 +101,20 @@ class Canvas(QWidget):
                     if self.outOfPixmap(pos):
                         return
                     self.current = Shape()
+                    self.setMouseTracking(True)
                     self.line.points = [pos, pos]
                     self.current.addPoint(pos)
             else:
+               
                 self.selectShape(ev.pos())
                 self.prevPoint=ev.pos()
             self.repaint()
-
+        if ev.button()==Qt.RightButton and not self.editing():
+            self.selectShape(ev.pos())
+            self.prevPoint=ev.pos()
+    
+    
+                
     def mouseDoubleClickEvent(self, ev):
         # FIXME: Don't create shape with 2 vertices only.
         if self.current and self.editing():
@@ -113,11 +122,12 @@ class Canvas(QWidget):
             # with shapes created the normal way.
             self.current.addPoint(self.current[0])
             self.finalise(ev)
+        
 
     def selectShape(self, point):
         """Select the first shape created which contains this point."""
         self.deSelectShape()
-        for shape in self.shapes:
+        for shape in reversed(self.shapes):
             if shape.containsPoint(point):
                 shape.selected = True
                 self.selectedShape = shape
@@ -126,13 +136,13 @@ class Canvas(QWidget):
     def deSelectShape(self):
         if self.selectedShape:
             self.selectedShape.selected = False
+            self.selectedShape=None
             self.repaint()
 
     def deleteSelected(self):
         if self.selectedShape:
              self.shapes.remove(self.selectedShape)
              self.selectedShape=None
-             #print self.selectedShape()
              self.repaint()
 
     def paintEvent(self, event):
@@ -148,8 +158,9 @@ class Canvas(QWidget):
 
         p.drawPixmap(0, 0, self.pixmap)
         Shape.scale = self.scale
-        for shape in self.shapes:
-            shape.paint(p)
+        if not self.hideShapesWhenNew:
+            for shape in self.shapes:
+                shape.paint(p)
         if self.current:
             self.current.paint(p)
             self.line.paint(p)
@@ -182,7 +193,9 @@ class Canvas(QWidget):
         self.current = None
         self.setEditing(False)
         self.repaint()
+        self.hideShapesWhenNew=False
         self.newShape.emit(self.mapToGlobal(ev.pos()))
+        self.setMouseTracking(False)
 
     def closeEnough(self, p1, p2):
         #d = distance(p1 - p2)
@@ -278,11 +291,22 @@ class Canvas(QWidget):
         self.line.points = [self.current[-1], pos]
         self.setEditing()
 
+    def copySelectedShape(self):
+        if self.selectedShape:
+            newShape=self.selectedShape.copy()
+            self.shapes.append(newShape)
+            self.deSelectShape()
+            self.shapes[-1].selected=True
+            self.selectedShape=self.shapes[-1]
+            self.repaint()
+            
     def deleteLastShape(self):
         assert self.shapes
         self.shapes.pop()
 
-
+    
+    
+            
 def distance(p):
     return sqrt(p.x() * p.x() + p.y() * p.y())
 

+ 35 - 6
labelme.py

@@ -69,6 +69,10 @@ class MainWindow(QMainWindow, WindowMixin):
 
         self.canvas = Canvas()
         #self.canvas.setAlignment(Qt.AlignCenter)
+        
+
+
+        
         self.canvas.setContextMenuPolicy(Qt.ActionsContextMenu)
         self.canvas.zoomRequest.connect(self.zoomRequest)
 
@@ -96,9 +100,23 @@ class MainWindow(QMainWindow, WindowMixin):
                 'Ctrl+C', 'color', u'Choose line color')
         label = action('&New Item', self.newLabel,
                 'Ctrl+N', 'new', u'Add new label')
+        copy = action('&Copy', self.copySelectedShape,
+                'Ctrl+C', 'copy', u'Copy')
         delete = action('&Delete', self.deleteSelectedShape,
                 'Ctrl+D', 'delete', u'Delete')
-
+        hideWhenNew=action('&Hide Labels\n When Adding \n new',self.hideWhenNew,
+        'Ctrl+H','Hide',u'Hide',checkable=True)
+
+        
+        self.canvas.setContextMenuPolicy( Qt.CustomContextMenu )
+        self.connect(self.canvas, SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu)
+
+        # Popup Menu
+        self.popMenu = QMenu(self )
+        self.popMenu.addAction( label )
+        self.popMenu.addAction( delete )
+        self.popMenu.addAction(copy)
+        
         labels = self.dock.toggleViewAction()
         labels.setShortcut('Ctrl+L')
 
@@ -118,7 +136,7 @@ class MainWindow(QMainWindow, WindowMixin):
         addActions(self.menus.view, (labels,))
 
         self.tools = self.toolbar('Tools')
-        addActions(self.tools, (open, color, None, label, delete, None,
+        addActions(self.tools, (open, color, None, label, delete,hideWhenNew, None,
             zoom, fit_window, None, quit))
 
 
@@ -162,13 +180,20 @@ class MainWindow(QMainWindow, WindowMixin):
 
         # Callbacks:
         self.zoom_widget.editingFinished.connect(self.paintCanvas)
+        
 
-
+    def on_context_menu(self, point):
+         self.popMenu.exec_( self.canvas.mapToGlobal(point) )
+         
     def addLabel(self, label, shape):
         item = QListWidgetItem(label)
         self.labels[item] = shape
         self.labelList.addItem(item)
-
+        
+    def copySelectedShape(self):
+        print "copy me"
+        self.canvas.copySelectedShape()
+        
     def highlightLabel(self, item):
         if self.highlighted:
             self.highlighted.fill_color = Shape.fill_color
@@ -215,7 +240,9 @@ class MainWindow(QMainWindow, WindowMixin):
 
     def queueEvent(self, function):
         QTimer.singleShot(0, function)
-
+        
+    def hideWhenNew(self):
+        self.canvas.hideShapesWhenNew =not self.canvas.hideShapesWhenNew
     def loadFile(self, filename=None):
         """Load the specified file, or the last opened file if None."""
         if filename is None:
@@ -270,8 +297,10 @@ class MainWindow(QMainWindow, WindowMixin):
         s['window/position'] = self.pos()
         s['window/state'] = self.saveState()
         s['line/color'] = self.color
-        #s['window/geometry'] = self.saveGeometry()
+        # ask the use for where to save the labels
+       
 
+        #s['window/geometry'] = self.saveGeometry()
     def updateFileMenu(self):
         """Populate menu with recent files."""
 

+ 11 - 1
shape.py

@@ -86,7 +86,17 @@ class Shape(object):
            newYPos=point.y()+dy
            self.points[index]=QPoint(newXPos,newYPos)
            index +=1
-
+           
+    def copy(self):
+        shapeCopy=Shape()
+        for point in self.points:
+            shapeCopy.points.append(point)
+            shapeCopy.label=self.label
+            shapeCopy.fill = self.fill
+            shapeCopy.selected = self.selected
+        return shapeCopy
+    
+    
     def __len__(self):
         return len(self.points)