Skip to content

Commit 1dd1c05

Browse files
Improve performance
1 parent 0c5f1c8 commit 1dd1c05

File tree

17 files changed

+320
-249
lines changed

17 files changed

+320
-249
lines changed

src/aiidalab_qe/app/configuration/__init__.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS
1212
from aiidalab_qe.app.utils import get_entry_items
13-
from aiidalab_qe.common.panel import Panel
13+
from aiidalab_qe.common.panel import Panel, SettingPanel
1414
from aiidalab_widgets_base import WizardAppWidgetStep
1515

1616
from .advanced import AdvancedSettings
@@ -23,12 +23,6 @@
2323
class ConfigureQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep):
2424
previous_step_state = tl.UseEnum(WizardAppWidgetStep.State)
2525

26-
_no_structure_warning = """
27-
<div style="color: red;">
28-
Please set the input structure first.
29-
</div>
30-
"""
31-
3226
def __init__(self, model: ConfigurationModel, **kwargs):
3327
from aiidalab_qe.common.widgets import LoadingWidget
3428

@@ -51,8 +45,15 @@ def __init__(self, model: ConfigurationModel, **kwargs):
5145
"protocol",
5246
)
5347

54-
self.workchain_settings = WorkChainSettings(model=model)
55-
self.advanced_settings = AdvancedSettings(model=model)
48+
self.missing_structure_message = """
49+
<div class="alert alert-info">
50+
<b>Please set the input structure first.</b>
51+
</div>
52+
"""
53+
self.structure_set_message = ipw.HTML(self.missing_structure_message)
54+
55+
self.workchain_settings = WorkChainSettings(config_model=model)
56+
self.advanced_settings = AdvancedSettings(config_model=model)
5657

