Skip to content

Commit

Permalink
MARK-6 Можно перемещаться по изображению, зажимая колёсико мыши.
Browse files Browse the repository at this point in the history
  • Loading branch information
Leonid Bystrov committed Oct 17, 2024
1 parent d3f5e3d commit d38e6ca
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
10 changes: 10 additions & 0 deletions labelme/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def __init__(
Qt.Horizontal: scrollArea.horizontalScrollBar(),
}
self.canvas.scrollRequest.connect(self.scrollRequest)
self.canvas.scrollDragRequest.connect(self.scrollDragRequest)

self.canvas.newShape.connect(self.newShape)
self.canvas.shapeMoved.connect(self.setDirty)
Expand Down Expand Up @@ -1422,6 +1423,15 @@ def scrollRequest(self, delta, orientation):
value = bar.value() + bar.singleStep() * units
self.setScroll(orientation, value)

# Обработка события панорамирования
def scrollDragRequest(self, delta, orientation):
bar = self.scrollBars[orientation]
# Новое значение слайдера получается как предыдущее + нормированное смещение по координатам в окне
if orientation == QtCore.Qt.Vertical:
self.setScroll(orientation, bar.value() + delta * bar.height())
else:
self.setScroll(orientation, bar.value() + delta * bar.width())

def setScroll(self, orientation, value):
self.scrollBars[orientation].setValue(int(value))
self.scroll_values[orientation][self.filename] = value
Expand Down
2 changes: 0 additions & 2 deletions labelme/widgets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

from .ai_prompt_widget import AiPromptWidget

from .brightness_contrast_dialog import BrightnessContrastDialog

from .canvas import Canvas

from .color_dialog import ColorDialog
Expand Down
24 changes: 21 additions & 3 deletions labelme/widgets/canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class Canvas(QtWidgets.QWidget):
drawingPolygon = QtCore.Signal(bool)
vertexSelected = QtCore.Signal(bool)
mouseMoved = QtCore.Signal(QtCore.QPointF)
scrollDragRequest = QtCore.Signal(float, int) # Сигнал для панорамирования

CREATE, EDIT = 0, 1

Expand Down Expand Up @@ -228,6 +229,19 @@ def selectedEdge(self):
return self.hEdge is not None

def mouseMoveEvent(self, ev):
"""
Если зажато колёсико мыши, то запускаем панорамирование.
deltaX, deltaY -- нормированное смещение по соответствующей координате
"""
if ev.buttons() & QtCore.Qt.MiddleButton:
QtGui.QCursor.setPos(self.mapToGlobal(self._pan_start))
deltaX = (ev.x() - self._pan_start.x()) / self.cropped_image.width() / self.scale
deltaY = (ev.y() - self._pan_start.y()) / self.cropped_image.height() / self.scale
self.scrollDragRequest.emit(deltaX, QtCore.Qt.Horizontal)
self.scrollDragRequest.emit(deltaY, QtCore.Qt.Vertical)
# self._pan_start = ev.pos() # Позволяет панорамировать относительно зажатого курсора
ev.accept()
return
"""Update line with last point and current coordinates."""
try:
if QT5:
Expand Down Expand Up @@ -379,7 +393,7 @@ def removeSelectedPoint(self):

def zoomShape(self):
"""
"Переходит" к элементу, ч тобы добавлять элементы
"Переходит" к элементу, чтобы добавлять элементы
соответствующего типа.
"""
if len(self.selectedShapes) == 1:
Expand All @@ -389,8 +403,6 @@ def zoomShape(self):
self.visible.update((k, False) for k in self.visible)
self.visible.update((shape.getId(), True) for shape in self.selectedShape.getAllChildren())
self.cropp()
else:
print("Необходимо выбрать 1 примоугольник.")

def unZoomShape(self):
"""
Expand Down Expand Up @@ -481,6 +493,10 @@ def mousePressEvent(self, ev):
self.selectShapePoint(pos, multiple_selection_mode=group_mode)
self.repaint()
self.prevPoint = pos
elif ev.button() == QtCore.Qt.MiddleButton:
self._pan_start = ev.pos() # Точка, относительно которой выполняется панорамирование
self.overrideCursor(CURSOR_MOVE) # Поменять курсор на сжатую ручку
ev.accept()

def mouseReleaseEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton:
Expand All @@ -500,6 +516,8 @@ def mouseReleaseEvent(self, ev):
self.selectionChanged.emit(
[x for x in self.selectedShapes if x != self.hShape]
)
elif ev.button() == QtCore.Qt.MiddleButton:
self.overrideCursor(CURSOR_GRAB) # Панорамирование окончено. Возвращение курсора к обычному виду.

if self.movingShape and self.hShape:
index = self.shapes.index(self.hShape)
Expand Down

0 comments on commit d38e6ca

Please sign in to comment.