|
|
import os import wx
import wx.lib.agw.multidirdialog as MDD from abc import ABCMeta, abstractmethod
from gooey.gui.lang import i18n from gooey.gui.util.filedrop import FileDrop from gooey.gui.widgets.calender_dialog import CalendarDlg
class WidgetPack(object): """
Interface specifying the contract to which all `WidgetPack`s will adhere """
__metaclass__ = ABCMeta
@abstractmethod def build(self, parent, data, choices=None): pass
def onResize(self, evt): pass
@staticmethod def get_command(data): return ''
@staticmethod def disable_quoting(data): nargs = data.get('nargs', None) if not nargs: return False return nargs not in (1, '?')
class BaseChooser(WidgetPack): def __init__(self): self.button_text = i18n._('browse') self.parent = None self.widget = None self.button = None
def build(self, parent, data, choices=None): self.parent = parent self.widget = wx.TextCtrl(self.parent) self.widget.AppendText('') self.widget.SetMinSize((0, -1)) dt = FileDrop(self.widget) self.widget.SetDropTarget(dt) self.button = wx.Button(self.parent, label=self.button_text, size=(73, 23))
widget_sizer = wx.BoxSizer(wx.HORIZONTAL) widget_sizer.Add(self.widget, 1, wx.EXPAND) widget_sizer.AddSpacer(10) widget_sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL)
parent.Bind(wx.EVT_BUTTON, self.on_button, self.button)
return widget_sizer
def get_value(self): return self.widget.GetValue()
def __repr__(self): return self.__class__.__name__
class BaseFileChooser(BaseChooser): dialog = None def __init__(self): BaseChooser.__init__(self)
def on_button(self, evt): dlg = self.dialog(self.parent) result = (self.get_path(dlg) if dlg.ShowModal() == wx.ID_OK else None) if result: self.widget.SetValue(result)
def get_path(self, dlg): return dlg.GetPath()
class BaseMultiFileChooser(BaseFileChooser): def __init__(self, dialog): BaseFileChooser.__init__(self) self.dialog = dialog
def get_path(self, dlg): return os.pathsep.join(dlg.GetPaths())
class MultiFileSaverPayload(BaseMultiFileChooser): def __init__(self, *args, **kwargs): BaseMultiFileChooser.__init__(self, build_dialog(wx.FD_MULTIPLE, False))
class MultiDirChooserPayload(BaseMultiFileChooser): class MyMultiDirChooser(MDD.MultiDirDialog): def __init__(self, *args, **kwargs): kwargs.update({ 'title': "Select Directories", 'defaultPath': os.getcwd(), 'agwStyle': MDD.DD_MULTIPLE|MDD.DD_DIR_MUST_EXIST }) MDD.MultiDirDialog.__init__(self, *args, **kwargs)
def GetPaths(self): return self.dirCtrl.GetPaths()
def __init__(self, *args, **kwargs): BaseMultiFileChooser.__init__(self, MultiDirChooserPayload.MyMultiDirChooser)
class TextInputPayload(WidgetPack): def __init__(self, no_quoting=False): self.widget = None self.option_string = None self.no_quoting = no_quoting
def build(self, parent, data, choices=None): self.widget = wx.TextCtrl(parent) dt = FileDrop(self.widget) self.widget.SetDropTarget(dt) self.widget.SetMinSize((0, -1)) self.widget.SetDoubleBuffered(True) self.widget.AppendText('') return self.widget
def get_value(self): return self.widget.GetValue()
class TextAreaPayload(WidgetPack): def __init__(self, no_quoting=False): self.widget = None self.option_string = None self.no_quoting = no_quoting
def build(self, parent, data, choices=None): self.widget = wx.TextCtrl(parent, style=wx.TE_MULTILINE) dt = FileDrop(self.widget) self.widget.SetDropTarget(dt) self.widget.SetMinSize((0, -1)) self.widget.SetDoubleBuffered(True) self.widget.AppendText('') return self.widget
def get_value(self): return self.widget.GetValue()
class DropdownPayload(WidgetPack): default_value = 'Select Option'
def __init__(self, no_quoting=False): self.widget = None self.option_string = None self.no_quoting = no_quoting
def build(self, parent, data, choices=None): self.widget = wx.ComboBox( parent=parent, id=-1, value=self.default_value, choices=[self.default_value] + choices, style=wx.CB_DROPDOWN ) return self.widget
def get_value(self): return self.widget.GetValue()
def set_value(self, text): self.widget.SetValue(text)
class CounterPayload(WidgetPack): def __init__(self): self.widget = None
def build(self, parent, data, choices=None): self.widget = wx.ComboBox( parent=parent, id=-1, value='', choices=list(map(str, range(1, 11))), style=wx.CB_DROPDOWN ) return self.widget
def get_value(self): return self.widget.GetValue()
class DirDialog(wx.DirDialog): def __init__(self, parent, *args, **kwargs): wx.DirDialog.__init__(self, parent, 'Select Directory', style=wx.DD_DEFAULT_STYLE)
class PasswordInputPayload(WidgetPack): def __init__(self, no_quoting=False): self.widget = None self.option_string = None self.no_quoting = no_quoting
def build(self, parent, data, choices=None): self.widget = wx.TextCtrl(parent, style=wx.TE_PASSWORD) dt = FileDrop(self.widget) self.widget.SetDropTarget(dt) self.widget.SetMinSize((0, -1)) self.widget.SetDoubleBuffered(True) self.widget.AppendText('') return self.widget
def get_value(self): return self.widget.GetValue()
def safe_default(data, default): return ''
def build_dialog(style, exist_constraint=True, **kwargs): if exist_constraint: return lambda panel: wx.FileDialog(panel, style=style | wx.FD_FILE_MUST_EXIST, **kwargs) else: return lambda panel: wx.FileDialog(panel, style=style, **kwargs)
def build_subclass(subclass, dialog): return type(subclass, (BaseFileChooser,), {'dialog': dialog})
FileSaverPayload = build_subclass('FileSaverPayload', staticmethod(build_dialog(wx.FD_SAVE, False, defaultFile="Enter Filename"))) FileChooserPayload = build_subclass('FileChooserPayload', staticmethod(build_dialog(wx.FD_OPEN))) DirChooserPayload = build_subclass('DirChooserPayload', DirDialog) DateChooserPayload = build_subclass('DateChooserPayload', CalendarDlg)
|