From ddbdf3c97d9a6f08fd67f177847442d0e1c35e1b Mon Sep 17 00:00:00 2001 From: charwick <1117120+charwick@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:51:34 -0400 Subject: [PATCH] Show and hide parameters after cpanel init --- helipad/ipy-styles.css | 3 ++- helipad/locales/helipad.pot | 6 +++++- helipad/param.py | 28 ++++++++++++++++++++++++++-- sample-models/Cities.py | 13 ++++++++++--- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/helipad/ipy-styles.css b/helipad/ipy-styles.css index 7cda184..a17c9a4 100644 --- a/helipad/ipy-styles.css +++ b/helipad/ipy-styles.css @@ -128,4 +128,5 @@ margin-right: 12px; } -.helipad_cpanel > .p-Widget { margin-bottom: 0.5em; } \ No newline at end of file +.helipad_cpanel > .p-Widget { margin-bottom: 0.5em; } +.helipad_accordion_hidden { display: none; } /* For some reason Ipywidgets throws 'Javascript Error: t is undefined' when accessing accordion layouts */ \ No newline at end of file diff --git a/helipad/locales/helipad.pot b/helipad/locales/helipad.pot index cd6be45..807a524 100644 --- a/helipad/locales/helipad.pot +++ b/helipad/locales/helipad.pot @@ -271,7 +271,11 @@ msgid "Cannot add checkgrids or per-item parameters to groups." msgstr "" #: param.py:399 -msgid "Cannot remove built-in parameters." +msgid "Cannot hide or remove built-in parameters." +msgstr "" + +#: param.py:418 +msgid "Cannot show parameter before control panel is launched." msgstr "" #: param.py:421 diff --git a/helipad/param.py b/helipad/param.py index 37c51b4..5603501 100644 --- a/helipad/param.py +++ b/helipad/param.py @@ -395,12 +395,36 @@ def remove(self, name: str): if isinstance(name, (list, tuple)): return [self.remove(n) for n in name] if name not in self: return False - if getattr(self[name], 'config', False): raise ValueError(ï('Cannot remove built-in parameters.')) + if getattr(self[name], 'config', False): raise ValueError(ï('Cannot hide or remove built-in parameters.')) self._destroy(self[name]) del self[name] return True + def hide(self, name: str): + if isinstance(name, (list, tuple)): return [self.remove(n) for n in name] + if name not in self or not self[name].element: return False + if getattr(self[name], 'config', False): raise ValueError(ï('Cannot hide or remove built-in parameters.')) + + if isNotebook(): + if getattr(self[name], 'per', True) or self[name].type=='checkgrid': self[name].element.add_class('helipad_accordion_hidden') + else: self[name].element.layout.display = 'none' + else: + if getattr(self[name], 'per', True) or self[name].type=='checkgrid': self[name].element.pack_forget() + else: self[name].element.master.pack_forget() + + def show(self, name: str): + if not self.model.cpanel: + warnings.warn(ï('Cannot show parameter before control panel is launched.'), None, 2) + return False + + if isNotebook(): + if getattr(self[name], 'per', True) or self[name].type=='checkgrid': self[name].element.remove_class('helipad_accordion_hidden') + else: self[name].element.layout.display = None + else: + if getattr(self[name], 'per', True) or self[name].type=='checkgrid': self[name].element.pack(fill='x') + else: self[name].element.master.pack(fill='x') + def _destroy(self, item): if item.element: if isNotebook(): item.element.close() @@ -469,7 +493,7 @@ def clear(self): configs = {k:v for k,v in self.items() if getattr(v, 'config', False)} super().clear() self.update(configs) - + @property def globals(self): """The subset of global parameters, i.e. those added with `per=None`. https://helipad.dev/functions/params/#globals""" diff --git a/sample-models/Cities.py b/sample-models/Cities.py index 71ecf82..fc9b4aa 100644 --- a/sample-models/Cities.py +++ b/sample-models/Cities.py @@ -14,14 +14,17 @@ #Constrain the parameter space to values resulting in H* = 100 def constrain(model, var, val): - if var=='city': model.params['rent'].disabled(val) + if var=='city': + if val: model.params.hide('rent') + else: model.params.show('rent') + #model.params['rent'].disabled(val) elif model.param('city'): if var=='fixed': - model.params['rent'].enable() #Tkinter won't let you update the value of a disabled widget... + model.params['rent'].enable() #Tkinter won't let you update the value of a disabled widget… model.param('rent', .04+.037*val) model.params['rent'].disable() # if var=='rent': - # model.params['fixed'].enable() #Tkinter won't let you update the value of a disabled widget... + # model.params['fixed'].enable() #Tkinter won't let you update the value of a disabled widget… # model.param('fixed', 24.7777*val-.9284659) # model.params['fixed'].disable() @@ -77,6 +80,10 @@ def expWage(self, H): # AGENT BEHAVIOR #================ +@heli.hook +def CpanelPostInit(cpanel): + constrain(cpanel.model, 'city', True) + #This is here to make sure that the agents param gets reset at the beginning of each run #Otherwise the parameter persists between runs @heli.hook