|
|
from itertools import chain
from gooey.gui.widgets import components
is_required = lambda widget: widget['required'] is_checkbox = lambda widget: widget['type'] == 'CheckBox'
class ViewModel(object):
def __init__(self, build_spec): self.config = build_spec self.fields = [] self.required_fields = [] self.optional_fields = []
required_args, optional_args = partition(build_spec['widgets'], is_required) checkbox_args, general_args = partition(optional_args, is_checkbox)
self.required_fields = map(self.field_dispatch, required_args) self.optional_fields = map(self.field_dispatch, general_args + checkbox_args)
print self.required_fields print self.optional_fields
def field_dispatch(self, data): if data['type'] == 'RadioGroup': return MultiField(data) return Field(data)
def required_section_complete(self): required_args_present = map(lambda x: x.value, self.fields)
return bool(required_args_present and all(required_args_present))
def skipping_config(self): return self.config['manual_start']
def build_cmd_string(self): _f = lambda lst: [x for x in lst if x is not None] optional_args = _f([c.GetValue() for c in self.optional_fields]) required_args = _f([c.GetValue() for c in self.required_fields if c.HasOptionString()]) position_args = _f([c.GetValue() for c in self.required_fields if not c.HasOptionString()]) if position_args: position_args.insert(0, "--") return ' '.join(chain(required_args, optional_args, position_args))
def validate(self): errors = [] for field in self.fields: if not field.is_valid(): errors.append({field.name: field.errors})
class MultiField(object):
def __init__(self, widget): self.required = widget['required'] self.wxwidget = self._prime(widget) self.type = widget['type']
self.nargs = self._unwrap_fields('nargs', widget['data']) self.command = self._unwrap_cmds(widget['data']) self.display_name = self._unwrap_fields('display_name', widget['data']) self.help = self._unwrap_fields('help', widget['data']) self.choices = self._unwrap_fields('choices', widget['data'])
def _prime(self, widget): # pre-builds the widget widget_class = getattr(components, widget['type']) return widget_class(data=widget['data'])
def _unwrap_fields(self, key, collection): return [data[key] for data in collection]
def _unwrap_cmds(self, collection): return [x['commands'][0] if x['commands'] else '' for x in collection]
def build(self, parent): return self.wxwidget.build(parent)
class Field(object):
def __init__(self, widget): data = widget['data']
self.required = widget['required'] self.wxwidget = self._prime(widget) self.type = widget['type']
self.nargs = data['nargs'] self.command = data['commands'][0] if data['commands'] else '' self.display_name = data['display_name'] self.help = data['help'] self.choices = data['choices']
def __str__(self): return '{0}: {1}'.format(self.display_name, self.type)
def _prime(self, widget): # pre-builds the widget widget_class = getattr(components, widget['type']) return widget_class(data=widget['data'])
@property def value(self): return self.wxwidget.GetValue()
@value.setter def value(self, val): self.wxwidget.setValue(val)
def validate(self): pass
def build(self, parent): return self.wxwidget.build(parent)
def build_widget(widget_info): widget_class = getattr(components, widget_info['type']) return widget_class(data=widget_info['data'])
def partition(collection, condition): return filter(condition, collection), filter(lambda x: not condition(x), collection)
|