Source code for ironflow.gui.canvas_widgets.ports
# coding: utf-8
# Copyright (c) Max-Planck-Institut für Eisenforschung GmbH - Computational Materials Design (CM) Department
# Distributed under the terms of "New BSD License", see the LICENSE file.
"""
Canvas widgets for ryven IO ports.
"""
from __future__ import annotations
from typing import TYPE_CHECKING, Optional
from ironflow.gui.canvas_widgets.base import HideableWidget, CanvasWidget
from ironflow.gui.canvas_widgets.layouts import PortLayout
if TYPE_CHECKING:
from ironflow.gui.canvas_widgets.flow import FlowCanvas
from ironflow.gui.canvas_widgets.base import Number
from ironflow.model import NodePort
[docs]class PortWidget(HideableWidget):
def __init__(
self,
x: Number,
y: Number,
parent: FlowCanvas | CanvasWidget,
layout: PortLayout,
port: NodePort,
selected: bool = False,
title: Optional[str] = None,
hidden_x: Optional[Number] = None,
hidden_y: Optional[Number] = None,
radius: Number = 10,
):
super().__init__(
x=x,
y=y,
parent=parent,
layout=layout,
selected=selected,
title=title if title is not None else port.label_str,
hidden_x=hidden_x,
hidden_y=hidden_y,
)
self.radius = radius
self.port = port
[docs] def on_click(
self, last_selected_object: Optional[CanvasWidget]
) -> PortWidget | None:
if last_selected_object == self:
self.deselect()
return None
elif isinstance(last_selected_object, PortWidget):
self.flow.connect_nodes(last_selected_object.port, self.port)
self.deselect_all()
return None
else:
if last_selected_object is not None:
last_selected_object.deselect()
self.select()
return self
[docs] def draw_shape(self) -> None:
self.canvas.fill_style = (
self.layout.selected_color
if self.selected
else self.layout.background_color
)
self.canvas.fill_circle(self.x, self.y, self.radius)
[docs] def draw_title(self) -> None:
self.canvas.font = self.layout.font_string
self.canvas.fill_style = self.layout.font_color
self.canvas.fill_text(
self.title, self.x + self.radius + 3, self.y + self.radius // 2
)
def _is_at_xy(self, x_in: Number, y_in: Number) -> bool:
return (x_in - self.x) ** 2 + (y_in - self.y) ** 2 < self.radius**2