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

74 lines
2.1 KiB
Python

from .pyside import QtCore
from .geometry import (
DIRECTIONS, get_topleft_rect, get_bottomleft_rect, get_topright_rect,
get_bottomright_rect, get_left_side_rect, get_right_side_rect,
get_top_side_rect, get_bottom_side_rect)
from .shape import rect_intersects_shape
class SelectionSquare():
def __init__(self):
self.rect = None
self.handeling = False
def clicked(self, cursor):
self.handeling = True
self.rect = QtCore.QRectF(cursor, cursor)
def handle(self, cursor):
self.rect.setBottomRight(cursor)
def release(self):
self.handeling = False
self.rect = None
def intersects(self, shape):
if not shape or not self.rect:
return False
return rect_intersects_shape(shape, self.rect)
class Manipulator():
def __init__(self, viewportmapper=None):
self._rect = None
self.viewportmapper = viewportmapper
self._is_hovered = False
@property
def rect(self):
return self._rect
def viewport_handlers(self):
rect = self.viewportmapper.to_viewport_rect(self.rect)
return [
get_topleft_rect(rect) if rect else None,
get_bottomleft_rect(rect) if rect else None,
get_topright_rect(rect) if rect else None,
get_bottomright_rect(rect) if rect else None,
get_left_side_rect(rect) if rect else None,
get_right_side_rect(rect) if rect else None,
get_top_side_rect(rect) if rect else None,
get_bottom_side_rect(rect) if rect else None]
def get_direction(self, viewport_cursor):
if self.rect is None:
return None
for i, rect in enumerate(self.viewport_handlers()):
if rect.contains(viewport_cursor):
return DIRECTIONS[i]
def hovered_rects(self, cursor):
rects = []
for rect in self.viewport_handlers() + [self.rect]:
if not rect:
continue
if rect.contains(cursor):
rects.append(rect)
return rects
def set_rect(self, rect):
self._rect = rect