|
@@ -97,6 +97,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
|
self._noSelectionSlot = False
|
|
|
|
|
|
+ self._copied_shapes = None
|
|
|
+
|
|
|
# Main widgets and related state.
|
|
|
self.labelDialog = LabelDialog(
|
|
|
parent=self,
|
|
@@ -383,14 +385,30 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
self.tr("Delete the selected polygons"),
|
|
|
enabled=False,
|
|
|
)
|
|
|
- copy = action(
|
|
|
+ duplicate = action(
|
|
|
self.tr("Duplicate Polygons"),
|
|
|
- self.copySelectedShape,
|
|
|
+ self.duplicateSelectedShape,
|
|
|
shortcuts["duplicate_polygon"],
|
|
|
"copy",
|
|
|
self.tr("Create a duplicate of the selected polygons"),
|
|
|
enabled=False,
|
|
|
)
|
|
|
+ copy = action(
|
|
|
+ self.tr("Copy Polygons"),
|
|
|
+ self.copySelectedShape,
|
|
|
+ shortcuts["copy_polygon"],
|
|
|
+ "copy_clipboard",
|
|
|
+ self.tr("Copy selected polygons to clipboard"),
|
|
|
+ enabled=False,
|
|
|
+ )
|
|
|
+ paste = action(
|
|
|
+ self.tr("Paste Polygons"),
|
|
|
+ self.pasteSelectedShape,
|
|
|
+ shortcuts["paste_polygon"],
|
|
|
+ "paste",
|
|
|
+ self.tr("Paste copied polygons"),
|
|
|
+ enabled=False,
|
|
|
+ )
|
|
|
undoLastPoint = action(
|
|
|
self.tr("Undo last point"),
|
|
|
self.canvas.undoLastPoint,
|
|
@@ -571,7 +589,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
toggleKeepPrevMode=toggle_keep_prev_mode,
|
|
|
delete=delete,
|
|
|
edit=edit,
|
|
|
+ duplicate=duplicate,
|
|
|
copy=copy,
|
|
|
+ paste=paste,
|
|
|
undoLastPoint=undoLastPoint,
|
|
|
undo=undo,
|
|
|
removePoint=removePoint,
|
|
@@ -598,7 +618,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
# XXX: need to add some actions here to activate the shortcut
|
|
|
editMenu=(
|
|
|
edit,
|
|
|
- copy,
|
|
|
+ duplicate,
|
|
|
delete,
|
|
|
None,
|
|
|
undo,
|
|
@@ -618,7 +638,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
createLineStripMode,
|
|
|
editMode,
|
|
|
edit,
|
|
|
+ duplicate,
|
|
|
copy,
|
|
|
+ paste,
|
|
|
delete,
|
|
|
undo,
|
|
|
undoLastPoint,
|
|
@@ -718,7 +740,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
None,
|
|
|
createMode,
|
|
|
editMode,
|
|
|
+ duplicate,
|
|
|
copy,
|
|
|
+ paste,
|
|
|
delete,
|
|
|
undo,
|
|
|
brightnessContrast,
|
|
@@ -1097,6 +1121,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
self._noSelectionSlot = False
|
|
|
n_selected = len(selected_shapes)
|
|
|
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)
|
|
|
|
|
@@ -1259,13 +1284,21 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
)
|
|
|
return False
|
|
|
|
|
|
- def copySelectedShape(self):
|
|
|
- added_shapes = self.canvas.copySelectedShapes()
|
|
|
+ def duplicateSelectedShape(self):
|
|
|
+ added_shapes = self.canvas.duplicateSelectedShapes()
|
|
|
self.labelList.clearSelection()
|
|
|
for shape in added_shapes:
|
|
|
self.addLabel(shape)
|
|
|
self.setDirty()
|
|
|
|
|
|
+ def pasteSelectedShape(self):
|
|
|
+ self.loadShapes(self._copied_shapes, replace=False)
|
|
|
+ self.setDirty()
|
|
|
+
|
|
|
+ def copySelectedShape(self):
|
|
|
+ self._copied_shapes = [s.copy() for s in self.canvas.selectedShapes]
|
|
|
+ self.actions.paste.setEnabled(len(self._copied_shapes) > 0)
|
|
|
+
|
|
|
def labelSelectionChanged(self):
|
|
|
if self._noSelectionSlot:
|
|
|
return
|