Browse Source

Fix hiding of background shapes across selections

Hide background shapes during selection as well as drawing. The setting
should now persist across multiple selections/edits as well.
Michael Pitidis 13 years ago
parent
commit
b9cb79bca6
2 changed files with 23 additions and 11 deletions
  1. 22 10
      canvas.py
  2. 1 1
      labelme.py

+ 22 - 10
canvas.py

@@ -30,7 +30,9 @@ class Canvas(QWidget):
         self.offsets = QPointF(), QPointF()
         self.offsets = QPointF(), QPointF()
         self.scale = 1.0
         self.scale = 1.0
         self.pixmap = None
         self.pixmap = None
-        self.hideShapesWhenNew=False
+        # Background label hiding.
+        self._hideBackround = False
+        self.hideBackround = False
         # Set widget options.
         # Set widget options.
         self.setMouseTracking(True)
         self.setMouseTracking(True)
         self.setFocusPolicy(Qt.WheelFocus)
         self.setFocusPolicy(Qt.WheelFocus)
@@ -87,13 +89,11 @@ class Canvas(QWidget):
                     self.line[0] = self.current[-1]
                     self.line[0] = self.current[-1]
                     if self.current.isClosed():
                     if self.current.isClosed():
                         self.finalise(ev)
                         self.finalise(ev)
-                else:
-                    if self.outOfPixmap(pos):
-                        return
+                elif not self.outOfPixmap(pos):
                     self.current = Shape()
                     self.current = Shape()
-                    self.setMouseTracking(True)
-                    self.line.points = [pos, pos]
                     self.current.addPoint(pos)
                     self.current.addPoint(pos)
+                    self.line.points = [pos, pos]
+                    self.setHiding()
             else:
             else:
                 self.selectShape(pos)
                 self.selectShape(pos)
                 self.prevPoint = pos
                 self.prevPoint = pos
@@ -102,6 +102,17 @@ class Canvas(QWidget):
         #    self.selectShape(pos)
         #    self.selectShape(pos)
         #    self.prevPoint = pos
         #    self.prevPoint = pos
 
 
+    def hideBackroundShapes(self, value):
+        self.hideBackround = value
+        if self.selectedShape:
+            # Only hide other shapes if there is a current selection.
+            # Otherwise the user will not be able to select a shape.
+            self.setHiding(True)
+            self.repaint()
+
+    def setHiding(self, enable=True):
+        self._hideBackround = self.hideBackround if enable else False
+
     def mouseDoubleClickEvent(self, ev):
     def mouseDoubleClickEvent(self, ev):
         # FIXME: Don't create shape with 2 vertices only.
         # FIXME: Don't create shape with 2 vertices only.
         if self.current and self.editing():
         if self.current and self.editing():
@@ -118,6 +129,7 @@ class Canvas(QWidget):
                 shape.selected = True
                 shape.selected = True
                 self.selectedShape = shape
                 self.selectedShape = shape
                 self.calculateOffsets(shape, point)
                 self.calculateOffsets(shape, point)
+                self.setHiding()
                 self.repaint()
                 self.repaint()
                 return
                 return
 
 
@@ -151,6 +163,7 @@ class Canvas(QWidget):
         if self.selectedShape:
         if self.selectedShape:
             self.selectedShape.selected = False
             self.selectedShape.selected = False
             self.selectedShape = None
             self.selectedShape = None
+            self.setHiding(False)
 
 
     def deleteSelected(self):
     def deleteSelected(self):
         if self.selectedShape:
         if self.selectedShape:
@@ -181,8 +194,8 @@ class Canvas(QWidget):
 
 
         p.drawPixmap(0, 0, self.pixmap)
         p.drawPixmap(0, 0, self.pixmap)
         Shape.scale = self.scale
         Shape.scale = self.scale
-        if not self.hideShapesWhenNew:
-            for shape in self.shapes:
+        for shape in self.shapes:
+            if shape.selected or not self._hideBackround:
                 shape.paint(p)
                 shape.paint(p)
         if self.current:
         if self.current:
             self.current.paint(p)
             self.current.paint(p)
@@ -215,10 +228,9 @@ class Canvas(QWidget):
         self.shapes.append(self.current)
         self.shapes.append(self.current)
         self.current = None
         self.current = None
         self.setEditing(False)
         self.setEditing(False)
+        self.setHiding(False)
         self.repaint()
         self.repaint()
-        self.hideShapesWhenNew=False
         self.newShape.emit(self.mapToGlobal(ev.pos()))
         self.newShape.emit(self.mapToGlobal(ev.pos()))
-        self.setMouseTracking(False)
 
 
     def closeEnough(self, p1, p2):
     def closeEnough(self, p1, p2):
         #d = distance(p1 - p2)
         #d = distance(p1 - p2)

+ 1 - 1
labelme.py

@@ -234,7 +234,7 @@ class MainWindow(QMainWindow, WindowMixin):
         QTimer.singleShot(0, function)
         QTimer.singleShot(0, function)
 
 
     def hideLabelsToggle(self, value):
     def hideLabelsToggle(self, value):
-        self.canvas.hideShapesWhenNew = value
+        self.canvas.hideBackroundShapes(value)
 
 
     def loadFile(self, filename=None):
     def loadFile(self, filename=None):
         """Load the specified file, or the last opened file if None."""
         """Load the specified file, or the last opened file if None."""