diff --git a/gooey/gui/controller.py b/gooey/gui/controller.py index 7b0b4b7..e281ea1 100644 --- a/gooey/gui/controller.py +++ b/gooey/gui/controller.py @@ -9,6 +9,7 @@ from multiprocessing.dummy import Pool from gooey.gui.lang import i18n from gooey.gui import events +from gooey.gui.presenter import Presenter from gooey.gui.pubsub import pub from gooey.gui.util.taskkill import taskkill from gooey.gui.viewmodel import ViewModel @@ -24,7 +25,9 @@ class Controller(object): def __init__(self, build_spec): # todo: model! self.build_spec = build_spec - self.view = BaseWindow(build_spec) + self.view = BaseWindow(build_spec, layout_type=self.build_spec['layout_type']) + self.presentation = Presenter(self.view, self.build_spec) + self.presentation.initialize_view() self._process = None diff --git a/gooey/gui/presenter.py b/gooey/gui/presenter.py new file mode 100644 index 0000000..7f9d839 --- /dev/null +++ b/gooey/gui/presenter.py @@ -0,0 +1,99 @@ +from collections import namedtuple + +from gooey.gui import component_builder +from gooey.gui.lang.i18n import _ + +is_required = lambda widget: widget['required'] + +SimpleArg = namedtuple('SimpleArg', 'title msg type') + + + +class Presenter(object): + def __init__(self, view, build_spec): + self.view = view + self.build_spec = build_spec + + def initialize_view(self): + self.view.window_title = self.build_spec['program_name'] + self.view.window_size = self.build_spec['default_size'] + + # widgets = component_builder.build_components(self.build_spec['widgets']) + required_args, optional_args = self.partition(self.build_spec['widgets'], is_required) + self.view.required_section.populate([SimpleArg(x['data']['display_name'], x['data']['help'], x['type']) for x in required_args]) + + + optionals = [] + for x in optional_args: + if x['type'] != 'RadioGroup': + optionals.append(SimpleArg(x['data']['display_name'], x['data']['help'], x['type'])) + else: + names = [y['display_name'] for y in x['data']] + msgs = [y['help'] for y in x['data']] + optionals.append(SimpleArg(names, msgs, x['type'])) + + self.view.optional_section.populate(optionals) + + # self.view.optional_section.populate(widgets.optional_args) + + if self.build_spec.get('monospace_display'): + self.view.set_display_font_style('monospace') + + if self.should_disable_stop_button(): + self.view.disable_stop_button() + else: + self.view.enable_stop_button() + + self.syncronize_from_model() + + @staticmethod + def partition(collection, condition): + return filter(condition, collection), filter(lambda x: not condition(x), collection) + + def syncronize_from_model(self): + self.view.heading_title = _("settings_title") + self.view.heading_subtitle = self.build_spec['program_description'] or '' + + # + # def _init_pages(self): + # def config(): + # self.view.heading_title = 'asdf' + # self.view.heading_subtitle = 'asdf' + # self.view.show('settings_img') + # self.view.hide('check_mark', 'running_img', 'error_symbol') + # + # def running(): + # self.view._header.SetLabel(_("running_title")) + # self.view._subheader.SetLabel(_('running_msg')) + # self.view._check_mark.Hide() + # self.view._settings_img.Hide() + # self.view._running_img.Show() + # self.view._error_symbol.Hide() + # self.view.Layout() + # + # def success(): + # self.view._header.SetLabel(_('finished_title')) + # self.view._subheader.SetLabel(_('finished_msg')) + # self.view._running_img.Hide() + # self.view._check_mark.Show() + # self.view.Layout() + # + # def error(): + # self.view._header.SetLabel(_('finished_title')) + # self.view._subheader.SetLabel(_('finished_error')) + # self.view._running_img.Hide() + # self.view._error_symbol.Show() + # self.view.Layout() + # + # self.layouts = locals() + + + + def is_column_layout(self): + return self.build_spec['layout_type'] == 'column' + + def should_disable_stop_button(self): + return self.build_spec['disable_stop_button'] + + +