Fix the broken mask selection widget.

This commit is contained in:
Phil Elson 2020-10-26 14:36:54 +01:00
parent 6463e04e71
commit 568f7ca56b
4 changed files with 13 additions and 5 deletions

View file

@ -52,4 +52,4 @@
},
"nbformat": 4,
"nbformat_minor": 4
}
}

View file

@ -214,8 +214,7 @@ class WidgetView:
mask_choice = widgets.Select(options=list(models.Mask.types.keys()), value=name)
def on_mask_change(change):
mask = models.Mask.types[change['new']]
node.dcs_update_from(mask)
node.dcs_select(change['new'])
mask_choice.observe(on_mask_change, names=['value'])
return widget_group(
@ -322,6 +321,10 @@ class ExpertApplication:
state_builder=CARAStateBuilder(),
)
self.model_state.dcs_update_from(baseline_model)
# For the time-being, we have to initialise the select states. Careful
# as values might not correspond to what the baseline model says.
self.model_state.infected.mask.dcs_select('No mask')
self.view = WidgetView(self.model_state)
@property

View file

@ -294,6 +294,7 @@ class DataclassStatePredefined(DataclassInstanceState):
raise ValueError(f'The choice {name} is not valid. Possible options are {", ".join(self._choices)}')
self._selected = name
self._instance = self._choices[name]
self._fire_observers()
def dcs_instance(self):
return self._choices[self._selected]
@ -351,7 +352,7 @@ class DataclassStateNamed(DataclassState):
if name not in self._states:
raise ValueError(f'The choice {name} is not valid. Possible options are {", ".join(self._states)}')
self._selected = name
self._selected_state()._fire_observers()
self._fire_observers()
def _selected_state(self):
return self._states[self._selected]

View file

@ -158,6 +158,11 @@ def test_DCS_predefined():
s.dcs_update_from(opt1)
assert s.dcs_instance() == opt2
observer = Mock()
s.dcs_observe(observer)
s.dcs_select('option 1')
observer.assert_called_once_with()
def test_DCS_named():
opt1 = DCSimpleSubclass('a', 1, 3.14)
@ -201,7 +206,6 @@ def test_DCS_named():
s.dcs_select('option 1')
opt1_observer.reset_mock()
# ASDA
with s.dcs_state_transaction():
s.dcs_select('option 2')
s.dcs_update_from(opt2)