|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +import typing as t |
| 4 | + |
3 | 5 | import ipywidgets as ipw |
4 | 6 |
|
5 | 7 | from aiida import orm |
@@ -55,6 +57,8 @@ def __init__(self, model: PseudosConfigurationSettingsModel, **kwargs): |
55 | 57 | ["ecutwfc", "ecutrho"], |
56 | 58 | ) |
57 | 59 |
|
| 60 | + self._uploader_dictionary_observers: list[t.Callable] = [] |
| 61 | + |
58 | 62 | def render(self): |
59 | 63 | if self.rendered: |
60 | 64 | return |
@@ -223,6 +227,7 @@ def render(self): |
223 | 227 | self.refresh(specific="widgets") |
224 | 228 |
|
225 | 229 | def _on_input_structure_change(self, _): |
| 230 | + self._unsubscribe_uploader_observations() |
226 | 231 | self.refresh(specific="structure") |
227 | 232 |
|
228 | 233 | def _on_protocol_change(self, _): |
@@ -259,6 +264,11 @@ def _update_ui(self): |
259 | 264 | self._build_pseudos_list() |
260 | 265 | self._model.update_family_header() |
261 | 266 |
|
| 267 | + def _unsubscribe_uploader_observations(self): |
| 268 | + for observer in self._uploader_dictionary_observers: |
| 269 | + self._model.unobserve(observer, "dictionary") |
| 270 | + self._uploader_dictionary_observers.clear() |
| 271 | + |
262 | 272 | def _toggle_upload_warning(self): |
263 | 273 | self._model.show_upload_warning = not self._model.family |
264 | 274 |
|
@@ -316,6 +326,7 @@ def synchronize_pseudo( |
316 | 326 | synchronize_pseudo, |
317 | 327 | "dictionary", |
318 | 328 | ) |
| 329 | + self._uploader_dictionary_observers.append(synchronize_pseudo) |
319 | 330 |
|
320 | 331 | uploader = PseudoPotentialUploader(model=uploader_model) |
321 | 332 | uploader.render() |
|
0 commit comments