Source code for AFL.automation.shared.widgetui
import ipywidgets as widgets
import functools
from IPython.display import display, Markdown, clear_output
# widget packages
def _ignoreargs(func, count):
@functools.wraps(func)
def newfunc(*args, **kwargs):
return func(*(args[count:]), **kwargs)
return newfunc
[docs]
def client_construct_ui(self,return_ui=False,display_ui=True):
qb = self.get_quickbar()
panel = {}
for entry in qb:
function_name = entry
try:
button_text = qb[entry]["qb"]["button_text"]
except KeyError:
button_text = function_name
try:
params = qb[entry]["qb"]["params"]
except KeyError:
params = {}
panel[entry] = {}
if len(params)==0:
#print(f'Adding button for function {function_name} with text: {button_text}')
panel[entry]['button'] = widgets.Button(description=button_text)
panel[entry]['button'].on_click(functools.partial(_ignoreargs(self.enqueue,1),task_name=function_name,interactive=False))
else:
inputlist = []
for param in params:
kwarg_name=param
try:
field_label = params[param]['label']
except KeyError:
field_label = param
try:
default = params[param]['default']
except KeyError:
default = 0
try:
dtype = params[param]['type']
except KeyError:
dtype = 'text'
#print(f'Adding field for kwarg name {kwarg_name}, labeled {field_label}, type {dtype} and default value {default}')
if dtype == 'float':
panel[entry][kwarg_name] = widgets.FloatText(
value=default,
description=field_label,
disabled=False
)
elif dtype=='int':
panel[entry][kwarg_name] = widgets.IntText(
value=default,
description=field_label,
disabled=False
)
elif dtype=='bool':
panel[entry][kwarg_name] = widgets.Checkbox(
value=bool(default),
description=field_label,
disabled=False
)
else: #also catch 'text'
panel[entry][kwarg_name] = widgets.Text(
value=default,
description=field_label,
disabled=False
)
panel[entry][kwarg_name].kwarg_name = kwarg_name
inputlist.append(panel[entry][kwarg_name])
#print(f'Adding button for function {function_name} with text: {button_text} and above params.')
input_func_kwargs = lambda inputlist: {ip.kwarg_name:ip.value for ip in inputlist}
panel[entry]['button'] = widgets.Button(description=button_text)
panel[entry]['button'].on_click(functools.partial(_ignoreargs(self.enqueue,1),task_name=function_name,interactive=False,params=functools.partial(input_func_kwargs,inputlist=inputlist)))
panel[entry]['vbox'] = widgets.VBox(list(panel[entry].values()))
panel['hbox'] = widgets.HBox([panel[entry]['vbox'] for entry in panel],layout={'flex-flow': 'flex-wrap','width':'80%'})
if display_ui:
display(panel['hbox'])
if return_ui:
return panel