5758
self.built_in_settings = [
5859
self.workchain_settings,
@@ -72,20 +73,13 @@ def render(self):
7273
if self.rendered:
7374
return
7475

75-
self.structure_set_message = ipw.HTML()
76-
ipw.dlink(
77-
(self._model, "input_structure"),
78-
(self.structure_set_message, "value"),
79-
lambda structure: self._no_structure_warning if structure is None else "",
80-
)
81-
8276
self.tab = ipw.Tab(
8377
children=self.built_in_settings,
8478
layout=ipw.Layout(min_height="250px"),
8579
selected_index=None,
8680
)
87-
self.tab.set_title(0, "Basic settings")
88-
self.tab.set_title(1, "Advanced settings")
81+
for i, setting in enumerate(self.built_in_settings):
82+
self.tab.set_title(i, setting.title)
8983
self.tab.observe(
9084
self._on_tab_change,
9185
"selected_index",
@@ -123,16 +117,16 @@ def set_configuration_parameters(self, parameters):
123117
self._model.set_model_state(parameters)
124118

125119
def is_saved(self):
126-
# TODO reduce calls to model state
127-
new_parameters = self.get_configuration_parameters()
128-
return new_parameters == self._model.configuration_parameters
120+
return self._model.confirmed
129121

130122
def confirm(self, _=None):
131123
self._model.configuration_parameters = self.get_configuration_parameters()
132124
self._model.confirmed = True
133125

134126
def reset(self):
135127
self._model.reset()
128+
if self.rendered:
129+
self.tab.selected_index = 0
136130
for _, settings in self.settings.items():
137131
settings.reset()
138132

@@ -141,17 +135,22 @@ def _on_previous_step_state_change(self, _):
141135
self._update_state()
142136

143137
def _on_tab_change(self, change):
144-
if (tab := change["new"]) is None:
138+
if (tab_index := change["new"]) is None:
145139
return
146-
self.tab.children[tab].render() # type: ignore
140+
tab: SettingPanel = self.tab.children[tab_index] # type: ignore
141+
tab.render()
142+
tab.update()
147143

148144
def _on_input_structure_change(self, _):
145+
self._update_missing_structure_warning()
149146
self.reset()
150147

151148
def _on_protocol_change(self, _):
152149
self._model.advanced.update()
153150

154151
def _on_confirmation_change(self, _):
152+
if not self._model.confirmed:
153+
self._model.configuration_parameters = {}
155154
self._update_state()
156155

157156
def _fetch_setting_entries(self):
@@ -203,6 +202,13 @@ def toggle_plugin(change, identifier=identifier, info=info):
203202
config_model=self._model,
204203
)
205204

205+
def _update_missing_structure_warning(self):
206+
self.structure_set_message.value = (
207+
self.missing_structure_message
208+
if self._model.input_structure is None
209+
else ""
210+
)
211+
206212
def _update_panel(self, _=None):
207213
self.tab.children = self.built_in_settings
208214
for identifier in self.properties:

src/aiidalab_qe/app/configuration/advanced.py

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import ipywidgets as ipw
77

8-
from aiidalab_qe.common.panel import Panel
8+
from aiidalab_qe.common.panel import SettingPanel
99

1010
from .hubbard import HubbardSettings
1111
from .magnetization import MagnetizationSettings
@@ -14,26 +14,21 @@
1414
from .smearing import SmearingSettings
1515

1616

17-
class AdvancedSettings(Panel):
17+
class AdvancedSettings(SettingPanel):
18+
title = "Advanced Settings"
1819
identifier = "advanced"
1920

20-
def __init__(self, model: ConfigurationModel, **kwargs):
21-
from aiidalab_qe.common.widgets import LoadingWidget
22-
21+
def __init__(self, config_model: ConfigurationModel, **kwargs):
2322
super().__init__(
23+
config_model=config_model,
2424
layout={"justify_content": "space-between", **kwargs.get("layout", {})},
25-
children=[LoadingWidget("Loading advanced settings widget")],
2625
**kwargs,
2726
)
2827

29-
self._model = model
30-
31-
self.smearing = SmearingSettings(model=model)
32-
self.magnetization = MagnetizationSettings(model=model)
33-
self.hubbard = HubbardSettings(model=model)
34-
self.pseudos = PseudoSettings(model=model)
35-
36-
self.rendered = False
28+
self.smearing = SmearingSettings(model=config_model)
29+
self.magnetization = MagnetizationSettings(model=config_model)
30+
self.hubbard = HubbardSettings(model=config_model)
31+
self.pseudos = PseudoSettings(model=config_model)
3732

3833
def render(self):
3934
if self.rendered:
@@ -46,7 +41,7 @@ def render(self):
4641
layout=ipw.Layout(max_width="20px"),
4742
)
4843
ipw.link(
49-
(self._model.advanced, "clean_workdir"),
44+
(self._model, "clean_workdir"),
5045
(self.clean_workdir, "value"),
5146
)
5247
# Override setting widget
@@ -56,11 +51,11 @@ def render(self):
5651
layout=ipw.Layout(max_width="10%"),
5752
)
5853
ipw.link(
59-
(self._model.advanced, "override"),
54+
(self._model, "override"),
6055
(self.override, "value"),
6156
)
6257
ipw.dlink(
63-
(self._model, "input_structure"),
58+
(self._config_model, "input_structure"),
6459
(self.override, "disabled"),
6560
lambda structure: structure is None,
6661
)
@@ -80,7 +75,7 @@ def render(self):
8075
style={"description_width": "initial"},
8176
)
8277
ipw.link(
83-
(self._model.advanced, "kpoints_distance"),
78+
(self._model, "kpoints_distance"),
8479
(self.kpoints_distance, "value"),
8580
)
8681
ipw.dlink(
@@ -94,7 +89,7 @@ def render(self):
9489
)
9590
self.mesh_grid = ipw.HTML()
9691
ipw.dlink(
97-
(self._model.advanced, "mesh_grid"),
92+
(self._model, "mesh_grid"),
9893
(self.mesh_grid, "value"),
9994
)
10095

