Source code for RWESharp.Renderable.Handle
from RWS.Renderable import Renderable
from RWS.Utils import closest_line
from PySide6.QtWidgets import QGraphicsRectItem, QGraphicsSceneMouseEvent
from PySide6.QtGui import QPen, QBrush, QColor, QGuiApplication
from PySide6.QtCore import Qt, Signal, QPointF, QObject
[docs]
class HandleItem(QGraphicsRectItem, QObject):
posChanged = Signal(QPointF)
posChangedRelative = Signal(QPointF)
mouseReleased = Signal(QPointF)
mousePressed = Signal(QPointF)
[docs]
def __init__(self, handle):
QGraphicsRectItem.__init__(self, -5, -5, 10, 10)
QObject.__init__(self)
self.handle = handle
self.setPen(QPen(QColor(0, 0, 0), 2))
self.setBrush(QBrush(QColor(255, 255, 255)))
self.setAcceptTouchEvents(True)
# self.setAcceptHoverEvents(True)
self.setAcceptedMouseButtons(Qt.MouseButton.LeftButton)
self.reserved_pos = QPointF()
[docs]
def mouseMoveEvent(self, event):
#super().mouseMoveEvent(event)
p = event.pos() * (1 / self.handle.zoom)
self.movehandle(p, True, True)
[docs]
def movehandle(self, p, emit=False, emitrel=False):
if emitrel:
self.posChangedRelative.emit(p)
sh = QGuiApplication.keyboardModifiers() & Qt.KeyboardModifier.ShiftModifier
if sh:
p = closest_line(self.handle.offset + p, self.reserved_pos).p2()
self.handle.setPos(p)
if emit:
self.posChanged.emit(self.handle.offset)
return
self.handle.setPos(self.handle.offset + p)
if emit:
self.posChanged.emit(self.handle.offset)
[docs]
def mousePressEvent(self, event):
event.accept()
self.reserved_pos = self.handle.offset
self.mousePressed.emit(self.handle.offset)
self.setCursor(Qt.CursorShape.ClosedHandCursor)
[docs]
def mouseReleaseEvent(self, event):
self.unsetCursor()
self.mouseReleased.emit(self.handle.offset)
[docs]
class Handle(Renderable):
[docs]
def __init__(self, module, add_renderable: bool = True):
super().__init__(module, -100, False)
self.handle = HandleItem(self)
self.handle.setZValue(self.depth)
self.handle.setPos(self.offset)
self.handle_offset = QPointF()
if add_renderable:
module.add_renderable(self)
[docs]
def init_graphics(self, viewport):
super().init_graphics(viewport)
self.viewport.workscene.addItem(self.handle)
[docs]
def remove_graphics(self, viewport):
super().remove_graphics(viewport)
viewport.workscene.removeItem(self.handle)
[docs]
def zoom_event(self):
self.handle.setPos(self.actual_offset)
self.handle.setScale(self.scale)
[docs]
def move_event(self):
super().move_event()
self.handle.setPos(self.actual_offset)
[docs]
def setPos(self, pos):
super().setPos(pos)
if self.handle is not None:
self.handle.setPos(self.actual_offset)
[docs]
def setOpacity(self, opacity):
super().setOpacity(opacity)
self.handle.setOpacity(self.opacity)
@property
def previous_pos(self):
return self.handle.reserved_pos
@property
def actual_offset(self):
return super().actual_offset + self.handle_offset * self.zoom
@property
def posChanged(self) -> Signal:
return self.handle.posChanged
@property
def posChangedRelative(self) -> Signal:
return self.handle.posChangedRelative
@property
def mousePressed(self) -> Signal:
return self.handle.mousePressed
@property
def mouseReleased(self) -> Signal:
return self.handle.mouseReleased