Source code for ironflow.gui.boxes.flow

# 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.
"""
Widgets for interacting with the flow diagram.
"""

from __future__ import annotations

import ipywidgets as widgets

from ironflow.gui.boxes.base import Box


[docs]class NodeSelector(Box): box_class = widgets.VBox def __init__(self, nodes_dictionary): super().__init__() self._nodes_dictionary = nodes_dictionary self.modules_dropdown = widgets.Dropdown( options=self.module_options, value=list(self.module_options)[0], disabled=False, layout=widgets.Layout(width="130px"), ) self.node_selector = widgets.RadioButtons( options=self.nodes_options, value=list(self.nodes_options)[0], disabled=False, ) self.modules_dropdown.observe(self.change_modules_dropdown, names="value") self.box.children = [self.modules_dropdown, self.node_selector]
[docs] def change_modules_dropdown(self, change: dict) -> None: self.node_selector.options = sorted( self._nodes_dictionary[self.modules_dropdown.value].keys() )
@property def new_node_class(self): return self._nodes_dictionary[self.modules_dropdown.value][ self.node_selector.value ] @property def module_options(self) -> list[str]: return sorted(self._nodes_dictionary.keys()) @property def nodes_options(self) -> list[str]: return sorted(self._nodes_dictionary[self.modules_dropdown.value].keys())
[docs] def update(self, nodes_dictionary: dict) -> None: self._nodes_dictionary = nodes_dictionary self.modules_dropdown.options = self.module_options
[docs]class FlowBox(Box): box_class = widgets.HBox def __init__(self, nodes_dictionary: dict): super().__init__() self.node_selector = NodeSelector(nodes_dictionary=nodes_dictionary) self.script_tabs = widgets.Tab([]) self.node_selector.box.layout.width = "15%" self.script_tabs.layout.width = "85%" self.box.children = [self.node_selector.box, self.script_tabs]
[docs] def update_nodes(self, nodes_dictionary: dict): self.node_selector.update(nodes_dictionary=nodes_dictionary)
[docs] def update_tabs( self, outputs: list[widgets.Output], titles: list[str], active_index: int ): self.script_tabs.selected_index = None # ^ To circumvent a bug where the index gets set to 0 on child changes # https://github.com/jupyter-widgets/ipywidgets/issues/2988 self.script_tabs.children = outputs for i, title in enumerate(titles): self.script_tabs.set_title(i, title) self._add_new_script_tab() self.script_tabs.selected_index = active_index
def _add_new_script_tab(self): self.script_tabs.children += ( widgets.Output(layout={"border": "1px solid black"}), ) self.script_tabs.set_title(len(self.script_tabs.children) - 1, "+")