@@ -110,11 +105,11 @@ def render(self):
110105
style={"description_width": "initial"},
111106
)
112107
ipw.link(
113-
(self._model.advanced, "total_charge"),
108+
(self._model, "total_charge"),
114109
(self.total_charge, "value"),
115110
)
116111
ipw.dlink(
117-
(self._model.advanced, "override"),
112+
(self._model, "override"),
118113
(self.total_charge, "disabled"),
119114
lambda override: not override,
120115
)
@@ -133,11 +128,11 @@ def render(self):
133128
style={"description_width": "initial"},
134129
)
135130
ipw.link(
136-
(self._model.advanced, "van_der_waals"),
131+
(self._model, "van_der_waals"),
137132
(self.van_der_waals, "value"),
138133
)
139134
ipw.dlink(
140-
(self._model.advanced, "override"),
135+
(self._model, "override"),
141136
(self.van_der_waals, "disabled"),
142137
lambda override: not override,
143138
)
@@ -153,15 +148,15 @@ def render(self):
153148
style={"description_width": "initial"},
154149
)
155150
ipw.link(
156-
(self._model.advanced, "scf_conv_thr"),
151+
(self._model, "scf_conv_thr"),
157152
(self.scf_conv_thr, "value"),
158153
)
159154
ipw.dlink(
160-
(self._model.advanced, "scf_conv_thr_step"),
155+
(self._model, "scf_conv_thr_step"),
161156
(self.scf_conv_thr, "step"),
162157
)
163158
ipw.dlink(
164-
(self._model.advanced, "override"),
159+
(self._model, "override"),
165160
(self.scf_conv_thr, "disabled"),
166161
lambda override: not override,
167162
)
@@ -172,15 +167,15 @@ def render(self):
172167
style={"description_width": "initial"},
173168
)
174169
ipw.link(
175-
(self._model.advanced, "forc_conv_thr"),
170+
(self._model, "forc_conv_thr"),
176171
(self.forc_conv_thr, "value"),
177172
)
178173
ipw.dlink(
179-
(self._model.advanced, "forc_conv_thr_step"),
174+
(self._model, "forc_conv_thr_step"),
180175
(self.forc_conv_thr, "step"),
181176
)
182177
ipw.dlink(
183-
(self._model.advanced, "override"),
178+
(self._model, "override"),
184179
(self.forc_conv_thr, "disabled"),
185180
lambda override: not override,
186181
)
@@ -191,15 +186,15 @@ def render(self):
191186
style={"description_width": "initial"},
192187
)
193188
ipw.link(
194-
(self._model.advanced, "etot_conv_thr"),
189+
(self._model, "etot_conv_thr"),
195190
(self.etot_conv_thr, "value"),
196191
)
197192
ipw.dlink(
198-
(self._model.advanced, "etot_conv_thr_step"),
193+
(self._model, "etot_conv_thr_step"),
199194
(self.etot_conv_thr, "step"),
200195
)
201196
ipw.dlink(
202-
(self._model.advanced, "override"),
197+
(self._model, "override"),
203198
(self.etot_conv_thr, "disabled"),
204199
lambda override: not override,
205200
)
@@ -214,11 +209,11 @@ def render(self):
214209
style={"description_width": "initial"},
215210
)
216211
ipw.link(
217-
(self._model.advanced, "spin_orbit"),
212+
(self._model, "spin_orbit"),
218213
(self.spin_orbit, "value"),
219214
)
220215
ipw.dlink(
221-
(self._model.advanced, "override"),
216+
(self._model, "override"),
222217
(self.spin_orbit, "disabled"),
223218
lambda override: not override,
224219
)
@@ -297,15 +292,15 @@ def render(self):
297292

298293
def reset(self):
299294
with self.hold_trait_notifications():
300-
self._model.advanced.reset()
295+
self._model.reset()
301296
self.smearing.reset()
302297
self.hubbard.reset()
303298
self.magnetization.reset()
304299
self.pseudos.reset()
305-
self._model.advanced.update()
300+
self._model.update()
306301

307302
def _on_kpoints_distance_change(self, _=None):
308-
self._model.advanced.update_kpoints_mesh()
303+
self._model.update_kpoints_mesh()
309304

310305
def _on_override_change(self, change):
311306
if not change["new"]:

0 commit comments

Comments
 (0)