Files
Nexus/2023/scripts/animation_tools/dwpicker/interactionmanager.py
2025-11-23 23:31:18 +08:00

86 lines
2.8 KiB
Python

from .pyside import QtWidgets, QtCore
from maya import cmds
from .optionvar import ZOOM_BUTTON
class InteractionManager:
FLY_OVER = 'fly_over'
SELECTION = 'selection'
NAVIGATION = 'navigation'
DRAGGING = 'dragging'
ZOOMING = 'zooming'
def __init__(self):
self.shapes = []
self.left_click_pressed = False
self.right_click_pressed = False
self.middle_click_pressed = False
self.mouse_ghost = None
self.has_shape_hovered = False
self.dragging = False
self.anchor = None
self.zoom_anchor = None
@property
def ctrl_pressed(self):
modifiers = QtWidgets.QApplication.keyboardModifiers()
return modifiers == (modifiers | QtCore.Qt.ControlModifier)
@property
def shift_pressed(self):
modifiers = QtWidgets.QApplication.keyboardModifiers()
return modifiers == (modifiers | QtCore.Qt.ShiftModifier)
@property
def alt_pressed(self):
modifiers = QtWidgets.QApplication.keyboardModifiers()
return modifiers == (modifiers | QtCore.Qt.AltModifier)
def update(
self,
event,
pressed=False,
has_shape_hovered=False,
dragging=False):
self.dragging = dragging
self.has_shape_hovered = has_shape_hovered
self.update_mouse(event, pressed)
def update_mouse(self, event, pressed):
if event.button() == QtCore.Qt.LeftButton:
self.left_click_pressed = pressed
self.anchor = event.pos() if self.dragging else None
elif event.button() == QtCore.Qt.RightButton:
self.right_click_pressed = pressed
elif event.button() == QtCore.Qt.MiddleButton:
self.middle_click_pressed = pressed
if self.zoom_button_pressed:
self.zoom_anchor = event.pos() if pressed else None
@property
def mode(self):
if self.dragging:
return InteractionManager.DRAGGING
elif self.zoom_button_pressed and self.alt_pressed:
return InteractionManager.ZOOMING
elif self.middle_click_pressed:
return InteractionManager.NAVIGATION
elif self.left_click_pressed:
return InteractionManager.SELECTION
self.mouse_ghost = None
return InteractionManager.FLY_OVER
def mouse_offset(self, position):
result = position - self.mouse_ghost if self.mouse_ghost else None
self.mouse_ghost = position
return result or None
@property
def zoom_button_pressed(self):
button = cmds.optionVar(query=ZOOM_BUTTON)
return any((
button == 'left' and self.left_click_pressed,
button == 'middle' and self.middle_click_pressed,
button == 'right' and self.right_click_pressed))