|
@@ -25,7 +25,8 @@ from labelme.shape import Shape
|
|
|
from labelme.widgets import Canvas
|
|
|
from labelme.widgets import ColorDialog
|
|
|
from labelme.widgets import LabelDialog
|
|
|
-from labelme.widgets import LabelQListWidget
|
|
|
+from labelme.widgets import LabelListWidget
|
|
|
+from labelme.widgets import LabelListWidgetItem
|
|
|
from labelme.widgets import ToolBar
|
|
|
from labelme.widgets import UniqueLabelQListWidget
|
|
|
from labelme.widgets import ZoomWidget
|
|
@@ -88,7 +89,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
flags=self._config['label_flags']
|
|
|
)
|
|
|
|
|
|
- self.labelList = LabelQListWidget()
|
|
|
+ self.labelList = LabelListWidget()
|
|
|
self.lastOpenDir = None
|
|
|
|
|
|
self.flag_dock = self.flag_widget = None
|
|
@@ -100,14 +101,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
self.flag_dock.setWidget(self.flag_widget)
|
|
|
self.flag_widget.itemChanged.connect(self.setDirty)
|
|
|
|
|
|
- self.labelList.itemActivated.connect(self.labelSelectionChanged)
|
|
|
self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged)
|
|
|
self.labelList.itemDoubleClicked.connect(self.editLabel)
|
|
|
- # Connect to itemChanged to detect checkbox changes.
|
|
|
self.labelList.itemChanged.connect(self.labelItemChanged)
|
|
|
- self.labelList.setDragDropMode(
|
|
|
- QtWidgets.QAbstractItemView.InternalMove)
|
|
|
- self.labelList.setParent(self)
|
|
|
+ self.labelList.itemDropped.connect(self.labelOrderChanged)
|
|
|
self.shape_dock = QtWidgets.QDockWidget(
|
|
|
self.tr('Polygon Labels'),
|
|
|
self
|
|
@@ -679,7 +676,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
# Support Functions
|
|
|
|
|
|
def noShapes(self):
|
|
|
- return not self.labelList.itemsToShapes
|
|
|
+ return not len(self.labelList)
|
|
|
|
|
|
def populateModeActions(self):
|
|
|
tool, menu = self.actions.tool, self.actions.menu
|
|
@@ -887,9 +884,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
- def editLabel(self, item=False):
|
|
|
- if item and not isinstance(item, QtWidgets.QListWidgetItem):
|
|
|
- raise TypeError('unsupported type of item: {}'.format(type(item)))
|
|
|
+ def editLabel(self, item=None):
|
|
|
+ if item and not isinstance(item, LabelListWidgetItem):
|
|
|
+ raise TypeError('item must be LabelListWidgetItem type')
|
|
|
|
|
|
if not self.canvas.editing():
|
|
|
return
|
|
@@ -897,7 +894,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
item = self.currentItem()
|
|
|
if item is None:
|
|
|
return
|
|
|
- shape = self.labelList.get_shape_from_item(item)
|
|
|
+ shape = item.shape()
|
|
|
if shape is None:
|
|
|
return
|
|
|
text, flags, group_id = self.labelDialog.popUp(
|
|
@@ -957,8 +954,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
self.canvas.selectedShapes = selected_shapes
|
|
|
for shape in self.canvas.selectedShapes:
|
|
|
shape.selected = True
|
|
|
- item = self.labelList.get_item_from_shape(shape)
|
|
|
- item.setSelected(True)
|
|
|
+ item = self.labelList.findItemByShape(shape)
|
|
|
+ self.labelList.selectItem(item)
|
|
|
self.labelList.scrollToItem(item)
|
|
|
self._noSelectionSlot = False
|
|
|
n_selected = len(selected_shapes)
|
|
@@ -971,16 +968,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
text = shape.label
|
|
|
else:
|
|
|
text = '{} ({})'.format(shape.label, shape.group_id)
|
|
|
- item = QtWidgets.QListWidgetItem()
|
|
|
- item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
|
|
|
- item.setCheckState(Qt.Checked)
|
|
|
- self.labelList.itemsToShapes.append((item, shape))
|
|
|
- self.labelList.addItem(item)
|
|
|
- qlabel = QtWidgets.QLabel()
|
|
|
- qlabel.setText(text)
|
|
|
- qlabel.setAlignment(QtCore.Qt.AlignBottom)
|
|
|
- item.setSizeHint(qlabel.sizeHint())
|
|
|
- self.labelList.setItemWidget(item, qlabel)
|
|
|
+ label_list_item = LabelListWidgetItem(text, shape)
|
|
|
+ self.labelList.addItem(label_list_item)
|
|
|
if not self.uniqLabelList.findItemsByLabel(shape.label):
|
|
|
item = self.uniqLabelList.createItemFromLabel(shape.label)
|
|
|
self.uniqLabelList.addItem(item)
|
|
@@ -995,7 +984,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
return
|
|
|
|
|
|
r, g, b = rgb
|
|
|
- qlabel.setText(
|
|
|
+ label_list_item.setText(
|
|
|
'{} <font color="#{:02x}{:02x}{:02x}">●</font>'
|
|
|
.format(text, r, g, b)
|
|
|
)
|
|
@@ -1021,7 +1010,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
|
def remLabels(self, shapes):
|
|
|
for shape in shapes:
|
|
|
- item = self.labelList.get_item_from_shape(shape)
|
|
|
+ item = self.labelList.findItemByShape(shape)
|
|
|
self.labelList.takeItem(self.labelList.row(item))
|
|
|
|
|
|
def loadShapes(self, shapes, replace=True):
|
|
@@ -1086,7 +1075,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
))
|
|
|
return data
|
|
|
|
|
|
- shapes = [format_shape(shape) for shape in self.labelList.shapes]
|
|
|
+ shapes = [format_shape(item.shape()) for item in self.labelList]
|
|
|
flags = {}
|
|
|
for i in range(self.flag_widget.count()):
|
|
|
item = self.flag_widget.item(i)
|
|
@@ -1140,17 +1129,20 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
if self.canvas.editing():
|
|
|
selected_shapes = []
|
|
|
for item in self.labelList.selectedItems():
|
|
|
- shape = self.labelList.get_shape_from_item(item)
|
|
|
- selected_shapes.append(shape)
|
|
|
+ selected_shapes.append(item.shape())
|
|
|
if selected_shapes:
|
|
|
self.canvas.selectShapes(selected_shapes)
|
|
|
else:
|
|
|
self.canvas.deSelectShape()
|
|
|
|
|
|
def labelItemChanged(self, item):
|
|
|
- shape = self.labelList.get_shape_from_item(item)
|
|
|
+ shape = item.shape()
|
|
|
self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked)
|
|
|
|
|
|
+ def labelOrderChanged(self):
|
|
|
+ self.setDirty()
|
|
|
+ self.canvas.loadShapes([item.shape() for item in self.labelList])
|
|
|
+
|
|
|
# Callback functions:
|
|
|
|
|
|
def newShape(self):
|
|
@@ -1247,7 +1239,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
self.adjustScale()
|
|
|
|
|
|
def togglePolygons(self, value):
|
|
|
- for item, shape in self.labelList.itemsToShapes:
|
|
|
+ for item in self.labelList:
|
|
|
item.setCheckState(Qt.Checked if value else Qt.Unchecked)
|
|
|
|
|
|
def loadFile(self, filename=None):
|
|
@@ -1327,7 +1319,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
if self.labelFile.flags is not None:
|
|
|
flags.update(self.labelFile.flags)
|
|
|
self.loadFlags(flags)
|
|
|
- if self._config['keep_prev'] and not self.labelList.shapes:
|
|
|
+ if self._config['keep_prev'] and self.noShapes():
|
|
|
self.loadShapes(prev_shapes, replace=False)
|
|
|
self.setDirty()
|
|
|
else:
|
|
@@ -1600,7 +1592,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
|
# Message Dialogs. #
|
|
|
def hasLabels(self):
|
|
|
- if not self.labelList.itemsToShapes:
|
|
|
+ if self.noShapes():
|
|
|
self.errorMessage(
|
|
|
'No objects labeled',
|
|
|
'You must label at least one object to save the file.')
|