Source code for RWESharp.widgets.SimpleViewport
from __future__ import annotations
from PySide6.QtCore import QPoint, Qt, QPointF
from PySide6.QtGui import QColor, QPixmap
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView, QGraphicsItem
from RWESharp.info import CELLSIZE
[docs]
class SimpleViewport(QGraphicsView):
[docs]
def __init__(self, parent=None):
super().__init__(parent)
self.workscene = QGraphicsScene(self)
self.setScene(self.workscene)
# self.origin = self.workscene.addEllipse(0, 0, 1, 1, QColor(0, 0, 0, 0))
self.topleft = self.workscene.addEllipse(0, 0, 1, 1, QColor(0, 0, 0, 0))
self.lastpos = QPoint()
self.mouse_pos = QPoint()
self.manager = None
self.setMouseTracking(True)
self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.zoom = 1
self.items: list[QGraphicsItem] = []
[docs]
def add_manager(self, manager):
self.manager = manager
self.workscene.setSceneRect(0, 0, 1000, 1000)
[docs]
def mouseMoveEvent(self, event):
self.mouse_pos = event.pos()
offset = event.pos() - self.lastpos
if event.buttons() & Qt.MouseButton.AllButtons:
self.set_pos(self.topleft.pos() + offset)
self.lastpos = event.pos()
[docs]
def set_pos(self, pos: QPointF | QPoint | None = None):
if pos is None:
pos = self.topleft.pos()
self.topleft.setPos(pos)
for i in self.items:
i.setPos(pos + (i.data(1) if isinstance(i.data(1), (QPoint, QPointF)) else QPoint(0, 0)) * self.zoom * (i.data(3) if isinstance(i.data(3), (int, float)) else 1))
[docs]
def set_zoom(self):
for i in self.items:
i.setScale(self.zoom * (i.data(2) if isinstance(i.data(2), (int, float)) else 1) + (i.data(0) if isinstance(i.data(0), (int, float)) else 0))
[docs]
def ratio1(self):
self.zoom = 1
self.topleft.setPos(0, 0)
self.set_zoom()
self.set_pos()
[docs]
def mousePressEvent(self, event):
self.setCursor(Qt.CursorShape.SizeAllCursor)
[docs]
def mouseReleaseEvent(self, event):
self.setCursor(Qt.CursorShape.ArrowCursor)
[docs]
def wheelEvent(self, event):
pointbefore = self.viewport_to_editor_float(self.mouse_pos.toPointF())
self.zoom = max(0.01, self.zoom + (event.angleDelta().y() * (-1 if event.inverted() else 1) / 800))
offset = (self.viewport_to_editor_float(self.mouse_pos.toPointF()) - pointbefore) * CELLSIZE * self.zoom
self.set_pos(self.topleft.pos() + offset)
self.set_zoom()
[docs]
def viewport_to_editor_float(self, point: QPointF) -> QPointF:
npoint = point + QPointF(self.horizontalScrollBar().value(), self.verticalScrollBar().value()) - self.topleft.pos()
npoint.setX(npoint.x() / (CELLSIZE * self.zoom))
npoint.setY(npoint.y() / (CELLSIZE * self.zoom))
return npoint