ソースを参照

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()
+