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.
125 lines
3.8 KiB
125 lines
3.8 KiB
"""
|
|
Created on Dec 28, 2013
|
|
|
|
@author: Chris
|
|
"""
|
|
from itertools import chain
|
|
|
|
import wx
|
|
from wx.lib.scrolledpanel import ScrolledPanel
|
|
|
|
from gooey.gui import component_builder
|
|
from gooey.gui.lang import i18n
|
|
from gooey.gui.option_reader import OptionReader
|
|
from gooey.gui import styling
|
|
|
|
PADDING = 10
|
|
|
|
class AdvancedConfigPanel(ScrolledPanel, OptionReader):
|
|
"""
|
|
Abstract class for the Footer panels.
|
|
"""
|
|
|
|
def __init__(self, parent, build_spec=None, **kwargs):
|
|
ScrolledPanel.__init__(self, parent, **kwargs)
|
|
self.SetupScrolling(scroll_x=False, scrollToTop=False)
|
|
|
|
self.SetDoubleBuffered(True)
|
|
|
|
self._action_groups = build_spec
|
|
self._positionals = build_spec.get('required', None)
|
|
self.components = component_builder.ComponentBuilder(build_spec)
|
|
|
|
self._msg_req_args = None
|
|
self._msg_opt_args = None
|
|
|
|
self._controller = None
|
|
|
|
self._init_components()
|
|
self._do_layout()
|
|
self.Bind(wx.EVT_SIZE, self.OnResize)
|
|
|
|
|
|
def _init_components(self):
|
|
self._msg_req_args = (styling.H1(self, i18n.translate("required_args_msg"))
|
|
if self._positionals else None)
|
|
self._msg_opt_args = styling.H1(self, i18n.translate("optional_args_msg"))
|
|
|
|
def _do_layout(self):
|
|
STD_LAYOUT = (0, wx.LEFT | wx.RIGHT | wx.EXPAND, PADDING)
|
|
|
|
container = wx.BoxSizer(wx.VERTICAL)
|
|
container.AddSpacer(15)
|
|
|
|
if self._positionals:
|
|
container.Add(self._msg_req_args, 0, wx.LEFT | wx.RIGHT, PADDING)
|
|
container.AddSpacer(5)
|
|
container.Add(styling.HorizontalRule(self), *STD_LAYOUT)
|
|
container.AddSpacer(20)
|
|
|
|
self.AddWidgets(container, self.components.required_args, add_space=True)
|
|
|
|
container.AddSpacer(10)
|
|
|
|
container.AddSpacer(10)
|
|
container.Add(self._msg_opt_args, 0, wx.LEFT | wx.RIGHT, PADDING)
|
|
container.AddSpacer(5)
|
|
container.Add(styling.HorizontalRule(self), *STD_LAYOUT)
|
|
container.AddSpacer(20)
|
|
|
|
self.CreateComponentGrid(container, self.components.general_options, cols=2)
|
|
self.CreateComponentGrid(container, self.components.flags, cols=3)
|
|
# container.Add(general_opts_grid, *STD_LAYOUT)
|
|
# container.AddSpacer(30)
|
|
# container.Add(flag_grids, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, PADDING)
|
|
|
|
self.SetSizer(container)
|
|
|
|
def AddWidgets(self, sizer, components, add_space=False, padding=PADDING):
|
|
for component in components:
|
|
widget_group = component.build(parent=self)
|
|
sizer.Add(widget_group, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, padding)
|
|
if add_space:
|
|
sizer.AddSpacer(8)
|
|
|
|
def CreateComponentGrid(self, parent_sizer, components, cols=2):
|
|
rows = [components[i:i+cols] for i in range(0, len(components), cols)]
|
|
for row in rows:
|
|
hsizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
for widget in row:
|
|
hsizer.Add(widget.build(self), 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
|
|
# hsizer.FitInside(parent_sizer)
|
|
parent_sizer.Add(hsizer, 0, wx.EXPAND)
|
|
parent_sizer.AddSpacer(20)
|
|
|
|
def OnResize(self, evt):
|
|
self.Freeze()
|
|
for component in self.components:
|
|
component.onResize(evt)
|
|
self.SetupScrolling(scroll_x=False, scrollToTop=False)
|
|
evt.Skip()
|
|
self.Thaw()
|
|
|
|
def RegisterController(self, controller):
|
|
if self._controller is None:
|
|
self._controller = controller
|
|
|
|
def GetOptions(self):
|
|
"""
|
|
returns the collective values from all of the
|
|
widgets contained in the panel"""
|
|
values = [c.GetValue()
|
|
for c in self.components
|
|
if c.GetValue() is not None]
|
|
return ' '.join(values)
|
|
|
|
def GetRequiredArgs(self):
|
|
return [arg.GetValue() for arg in self.components.required_args]
|
|
|
|
def GetOptionalArgs(self):
|
|
return [arg.GetValue() for arg in
|
|
chain(self.components.general_options, self.components.flags)]
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pass
|