Переглянути джерело

Switch to simpler label dialog

Use the same dialog for creating and editing labels.

The default cancel action when creating a shape is to undo the last
line, since this is less destructive. The user has the option of
deleting the shape after it is created anyway.
Michael Pitidis 13 роки тому
батько
коміт
23e9d00ee3
4 змінених файлів з 19 додано та 76 видалено
  1. 0 5
      canvas.py
  2. 8 57
      labelDialog.py
  3. 3 9
      labelme.py
  4. 8 5
      simpleLabelDialog.py

+ 0 - 5
canvas.py

@@ -488,11 +488,6 @@ class Canvas(QWidget):
         self.line.points = [self.current[-1], self.current[0]]
         self.drawingPolygon.emit(True)
 
-    def deleteLastShape(self):
-        assert self.shapes
-        self.shapes.pop()
-        self.drawingPolygon.emit(False)
-
     def loadPixmap(self, pixmap):
         self.pixmap = pixmap
         self.shapes = []

+ 8 - 57
labelDialog.py

@@ -2,63 +2,14 @@
 from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 
-from lib import newButton, labelValidator
+from lib import newIcon
+from simpleLabelDialog import SimpleLabelDialog
 
-# FIXME:
-# - Use the validator when accepting the dialog.
+BB = QDialogButtonBox
 
-class LabelDialog(QDialog):
-    OK, UNDO, DELETE = range(3)
-
-    def __init__(self, text='', parent=None):
-        super(LabelDialog, self).__init__(parent)
-        self.setWindowTitle("Enter object's label")
-        self.action = self.OK
-        self.edit = QLineEdit()
-        self.edit.setText(text)
-        self.edit.setValidator(labelValidator())
-        self.edit.editingFinished.connect(self.postProcess)
-        layout = QVBoxLayout()
-        layout.addWidget(self.edit)
-        done = newButton('done', icon='done', slot=self.validate)
-        delete = newButton('delete', icon='delete', slot=self.delete)
-        undo = newButton('undo close', icon='undo', slot=self.undo)
-        bb = QHBoxLayout()
-        for btn in done, undo, delete:
-            bb.addWidget(btn)
-        layout.addLayout(bb)
-        self.setLayout(layout)
-
-    def undo(self):
-        self.action = self.UNDO
-        self.reject()
-
-    def delete(self):
-        self.action = self.DELETE
-        self.reject()
-
-    def text(self):
-        return self.edit.text()
-
-    def popUp(self, text='', position=None):
-        # It actually works without moving...
-        self.move(position)
-        self.edit.setText(text)
-        self.edit.setSelection(0, len(self.edit.text()))
-        self.edit.setFocus(Qt.PopupFocusReason)
-        return self.OK if self.exec_() == QDialog.Accepted else self.action
-
-    def validate(self):
-        if self.edit.text().trimmed():
-            self.accept()
-
-    def postProcess(self):
-        self.edit.setText(self.edit.text().trimmed())
-
-    def keyPressEvent(self, ev):
-        if ev.key() == Qt.Key_Escape:
-            self.undo()
-            ev.accept()
-        else:
-            super(LabelDialog, self).keyPressEvent(ev)
+class LabelDialog(SimpleLabelDialog):
+    def __init__(self, parent=None):
+        super(LabelDialog, self).__init__(parent=parent)
+        self.buttonBox.button(BB.Ok).setIcon(newIcon('done'))
+        self.buttonBox.button(BB.Cancel).setIcon(newIcon('undo'))
 

+ 3 - 9
labelme.py

@@ -32,7 +32,6 @@ __appname__ = 'labelme'
 #   alternate files. Either keep enabled, or add "Save As" button.
 
 # TODO:
-# - [high] Switch to simpler label dialog.
 # - [high] Deselect shape when clicking and already selected(?)
 # - [high] Sanitize shortcuts between beginner/advanced mode.
 # - [high] Figure out WhatsThis for help.
@@ -107,7 +106,7 @@ class MainWindow(QMainWindow, WindowMixin):
 
         self.zoomWidget = ZoomWidget()
         self.colorDialog = ColorDialog(parent=self)
-        self.simpleLabelDialog = SimpleLabelDialog(parent=self)
+        self.simpleLabelDialog = LabelDialog(parent=self)
 
         self.canvas = Canvas()
         self.canvas.zoomRequest.connect(self.zoomRequest)
@@ -559,8 +558,7 @@ class MainWindow(QMainWindow, WindowMixin):
 
         position MUST be in global coordinates.
         """
-        action = self.labelDialog.popUp(position=position)
-        if action == self.labelDialog.OK:
+        if self.labelDialog.popUp(position=position):
             self.addLabel(self.canvas.setLastLabel(self.labelDialog.text()))
             if self.beginner(): # Switch to edit mode.
                 self.canvas.setEditing(True)
@@ -568,12 +566,8 @@ class MainWindow(QMainWindow, WindowMixin):
             else:
                 self.actions.editMode.setEnabled(True)
             self.setDirty()
-        elif action == self.labelDialog.UNDO:
-            self.canvas.undoLastLine()
-        elif action == self.labelDialog.DELETE:
-            self.canvas.deleteLastShape()
         else:
-            assert False, "unknown label action"
+            self.canvas.undoLastLine()
 
     def scrollRequest(self, delta, orientation):
         units = - delta / (8 * 15)

+ 8 - 5
simpleLabelDialog.py

@@ -8,7 +8,7 @@ BB = QDialogButtonBox
 
 class SimpleLabelDialog(QDialog):
 
-    def __init__(self, text='', parent=None):
+    def __init__(self, text="Enter object label", parent=None):
         super(SimpleLabelDialog, self).__init__(parent)
         self.edit = QLineEdit()
         self.edit.setText(text)
@@ -16,7 +16,7 @@ class SimpleLabelDialog(QDialog):
         self.edit.editingFinished.connect(self.postProcess)
         layout = QVBoxLayout()
         layout.addWidget(self.edit)
-        bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
+        self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
         bb.accepted.connect(self.validate)
         bb.rejected.connect(self.reject)
         layout.addWidget(bb)
@@ -29,11 +29,14 @@ class SimpleLabelDialog(QDialog):
     def postProcess(self):
         self.edit.setText(self.edit.text().trimmed())
 
-    def popUp(self, text='', pos=None):
+    def popUp(self, text='', position=None):
         self.edit.setText(text)
         self.edit.setSelection(0, len(text))
         self.edit.setFocus(Qt.PopupFocusReason)
-        if pos is not None:
-            self.move(pos)
+        if position is not None:
+            self.move(position)
         return self.edit.text() if self.exec_() else None
 
+    def text(self):
+        return self.edit.text()
+