Эх сурвалжийг харах

Support multiple edit of annotations

Kentaro Wada 11 сар өмнө
parent
commit
d220eb7914
1 өөрчлөгдсөн 78 нэмэгдсэн , 20 устгасан
  1. 78 20
      labelme/app.py

+ 78 - 20
labelme/app.py

@@ -1087,27 +1087,78 @@ class MainWindow(QtWidgets.QMainWindow):
                     return True
         return False
 
-    def editLabel(self, item=None):
-        if item and not isinstance(item, LabelListWidgetItem):
-            raise TypeError("item must be LabelListWidgetItem type")
-
+    def editLabel(self, value=None):
         if not self.canvas.editing():
             return
-        if not item:
-            item = self.currentItem()
-        if item is None:
-            return
-        shape = item.shape()
-        if shape is None:
+
+        items = self.labelList.selectedItems()
+        if not items:
+            logger.warning("No label is selected, so cannot edit label.")
             return
+
+        shape = items[0].shape()
+
+        if len(items) == 1:
+            edit_text = True
+            edit_flags = True
+            edit_group_id = True
+            edit_description = True
+        else:
+            edit_text = all(item.shape().label == shape.label for item in items[1:])
+            edit_flags = all(item.shape().flags == shape.flags for item in items[1:])
+            edit_group_id = all(
+                item.shape().group_id == shape.group_id for item in items[1:]
+            )
+            edit_description = all(
+                item.shape().description == shape.description for item in items[1:]
+            )
+
+        if not edit_text:
+            self.labelDialog.edit.setDisabled(True)
+            self.labelDialog.labelList.setDisabled(True)
+        if not edit_flags:
+            for i in range(self.labelDialog.flagsLayout.count()):
+                self.labelDialog.flagsLayout.itemAt(i).setDisabled(True)
+        if not edit_group_id:
+            self.labelDialog.edit_group_id.setDisabled(True)
+        if not edit_description:
+            self.labelDialog.editDescription.setDisabled(True)
+
         text, flags, group_id, description = self.labelDialog.popUp(
-            text=shape.label,
-            flags=shape.flags,
-            group_id=shape.group_id,
-            description=shape.description,
-        )
+            text=shape.label if edit_text else "",
+            flags=shape.flags if edit_flags else None,
+            group_id=shape.group_id if edit_group_id else None,
+            description=shape.description if edit_description else None,
+        )
+
+        if not edit_text:
+            self.labelDialog.edit.setDisabled(False)
+            self.labelDialog.labelList.setDisabled(False)
+        if not edit_flags:
+            for i in range(self.labelDialog.flagsLayout.count()):
+                self.labelDialog.flagsLayout.itemAt(i).setDisabled(False)
+        if not edit_group_id:
+            self.labelDialog.edit_group_id.setDisabled(False)
+        if not edit_description:
+            self.labelDialog.editDescription.setDisabled(False)
+
         if text is None:
+            assert flags is None
+            assert group_id is None
+            assert description is None
             return
+
+        self.canvas.storeShapes()
+        for item in items:
+            self._update_item(
+                item=item,
+                text=text if edit_text else None,
+                flags=flags if edit_flags else None,
+                group_id=group_id if edit_group_id else None,
+                description=description if edit_description else None,
+            )
+
+    def _update_item(self, item, text, flags, group_id, description):
         if not self.validateLabel(text):
             self.errorMessage(
                 self.tr("Invalid label"),
@@ -1116,10 +1167,17 @@ class MainWindow(QtWidgets.QMainWindow):
                 ),
             )
             return
-        shape.label = text
-        shape.flags = flags
-        shape.group_id = group_id
-        shape.description = description
+
+        shape = item.shape()
+
+        if text is not None:
+            shape.label = text
+        if flags is not None:
+            shape.flags = flags
+        if group_id is not None:
+            shape.group_id = group_id
+        if description is not None:
+            shape.description = description
 
         self._update_shape_color(shape)
         if shape.group_id is None:
@@ -1176,7 +1234,7 @@ class MainWindow(QtWidgets.QMainWindow):
         self.actions.delete.setEnabled(n_selected)
         self.actions.duplicate.setEnabled(n_selected)
         self.actions.copy.setEnabled(n_selected)
-        self.actions.edit.setEnabled(n_selected == 1)
+        self.actions.edit.setEnabled(n_selected)
 
     def addLabel(self, shape):
         if shape.group_id is None: