Skip to content

Commit

Permalink
Move plugin properties selector to basic settings
Browse files Browse the repository at this point in the history
Future PR to move all workchain/plugin related settings to a dedicated panel/collapsible
  • Loading branch information
edan-bainglass committed Oct 11, 2024
1 parent 21a0ff3 commit 26262db
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 53 deletions.
65 changes: 12 additions & 53 deletions src/aiidalab_qe/app/configuration/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import traitlets as tl

from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS
from aiidalab_qe.app.utils import get_entry_items
from aiidalab_qe.common.panel import Panel, SettingPanel
from aiidalab_widgets_base import WizardAppWidgetStep

Expand Down Expand Up @@ -65,7 +64,10 @@ def __init__(self, model: ConfigurationModel, **kwargs):
"advanced": self.advanced_settings,
}

self._fetch_setting_entries()
self.workchain_settings.fetch_setting_entries(
add_setting_callback=self._add_setting,
update_tabs_callback=self._update_tabs,
)

self.rendered = False

Expand Down Expand Up @@ -103,7 +105,6 @@ def render(self):

self.children = [
self.structure_set_message,
*self.property_children,
self.tab,
self.confirm_button,
]
Expand Down Expand Up @@ -153,54 +154,12 @@ def _on_confirmation_change(self, _):
self._model.configuration_parameters = {}
self._update_state()

def _fetch_setting_entries(self):
"""Handle plugin specific settings."""

self.properties = {}
self.reminder_info = {}
self.property_children = [ipw.HTML("Select which properties to calculate:")]

outlines = get_entry_items("aiidalab_qe.properties", "outline")
models = get_entry_items("aiidalab_qe.properties", "model")
settings = get_entry_items("aiidalab_qe.properties", "setting")
for identifier in settings:
model = models[identifier]()
self._model.add_model(identifier, model)

outline = outlines[identifier]()
info = ipw.HTML()
ipw.link(
(model, "include"),
(outline.include, "value"),
)

def toggle_plugin(change, identifier=identifier, info=info):
if change["new"]:
info.value = f"Customize {identifier} settings below"
else:
info.value = ""
self._update_panel()

model.observe(
toggle_plugin,
"include",
)

self.properties[identifier] = outline
self.property_children.append(
ipw.HBox(
children=[
outline,
info,
]
)
)

self.settings[identifier] = settings[identifier](
parent=self,
identifier=identifier,
config_model=self._model,
)
def _add_setting(self, identifier, setting):
self.settings[identifier] = setting(
parent=self,
identifier=identifier,
config_model=self._model,
)

def _update_missing_structure_warning(self):
self.structure_set_message.value = (
Expand All @@ -209,9 +168,9 @@ def _update_missing_structure_warning(self):
else ""
)

def _update_panel(self, _=None):
def _update_tabs(self, properties):
self.tab.children = self.built_in_settings
for identifier in self.properties:
for identifier in properties:
model = self._model.get_model(identifier)
setting = self.settings[identifier]
if model and model.include:
Expand Down
51 changes: 51 additions & 0 deletions src/aiidalab_qe/app/configuration/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,65 @@
Authors: AiiDAlab team
"""

import typing as t

import ipywidgets as ipw

from aiidalab_qe.app.utils import get_entry_items
from aiidalab_qe.common.panel import SettingPanel


class WorkChainSettings(SettingPanel):
title = "Basic Settings"
identifier = "workchain"

def fetch_setting_entries(
self,
add_setting_callback: t.Callable[[str, SettingPanel], None],
update_tabs_callback: t.Callable[[list[str]], None],
):
properties = {}
self.reminder_info = {}
self.property_children = [ipw.HTML("Select which properties to calculate:")]

outlines = get_entry_items("aiidalab_qe.properties", "outline")
models = get_entry_items("aiidalab_qe.properties", "model")
settings = get_entry_items("aiidalab_qe.properties", "setting")
for identifier in settings:
model = models[identifier]()
self._config_model.add_model(identifier, model)

outline = outlines[identifier]()
info = ipw.HTML()
ipw.link(
(model, "include"),
(outline.include, "value"),
)

def toggle_plugin(change, identifier=identifier, info=info):
if change["new"]:
info.value = f"Customize {identifier} settings below"
else:
info.value = ""
update_tabs_callback(properties)

model.observe(
toggle_plugin,
"include",
)

properties[identifier] = outline
self.property_children.append(
ipw.HBox(
children=[
outline,
info,
]
)
)

add_setting_callback(identifier, settings[identifier])

def render(self):
if self.rendered:
return
Expand Down Expand Up @@ -110,6 +160,7 @@ def render(self):
<h4>Protocol</h4>
</div>
"""),
*self.property_children,
ipw.HTML("Select the protocol:", layout=ipw.Layout(flex="1 1 auto")),
self.protocol,
ipw.HTML("""
Expand Down

0 comments on commit 26262db

Please sign in to comment.