Skip to content

Commit

Permalink
Show and hide parameters after cpanel init
Browse files Browse the repository at this point in the history
  • Loading branch information
charwick committed Jul 4, 2024
1 parent 962c563 commit ddbdf3c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 7 deletions.
3 changes: 2 additions & 1 deletion helipad/ipy-styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,5 @@
margin-right: 12px;
}

.helipad_cpanel > .p-Widget { margin-bottom: 0.5em; }
.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 */
6 changes: 5 additions & 1 deletion helipad/locales/helipad.pot
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 26 additions & 2 deletions helipad/param.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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"""
Expand Down
13 changes: 10 additions & 3 deletions sample-models/Cities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ddbdf3c

Please sign in to comment.