mirror of https://github.com/chriskiehl/Gooey.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
5.3 KiB
153 lines
5.3 KiB
import os
|
|
|
|
import itertools
|
|
|
|
from gooey.gui.util.quoting import quote
|
|
from gooey.python_bindings.types import EnrichedItem, FormField
|
|
from gooey.gui.constants import VALUE_PLACEHOLDER, RADIO_PLACEHOLDER
|
|
from gooey.util.functional import assoc, associnMany
|
|
|
|
|
|
def value(field: FormField):
|
|
if field['type'] in ['Checkbox', 'BlockCheckbox']:
|
|
return field['checked'] # type: ignore
|
|
elif field['type'] in ['Dropdown', 'Listbox', 'Counter']:
|
|
return field['selected'] # type: ignore
|
|
elif field['type'] == 'RadioGroup':
|
|
if field['selected'] is not None: # type: ignore
|
|
return value(field['options'][field['selected']]) # type: ignore
|
|
else:
|
|
return None
|
|
else:
|
|
return field['value'] # type: ignore
|
|
|
|
|
|
def add_placeholder(field: FormField, placeholder=VALUE_PLACEHOLDER):
|
|
"""
|
|
TODO: Docs about placeholders
|
|
"""
|
|
if field['type'] in ['Checkbox', 'CheckBox', 'BlockCheckbox']:
|
|
# there's no sane placeholder we can make for this one, as
|
|
# it's kind of a nonsensical case: a required optional flag.
|
|
# We set it to True here, which is equally nonsensical, but
|
|
# ultimately will allow the validation to pass. We have no
|
|
# way of passing a placeholder without even MORE monket patching
|
|
# of the user's parser to rewrite the action type
|
|
return assoc(field, 'checked', True)
|
|
elif field['type'] in ['Dropdown', 'Listbox', 'Counter']:
|
|
return assoc(field, 'selected', placeholder)
|
|
elif field['type'] == 'RadioGroup':
|
|
# We arbitrarily attach a placeholder for first RadioGroup option
|
|
# and mark it as the selected one.
|
|
return {
|
|
**field,
|
|
'selected': 0,
|
|
'options': [
|
|
add_placeholder(field['options'][0], placeholder=RADIO_PLACEHOLDER), # type: ignore
|
|
*field['options'][1:] # type: ignore
|
|
]
|
|
}
|
|
else:
|
|
return assoc(field, 'value', placeholder)
|
|
|
|
|
|
def formatArgument(item: EnrichedItem):
|
|
if item['type'] in ['Checkbox', 'CheckBox', 'BlockCheckbox']:
|
|
return checkbox(item['data'], value(item['field']))
|
|
elif item['type'] == 'MultiFileChooser':
|
|
return multiFileChooser(item['data'], value(item['field']))
|
|
elif item['type'] == 'Textarea':
|
|
return textArea(item['data'], value(item['field']))
|
|
elif item['type'] == 'CommandField':
|
|
return textArea(item['data'], value(item['field']))
|
|
elif item['type'] == 'Counter':
|
|
return counter(item['data'], value(item['field']))
|
|
elif item['type'] == 'Dropdown':
|
|
return dropdown(item['data'], value(item['field']))
|
|
elif item['type'] == 'Listbox':
|
|
return listbox(item['data'], value(item['field']))
|
|
elif item['type'] == 'RadioGroup':
|
|
selected = item['field']['selected'] # type: ignore
|
|
if selected is not None:
|
|
formField = item['field']['options'][selected] # type: ignore
|
|
argparseDefinition = item['data']['widgets'][selected] # type: ignore
|
|
return formatArgument(assoc(argparseDefinition, 'field', formField)) # type: ignore
|
|
else:
|
|
return None
|
|
else:
|
|
return general(item['data'], value(item['field']))
|
|
|
|
|
|
def placeholder(item: EnrichedItem):
|
|
pass
|
|
|
|
|
|
def checkbox(metadata, value):
|
|
return metadata['commands'][0] if value else None
|
|
|
|
|
|
def multiFileChooser(metadata, value):
|
|
paths = ' '.join(quote(x) for x in value.split(os.pathsep) if x)
|
|
if metadata['commands'] and paths:
|
|
return u'{} {}'.format(metadata['commands'][0], paths)
|
|
return paths or None
|
|
|
|
|
|
def textArea(metadata, value):
|
|
if metadata['commands'] and value:
|
|
return '{} {}'.format(metadata['commands'][0], quote(value.encode('unicode_escape')))
|
|
else:
|
|
return quote(value.encode('unicode_escape')) if value else ''
|
|
|
|
|
|
def commandField(metadata, value):
|
|
if metadata['commands'] and value:
|
|
return u'{} {}'.format(metadata['commands'][0], value)
|
|
else:
|
|
return value or None
|
|
|
|
|
|
def counter(metatdata, value):
|
|
'''
|
|
Returns
|
|
str(option_string * DropDown Value)
|
|
e.g.
|
|
-vvvvv
|
|
'''
|
|
if not str(value).isdigit():
|
|
return None
|
|
command = str(metatdata['commands'][0]).strip()
|
|
return ' '.join(itertools.repeat(command, int(value)))
|
|
|
|
|
|
def dropdown(metadata, value):
|
|
if value == 'Select Option':
|
|
return None
|
|
elif metadata['commands'] and value:
|
|
return u'{} {}'.format(metadata['commands'][0], quote(value))
|
|
else:
|
|
return quote(value) if value else ''
|
|
|
|
|
|
def listbox(meta, value):
|
|
if meta['commands'] and value:
|
|
return u'{} {}'.format(meta['commands'][0], ' '.join(map(quote, value)))
|
|
else:
|
|
return ' '.join(map(quote, value)) if value else ''
|
|
|
|
|
|
def general(metadata, value):
|
|
if metadata.get('commands') and value:
|
|
if not metadata.get('nargs'):
|
|
v = quote(value)
|
|
else:
|
|
v = value
|
|
return u'{0} {1}'.format(metadata['commands'][0], v)
|
|
else:
|
|
if not value:
|
|
return None
|
|
elif not metadata.get('nargs'):
|
|
return quote(value)
|
|
else:
|
|
return value
|
|
|