Newer
Older
"""B-ASIC Scheduler-gui Graphics Graph Event Module.
Contains event filters and handlers for GraphicsGraphItem objects."""
import os
import sys
from typing import Any, Optional
from pprint import pprint
from typing import Any, AnyStr, Generic, Protocol, TypeVar, Union, Optional, overload, Final, final
# from typing_extensions import Self, Final, Literal, LiteralString, TypeAlias, final
import numpy as np
from copy import deepcopy
from itertools import combinations
import qtpy
from qtpy import QtCore
from qtpy import QtGui
from qtpy import QtWidgets
# QGraphics and QPainter imports
from qtpy.QtCore import (
Qt, QObject, QRect, QRectF, QPoint, QSize, QSizeF, QByteArray, Slot, QEvent)
from qtpy.QtGui import (
QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QIcon, QPixmap,
from qtpy.QtWidgets import (
QGraphicsView, QGraphicsScene, QGraphicsWidget,
QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout,
QGraphicsItem, QGraphicsItemGroup, QGraphicsPathItem, QGraphicsLineItem, QGraphicsRectItem,
QStyleOptionGraphicsItem, QWidget,
QGraphicsObject, QGraphicsSceneMouseEvent, QGraphicsSceneHoverEvent, QGraphicsSceneContextMenuEvent,
QGraphicsSceneDragDropEvent, QGraphicsSceneWheelEvent)
from abc import ABC
from graphics_component_item import GraphicsComponentItem
# _components: list[GraphicsComponentItem]
_current_pos: QPointF
# def __init__(self, parent: QGraphicsItem = None):
# super().__init__(parent)
# self._current_pos: QPointF()
# self.setFlag(QGraphicsItem.ItemIsMovable)
# self.setFlag(QGraphicsItem.ItemIsSelectable)
# self.setAcceptHoverEvents(True)
# self.setFlag(QGraphicsItem.ItemIsMovable)
# self.setFlag(QGraphicsItem.ItemIsSelectable)
# self.setAcceptHoverEvents(True)
# print(f'GraphicsGraphItem.handlesChildEvents(): {self.handlesChildEvents()}')
# self.setHandlesChildEvents(True) # PySide2 QGraphicsItemGroup default: true. PyQt5 not an option
#################
#### Filters ####
#################
def installSceneEventFilters(self) -> None:
"""Installs an event filter for 'item' on 'self', causing
all events for 'item' to first pass through 'self's
sceneEventFilter() function."""
def removeSceneEventFilters(self) -> None:
"""Removes an event filter on 'item' from 'self'."""
def sceneEventFilter(self, item: QGraphicsItem, event: QEvent) -> bool:
"""Returns true if the event was filtered (i.e. stopped), otherwise false.
If false is returned, the event is forwarded to the appropriate child in
the event chain."""
QEvent.FocusIn: self.comp_focusInEvent,
QEvent.GraphicsSceneContextMenu: self.comp_contextMenuEvent,
QEvent.GraphicsSceneDragEnter: self.comp_dragEnterEvent,
QEvent.GraphicsSceneDragMove: self.comp_dragMoveEvent,
QEvent.GraphicsSceneDragLeave: self.comp_dragLeaveEvent,
QEvent.GraphicsSceneDrop: self.comp_dropEvent,
QEvent.GraphicsSceneHoverEnter: self.comp_hoverEnterEvent,
QEvent.GraphicsSceneHoverMove: self.comp_hoverMoveEvent,
QEvent.GraphicsSceneHoverLeave: self.comp_hoverLeaveEvent,
QEvent.GraphicsSceneMouseMove: self.comp_mouseMoveEvent,
QEvent.GraphicsSceneMousePress: self.comp_mousePressEvent,
QEvent.GraphicsSceneMouseRelease: self.comp_mouseReleaseEvent,
QEvent.GraphicsSceneMouseDoubleClick: self.comp_mouseDoubleClickEvent,
QEvent.GraphicsSceneWheel: self.comp_wheelEvent
handler = switch.get(event.type())
else:
raise TypeError
return False # returns False if event is ignored and pass through event to its child
# def sceneEvent(self, event: QEvent) -> bool:
# print(f'sceneEvent() --> {event.type()}')
# # event.accept()
# # QApplication.sendEvent(self.scene(), event)
# return False
###############################################
#### Event Handlers: GraphicsComponentItem ####
###############################################
def comp_focusInEvent(self, event: QFocusEvent) -> None: ...
def comp_contextMenuEvent(self, event: QGraphicsSceneContextMenuEvent) -> None: ...
def comp_dragEnterEvent(self, event: QGraphicsSceneDragDropEvent) -> None: ...
def comp_dragMoveEvent(self, event: QGraphicsSceneDragDropEvent) -> None: ...
def comp_dragLeaveEvent(self, event: QGraphicsSceneDragDropEvent) -> None: ...
def comp_dropEvent(self, event: QGraphicsSceneDragDropEvent) -> None: ...
def comp_hoverEnterEvent(self, event: QGraphicsSceneHoverEvent) -> None:
"""Changes the cursor to OpenHandCursor when hovering an object."""
self.setCursor(QCursor(Qt.OpenHandCursor))
def comp_hoverMoveEvent(self, event: QGraphicsSceneHoverEvent) -> None: ...
def comp_hoverLeaveEvent(self, event: QGraphicsSceneHoverEvent) -> None:
"""Changes the cursor to ArrowCursor when leaving an object."""
self.setCursor(QCursor(Qt.ArrowCursor))
def comp_mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
"""Set the position of the graphical element in the graphic scene,
translate coordinates of the cursor within the graphic element
in the coordinate system of the parent object."""
# Qt.DragMoveCursor
# button = event.button()
item = self.scene().mouseGrabberItem()
dx = (item.mapToParent(event.pos()) - self._current_pos).x()
self._current_pos.setX(self._current_pos.x() + 1.0)
elif dx < -0.505:
pos = item.x() - 1.0
def comp_mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None:
"""Changes the cursor to ClosedHandCursor when grabbing an object."""
item = self.scene().mouseGrabberItem()
self._current_pos = item.mapToParent(event.pos())
def comp_mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent) -> None:
"""Changes the cursor to OpenHandCursor when releasing an object."""
def comp_mouseDoubleClickEvent(self, event: QGraphicsSceneMouseEvent) -> None: ...
def comp_wheelEvent(self, event: QGraphicsSceneWheelEvent) -> None: ...
###############################################
#### Event Handlers: GraphicsComponentItem ####
###############################################