mirror of https://github.com/chriskiehl/Gooey.git
chriskiehl
9 years ago
1 changed files with 128 additions and 0 deletions
Split 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) |
|||
|
Write
Preview
Loading…
Cancel
Save