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

Simplified zooming on cursor to scrollbar manipulation

Martijn Buijs 7 жил өмнө
parent
commit
b02303c6e0
2 өөрчлөгдсөн 19 нэмэгдсэн , 7 устгасан
  1. 16 4
      labelme/app.py
  2. 3 3
      labelme/canvas.py

+ 16 - 4
labelme/app.py

@@ -773,12 +773,24 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
     def addZoom(self, increment=10):
         self.setZoom(self.zoomWidget.value() + increment)
 
-    def zoomRequest(self, delta, pos):
+    def zoomRequest(self, delta, pos, globalPos):
+        canvas_width_old = self.canvas.width()
+
         units = delta * 0.1
         self.addZoom(units)
-        x, y = pos.x(), pos.y()
-        w, h = self.scrollArea.width(), self.scrollArea.height()
-        self.scrollArea.ensureVisible(x, y, w // 2, h // 2)
+
+        canvas_width_new = self.canvas.width()
+        if canvas_width_old != canvas_width_new:
+            canvas_scale_factor = canvas_width_new / canvas_width_old
+
+            x_shift = round(pos.x() * canvas_scale_factor) - pos.x()
+            y_shift = round(pos.y() * canvas_scale_factor) - pos.y()
+
+            sb_h = self.scrollArea.horizontalScrollBar()
+            sb_v = self.scrollArea.verticalScrollBar()
+
+            sb_h.setValue(sb_h.value() + x_shift)
+            sb_v.setValue(sb_v.value() + y_shift)
 
     def setFitWindow(self, value=True):
         if value:

+ 3 - 3
labelme/canvas.py

@@ -29,7 +29,7 @@ CURSOR_GRAB = QtCore.Qt.OpenHandCursor
 
 
 class Canvas(QtWidgets.QWidget):
-    zoomRequest = QtCore.pyqtSignal(int, QtCore.QPointF)
+    zoomRequest = QtCore.pyqtSignal(int, QtCore.QPoint, QtCore.QPoint)
     scrollRequest = QtCore.pyqtSignal(int, int)
     newShape = QtCore.pyqtSignal()
     selectionChanged = QtCore.pyqtSignal(bool)
@@ -497,7 +497,7 @@ class Canvas(QtWidgets.QWidget):
             if QtCore.Qt.ControlModifier == int(mods):
                 # with Ctrl/Command key
                 # zoom
-                self.zoomRequest.emit(delta.y(), ev.pos())
+                self.zoomRequest.emit(delta.y(), ev.pos(), ev.globalPos())
             else:
                 # scroll
                 self.scrollRequest.emit(delta.x(), QtCore.Qt.Horizontal)
@@ -507,7 +507,7 @@ class Canvas(QtWidgets.QWidget):
                 mods = ev.modifiers()
                 if QtCore.Qt.ControlModifier == int(mods):
                     # with Ctrl/Command key
-                    self.zoomRequest.emit(ev.delta(), ev.pos())
+                    self.zoomRequest.emit(ev.delta(), ev.pos(), ev.globalPos())
                 else:
                     self.scrollRequest.emit(
                         ev.delta(),