mirror of https://github.com/chriskiehl/Gooey.git
1 changed files with 128 additions and 0 deletions
Unified View
Diff Options
@ -0,0 +1,128 @@ |
|||||
|
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) |
||||
|
|
xxxxxxxxxx