msspec_python3/msspec/msspecgui/datafloweditor/plugwidget.py

84 lines
3.0 KiB
Python

from msspecgui import scenegraph2d
from .widget import Widget
# import dataflow
class PlugWidget(Widget):
'''
The widget representing a plug (input or output) of an operator in the dataflow
'''
DATA_IS_UNAVAILABLE_COLOR = scenegraph2d.Color(128, 64, 64)
DATA_IS_AVAILABLE_COLOR = scenegraph2d.Color(64, 128, 64)
HIGHLITED_COLOR = scenegraph2d.Color(128, 255, 128)
def __init__(self, plug, operator_widget, data_flow_view):
"""
:param plug: the dataflow plug that this widget graphically represents
:type plug: dataflow.Plug
@type plug: dataflow.Plug
:param operator_widget: the operator widget that this plug widget is attached to
:type operator_widget: datafloweditor.OperatorWidget
:param data_flow_view: the dataflowview to which this operator belongs
:type data_flow_view: datafloweditor.DataflowView
"""
super(PlugWidget, self).__init__(data_flow_view)
self.operator_widget = operator_widget
self._plug = plug
self.main_shape_node = None
@property
def plug(self):
"""
:rtype: dataflow.plug.Plug
"""
# plug = dataflow.plug.Plug
return self._plug
@property
def centre_pos(self):
""" Returns the position of the centre of this plug widget
"""
# print('PlugWidget.centre_pos : local_to_parent_matrix = %s' % str(self.scenegraph_group.local_to_parent_matrix()))
# defs = []
# print('PlugWidget.centre_pos : self.scenegraph_group = %s' % str(self.scenegraph_group._xml(defs)))
# defs = []
# print('PlugWidget.centre_pos : self.scenegraph_group.parent = %s' % str(self.scenegraph_group.parent._xml(defs)))
return self.scenegraph_group.local_to_world_matrix().project(x=0, y=0)
def is_connectable(self):
if self._plug.is_connected():
return False
if not self._plug.value_is_available():
return False
return True
def update_appearance(self, mouse_is_above):
color = {False: self.DATA_IS_UNAVAILABLE_COLOR,
True: self.DATA_IS_AVAILABLE_COLOR}[self._plug.value_is_available()]
if mouse_is_above and self.is_connectable():
color = self.HIGHLITED_COLOR
self.main_shape_node.fill = color
def render_to_scene_graph(self, scenegraph_group):
"""
:param scenegraph_group: the group node that contains the drawing of this element
:type scenegraph_group: scenegraph.Group
"""
self.scenegraph_group = scenegraph_group
circle_node = scenegraph2d.Circle()
circle_node.cx = 0.0
circle_node.cy = 0.0
circle_node.r = 7.0
self.main_shape_node = circle_node
scenegraph_group.add_child(circle_node)
self.update_appearance(mouse_is_above=False)
def on_hover(self, is_entering):
self.update_appearance(mouse_is_above=is_entering)