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