Преглед на файлове

Add close action, fix zoom issue

Partially fix cursor bug as well (still some issues)
Michael Pitidis преди 13 години
родител
ревизия
75194951ee
променени са 4 файла, в които са добавени 39 реда и са изтрити 7 реда
  1. 9 0
      canvas.py
  2. BIN
      icons/close.png
  3. 29 7
      labelme.py
  4. 1 0
      resources.qrc

+ 9 - 0
canvas.py

@@ -53,6 +53,9 @@ class Canvas(QWidget):
         self.setMouseTracking(True)
         self.setFocusPolicy(Qt.WheelFocus)
 
+    def focusOutEvent(self, ev):
+        self.restoreCursor()
+
     def isVisible(self, shape):
         return self.visible.get(shape, True)
 
@@ -450,6 +453,12 @@ class Canvas(QWidget):
         QApplication.restoreOverrideCursor()
 
 
+    def resetState(self):
+        self.restoreCursor()
+        self.pixmap = None
+        self.update()
+
+
 def pp(p):
     return '%.2f, %.2f' % (p.x(), p.y())
 

BIN
icons/close.png


+ 29 - 7
labelme.py

@@ -32,8 +32,8 @@ __appname__ = 'labelme'
 # - [low] Label validation/postprocessing breaks with TAB.
 
 # TODO:
-# - [high] Context menu over labe list.
-# - [high] Issue with image placement when opening new image.
+# - [medium] Zoom should keep the image centered.
+# - [high] Context menu over label list.
 # - [high] Add close image button.
 # - [high] Add recently opened files list in File menu.
 # - [high] Escape should cancel editing mode if no point in canvas.
@@ -128,6 +128,8 @@ class MainWindow(QMainWindow, WindowMixin):
                 'Ctrl+O', 'open', u'Open file')
         save = action('&Save', self.saveFile,
                 'Ctrl+S', 'save', u'Save file')
+        close = action('&Close', self.closeFile,
+                'Ctrl+K', 'close', u'Close current file')
         color1 = action('&Line Color', self.chooseColor1,
                 'Ctrl+C', 'color', u'Choose line color')
         color2 = action('&Fill Color', self.chooseColor2,
@@ -172,7 +174,7 @@ class MainWindow(QMainWindow, WindowMixin):
         labels.setShortcut('Ctrl+L')
 
         # Store actions for further handling.
-        self.actions = struct(save=save, open=open,
+        self.actions = struct(save=save, open=open, close=close,
                 lineColor=color1, fillColor=color2,
                 label=label, delete=delete, zoom=zoom, copy=copy,
                 zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
@@ -183,7 +185,7 @@ class MainWindow(QMainWindow, WindowMixin):
                 file=self.menu('&File'),
                 edit=self.menu('&Image'),
                 view=self.menu('&View'))
-        addActions(self.menus.file, (open, save, quit))
+        addActions(self.menus.file, (open, save, close, quit))
         addActions(self.menus.edit, (label, color1, color2))
         addActions(self.menus.view, (
             labels, None,
@@ -258,6 +260,16 @@ class MainWindow(QMainWindow, WindowMixin):
     def status(self, message, delay=5000):
         self.statusBar().showMessage(message, delay)
 
+    def resetState(self):
+        self.labels.clear()
+        self.items.clear()
+        self.labelList.clear()
+        self.zoomWidget.setValue(100)
+        self.filename = None
+        self.imageData = None
+        self.labelFile = None
+        self.canvas.resetState()
+
     ## Callbacks ##
 
     # React to canvas signals.
@@ -393,6 +405,8 @@ class MainWindow(QMainWindow, WindowMixin):
 
     def loadFile(self, filename=None):
         """Load the specified file, or the last opened file if None."""
+        self.resetState()
+        self.canvas.setEnabled(False)
         if filename is None:
             filename = self.settings['filename']
         filename = unicode(filename)
@@ -422,12 +436,11 @@ class MainWindow(QMainWindow, WindowMixin):
             self.status("Loaded %s" % os.path.basename(unicode(filename)))
             self.image = image
             self.filename = filename
-            self.labels = {}
-            self.labelList.clear()
             self.canvas.loadPixmap(QPixmap.fromImage(image))
             if self.labelFile:
                 self.loadLabels(self.labelFile.shapes)
             self.setClean()
+            self.canvas.setEnabled(True)
             return True
         return False
 
@@ -493,7 +506,9 @@ class MainWindow(QMainWindow, WindowMixin):
         filename = unicode(QFileDialog.getOpenFileName(self,
             '%s - Choose Image', path, filters))
         if filename:
-            self.loadFile(filename)
+            if self.loadFile(filename):
+                self.actions.close.setEnabled(True)
+                self.canvas.setEnabled(True)
 
     def saveFile(self, _value=False):
         assert not self.image.isNull(), "cannot save empty image"
@@ -506,6 +521,13 @@ class MainWindow(QMainWindow, WindowMixin):
             if self.saveLabels(filename):
                 self.setClean()
 
+    def closeFile(self, _value=False):
+        if not self.mayContinue():
+            return
+        self.resetState()
+        self.canvas.setEnabled(False)
+        self.actions.close.setEnabled(False)
+
     # Message Dialogs. #
     def mayContinue(self):
         return not (self.dirty and not self.discardChangesDialog())

+ 1 - 0
resources.qrc

@@ -2,6 +2,7 @@
 <qresource>
 
 <file alias="new">icons/objects.png</file>
+<file alias="close">icons/close.png</file>
 <file alias="fit-width">icons/fit-width.png</file>
 <file alias="fit-window">icons/fit-window.png</file>
 <file alias="hide">icons/eye.png</file>