فهرست منبع

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>