Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion labelme/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ def __init__(
)
zoomOrg = action(
self.tr("&Original size"),
functools.partial(self.setZoom, 100),
self.setOriginalSize,
shortcuts["zoom_to_original"],
"zoom",
self.tr("Zoom to original size"),
Expand Down Expand Up @@ -1582,8 +1582,10 @@ def setScroll(self, orientation, value):
self.scroll_values[orientation][self.filename] = value

def setZoom(self, value):
self.actions.zoomOrg.setChecked(False)
self.actions.fitWidth.setChecked(False)
self.actions.fitWindow.setChecked(False)
self.canvas.setEnableDragBuffer(value > 100)
self.zoomMode = self.MANUAL_ZOOM
self.zoomWidget.setValue(value)
self.zoom_values[self.filename] = (self.zoomMode, value)
Expand All @@ -1602,6 +1604,7 @@ def zoomRequest(self, delta, pos):
if delta < 0:
units = 0.9
self.addZoom(units)
self.canvas.adjustSize()

canvas_width_new = self.canvas.width()
if canvas_width_old != canvas_width_new:
Expand All @@ -1619,16 +1622,24 @@ def zoomRequest(self, delta, pos):
self.scrollBars[Qt.Vertical].value() + y_shift,
)

def setOriginalSize(self, value=True):
if value:
self.actions.zoomOrg.setChecked(False)
self.canvas.setEnableDragBuffer(False)
self.setZoom(100)

def setFitWindow(self, value=True):
if value:
self.actions.fitWidth.setChecked(False)
self.zoomMode = self.FIT_WINDOW if value else self.MANUAL_ZOOM
self.canvas.setEnableDragBuffer(False)
self.adjustScale()

def setFitWidth(self, value=True):
if value:
self.actions.fitWindow.setChecked(False)
self.zoomMode = self.FIT_WIDTH if value else self.MANUAL_ZOOM
self.canvas.setEnableDragBuffer(False)
self.adjustScale()

def enableKeepPrevScale(self, enabled):
Expand Down
32 changes: 29 additions & 3 deletions labelme/widgets/canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ def __init__(self, *args, **kwargs):
self.line = Shape()
self.prevPoint = QPointF()
self.prevMovePoint = QPointF()
self.prevDragPoint = QPointF()
self.offsets = QPointF(), QPointF()
self.scale = 1.0
self.pixmap = QtGui.QPixmap()
Expand All @@ -117,6 +118,8 @@ def __init__(self, *args, **kwargs):
self.hShapeIsSelected = False
self._painter = QtGui.QPainter()
self._cursor = CURSOR_DEFAULT
self.drag = False
self.enableDragBuffer = False
# Menus:
# 0: right-click without selection and dragging of shapes
# 1: right-click with selection and dragging of shapes
Expand Down Expand Up @@ -308,6 +311,14 @@ def mouseMoveEvent(self, ev):

is_shift_pressed = ev.modifiers() & Qt.ShiftModifier

# Drag to move canvas
if self.drag:
self.overrideCursor(CURSOR_GRAB)
delta = pos - self.prevDragPoint

self.scrollRequest.emit(int(delta.x()), Qt.Horizontal)
self.scrollRequest.emit(int(delta.y()), Qt.Vertical)

# Polygon drawing.
if self.drawing():
if self.createMode in ["ai_polygon", "ai_mask"]:
Expand Down Expand Up @@ -563,9 +574,13 @@ def mousePressEvent(self, ev):
self.selectShapePoint(pos, multiple_selection_mode=group_mode)
self.repaint()
self.prevPoint = pos
self._update_status()
elif ev.button() == Qt.MiddleButton:
self.overrideCursor(CURSOR_GRAB)
self.prevDragPoint = pos
self.drag = True

def mouseReleaseEvent(self, ev):
pos: QPointF = self.transformPos(ev.localPos())
if ev.button() == Qt.RightButton:
menu = self.menus[len(self.selectedShapesCopy) > 0]
self.restoreCursor()
Expand All @@ -583,6 +598,8 @@ def mouseReleaseEvent(self, ev):
self.selectionChanged.emit(
[x for x in self.selectedShapes if x != self.hShape]
)
elif ev.button() == Qt.MiddleButton:
self.drag = False

if self.movingShape and self.hShape:
index = self.shapes.index(self.hShape)
Expand Down Expand Up @@ -841,6 +858,9 @@ def transformPos(self, point: QPointF) -> QPointF:
"""Convert from widget-logical coordinates to painter-logical ones."""
return point / self.scale - self.offsetToCenter()

def setEnableDragBuffer(self, enabled: bool):
self.enableDragBuffer = enabled

def offsetToCenter(self) -> QPointF:
s = self.scale
area = super().size()
Expand Down Expand Up @@ -941,8 +961,14 @@ def sizeHint(self):

def minimumSizeHint(self):
if self.pixmap:
return self.scale * self.pixmap.size()
return super().minimumSizeHint()
min_size = self.scale * self.pixmap.size()
if self.enableDragBuffer:
# When drag buffer should be enabled, add a bit of buffer around the image
# This lets dragging the image around have a bit of give on the edges
min_size = 1.167 * min_size

return min_size
return super(Canvas, self).minimumSizeHint()

def wheelEvent(self, ev: QtGui.QWheelEvent) -> None:
mods: Qt.KeyboardModifiers = ev.modifiers()
Expand Down