28 lines
1.0 KiB
Python
28 lines
1.0 KiB
Python
"""Qt presentation port: wheel pans X; Ctrl+wheel pans Y, never zooms."""
|
|
from PySide6.QtCore import Qt, Signal
|
|
from PySide6.QtWidgets import QScrollArea
|
|
|
|
|
|
class PlotScrollArea(QScrollArea):
|
|
user_scrolled = Signal(str)
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self._remainder = {'x': 0., 'y': 0.}
|
|
|
|
def wheelEvent(self, event):
|
|
axis = 'y' if event.modifiers() & Qt.KeyboardModifier.ControlModifier else 'x'
|
|
bar = self.verticalScrollBar() if axis == 'y' else self.horizontalScrollBar()
|
|
pixels, angle = event.pixelDelta(), event.angleDelta()
|
|
if not pixels.isNull():
|
|
delta = pixels.y() if pixels.y() else pixels.x()
|
|
else:
|
|
delta = (angle.y() if angle.y() else angle.x()) / 120. * 60.
|
|
self._remainder[axis] -= delta
|
|
movement = int(self._remainder[axis])
|
|
self._remainder[axis] -= movement
|
|
if delta:
|
|
self.user_scrolled.emit(axis)
|
|
bar.setValue(bar.value()+movement)
|
|
event.accept()
|