84 lines
3.0 KiB
Python
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)
|