from collections import namedtuple
from OptionsParsing import ParseOptions, VARIABLETYPE, GenOptions, OptionsType
[ID_OPTIONSWIZARDDIALOG,ID_ONCHANGE,ID_OPTIONSTYPECHOICE,ID_SUBGROUPTEXT,ID_UNITTEXT,ID_VALUECHECKBOX,ID_MINSPIN,ID_MAXSPIN,ID_PRECISIONSPIN, ID_INITIALSPIN,ID_SCADACHECKBOX,ID_DISABLECHECKBOX,ID_OTHERTEXT,ID_DESCRIPTION,ID_STATIC] = [wx.NewId() for _init_ctrls in range(15)]
newline_to_space = str.maketrans("\n", " ", "\r")
class WampOptionsEditor(wx.Dialog):
self.MainSizer = wx.BoxSizer(wx.VERTICAL)
self.PropertySizer = wx.FlexGridSizer(cols=2, hgap=10, rows=13, vgap=10)
self.PropertySizer.Add(wx.StaticText(self,wx.ID_ANY,_("Type:")), flag=wx.ALIGN_CENTER_VERTICAL | wx.GROW | wx.LEFT, border=15)
self.PropertySizer.Add(self.OptionsTypeChoice, 1, flag= wx.EXPAND)
self.PropertySizer.Add(self.OnChangeCheckbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("On Change")), 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.Add(self.ScadaCheckbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("Scada")), 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.Add(self.StaticCheckbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("Static")), 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.Add(wx.StaticText(self,wx.ID_ANY, _("Subgroup:")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.SubgroupText, 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.Add(wx.StaticText(self,wx.ID_ANY, _("Unit:")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.UnitText, 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.Add(self.ValueCheckbox, flag=wx.GROW | wx.LEFT, border=15)
self.PropertySizer.Add(wx.StaticText(self,wx.ID_ANY, _("Enable min/max value")), flag=wx.ALIGN_CENTER_VERTICAL)
self.minValue=wx.StaticText(self, wx.ID_ANY, _("Min value:"))
self.maxValue=wx.StaticText(self, wx.ID_ANY, _("Max value:"))
self.PrecisionValue = wx.StaticText(self, wx.ID_ANY, _("Precision:"))
self.PropertySizer.Add(self.minValue, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.MinSpin, flag=wx.GROW)
self.PropertySizer.Add(self.maxValue, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.MaxSpin, flag=wx.GROW)
self.PropertySizer.Add(self.PrecisionValue, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.PrecisionSpin, flag=wx.GROW)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("Other:")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.OtherText, flag=wx.GROW)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("Tags:")), flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(self.Tags, flag=wx.GROW)
self.PropertySizer.Add(self.DisableCheckbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=15)
self.PropertySizer.Add(wx.StaticText(self, wx.ID_ANY, _("Disable display in xEye")), 1, flag=wx.GROW | wx.EXPAND)
self.PropertySizer.AddGrowableCol(1, 1)
self.MainSizer.Add(self.PropertySizer, flag=wx.GROW | wx.UP | wx.RIGHT, border=15)
self.ButtonSizer.Add(self.ClearButton)
self.MainSizer.Add(self.ButtonSizer, flag= wx.ALL, border = 10)
self.SetSizer(self.MainSizer)
def _init_ctrls(self, prnt, opt):
wx.Dialog.__init__(self, id=ID_OPTIONSWIZARDDIALOG,
name='OptionsWizard', parent=prnt,
size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE,
self.OptionsTypeChoice = wx.Choice(parent=self, id=ID_OPTIONSWIZARDDIALOG,
self.Bind(wx.EVT_CHOICE, self.OnTypeChoice, self.OptionsTypeChoice)
self.OnChangeCheckbox = wx.CheckBox(parent=self, id=ID_ONCHANGE)
self.SubgroupText = wx.TextCtrl(parent=self, id=ID_SUBGROUPTEXT)
self.UnitText = wx.TextCtrl(parent=self, id=ID_UNITTEXT)
self.ValueCheckbox = wx.CheckBox(parent=self, id=ID_VALUECHECKBOX)
self.MinSpin = wx.SpinCtrl(parent=self, id=ID_MINSPIN, style=wx.SP_VERTICAL)
self.MaxSpin = wx.SpinCtrl(parent=self, id=ID_MAXSPIN, style=wx.SP_VERTICAL)
self.PrecisionSpin = wx.SpinCtrl(parent=self, id=ID_PRECISIONSPIN, style=wx.SP_VERTICAL)
self.MinSpin.SetRange(-1000000, 1000000)
self.MaxSpin.SetRange(-1000000, 1000000)
self.ScadaCheckbox = wx.CheckBox(parent=self, id=ID_SCADACHECKBOX)
self.StaticCheckbox = wx.CheckBox(parent=self, id=ID_STATIC)
self.OtherText = wx.TextCtrl(parent=self, id=ID_OTHERTEXT)
self.Tags = wx.TextCtrl(parent=self, id=ID_DESCRIPTION, size=(-1, 100), style=wx.TE_MULTILINE|wx.SUNKEN_BORDER)
self.DisableCheckbox = wx.CheckBox(parent=self, id=ID_DISABLECHECKBOX)
self.ClearButton = wx.Button(self, wx.ID_CLEAR, _("Clear"))
self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL)
self.ValueCheckbox.Bind(wx.EVT_CHECKBOX, self.EnableValue)
self.OnChangeCheckbox.Enable(False)
self.OtherText.Enable(False)
self.UnitText.Enable(False)
self.ScadaCheckbox.Enable(False)
self.DisableCheckbox.Enable(False)
self.SubgroupText.Enable(False)
self.ValueCheckbox.Enable(False)
self.MinSpin.Enable(False)
self.MaxSpin.Enable(False)
self.PrecisionSpin.Enable(False)
self.StaticCheckbox.Enable(False)
self.Bind(wx.EVT_CHOICE, self.Enabler, self.OptionsTypeChoice)
self.Bind(wx.EVT_BUTTON, self.clearOptions, self.ClearButton)
self.Bind(wx.EVT_CHECKBOX, self.Enabler, self.ScadaCheckbox)
self.Bind(wx.EVT_CHECKBOX, self.Enabler, self.DisableCheckbox)
def __init__(self, parent, opt):
self._init_ctrls(parent, opt)
def Enabler(self, event):
if self.OptionsTypeChoice.GetSelection() == 0:
elif self.OptionsTypeChoice.GetSelection() in [1,3]:
self.ScadaCheckbox.Enable(True)
self.OtherText.Enable(True)
self.DisableCheckbox.Enable(True)
self.SubgroupText.Enable(True)
self.UnitText.Enable(True)
self.OnChangeCheckbox.Enable(True)
self.ValueCheckbox.Enable(True)
self.PrecisionSpin.Enable(True)
self.ScadaCheckbox.Enable(True)
self.OtherText.Enable(True)
self.DisableCheckbox.Enable(True)
self.SubgroupText.Enable(True)
self.UnitText.Enable(True)
self.OnChangeCheckbox.SetValue(False)
self.OnChangeCheckbox.Enable(False)
self.ValueCheckbox.Enable(True)
self.PrecisionSpin.Enable(True)
if self.OptionsTypeChoice.GetSelection() == 3 and self.ScadaCheckbox.GetValue():
self.StaticCheckbox.Enable(True)
self.OnChangeCheckbox.SetValue(True)
self.StaticCheckbox.SetValue(False)
self.StaticCheckbox.Enable(False)
def clearOptions(self, event):
self.OptionsTypeChoice.SetSelection(0)
self.SubgroupText.SetValue("")
self.UnitText.SetValue("")
self.ValueCheckbox.SetValue(False)
self.ScadaCheckbox.SetValue(False)
self.StaticCheckbox.SetValue(False)
self.OtherText.SetValue("")
self.DisableCheckbox.SetValue(False)
self.MinSpin.Enable(False)
self.MaxSpin.Enable(False)
self.StaticCheckbox.Enable(False)
self.PrecisionSpin.SetValue(0)
self.OnChangeCheckbox.SetValue(False)
self.OnChangeCheckbox.Enable(False)
self.OtherText.Enable(False)
self.DisableCheckbox.Enable(False)
self.SubgroupText.Enable(False)
self.UnitText.Enable(False)
self.ScadaCheckbox.Enable(False)
self.ValueCheckbox.Enable(False)
self.MinSpin.Enable(False)
self.MaxSpin.Enable(False)
self.PrecisionSpin.Enable(False)
self.StaticCheckbox.Enable(False)
def OnTypeChoice(self, event):
self.selected = event.GetSelection()
def EnableValue(self, event):
self.MinSpin.Enable(self.ValueCheckbox.GetValue())
self.MaxSpin.Enable(self.ValueCheckbox.GetValue())
def SetOptions(self, opts):
self.OptionsTypeChoice.SetSelection(res.variable_type_selection)
self.OnChangeCheckbox.SetValue(res.is_onchange)
self.ScadaCheckbox.SetValue(res.is_scada)
self.StaticCheckbox.SetValue(res.is_static)
self.DisableCheckbox.SetValue(res.disable)
self.StaticCheckbox.Enable(
res.is_static or (res.variable_type_selection == 3 and res.is_scada))
if res.subgroup is not None:
self.SubgroupText.SetValue(res.subgroup)
self.UnitText.SetValue(res.unit)
if res.min is not None or res.max is not None:
self.ValueCheckbox.SetValue(True)
self.MinSpin.Enable(True)
self.MaxSpin.Enable(True)
self.MinSpin.SetValue(res.min if res.min else 0)
self.MaxSpin.SetValue(res.max if res.max else 0)
if res.other is not None:
self.OtherText.SetValue(res.other)
if res.precision is not None:
self.PrecisionSpin.SetValue(res.precision)
self.Tags.SetValue(res.tags)
opts.variable_type_selection = max(self.OptionsTypeChoice.GetSelection(), 0)
opts.is_onchange = self.OnChangeCheckbox.GetValue()
opts.is_scada = self.ScadaCheckbox.GetValue()
opts.is_static = self.StaticCheckbox.GetValue()
opts.disable = self.DisableCheckbox.GetValue()
if self.MinSpin.IsEnabled():
opts.min = self.MinSpin.GetValue()
opts.max = self.MaxSpin.GetValue()
opts.precision = self.PrecisionSpin.GetValue()
for name, ctrl in [('subgroup', self.SubgroupText),
('other', self.OtherText),
content = ctrl.GetValue().translate(newline_to_space)
class WampOptionsCellControl(wx.PyControl):
Custom cell editor control with a text box and a button that launches
def __init__(self, parent, table, row):
wx.Control.__init__(self, parent, row)
main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
main_sizer.AddGrowableCol(0)
main_sizer.AddGrowableRow(0)
# create location text control
self.Options = wx.TextCtrl(self, size=wx.Size(0, -1),
style=wx.TE_PROCESS_ENTER)
self.Options.Bind(wx.EVT_KEY_DOWN, self.OnChar)
main_sizer.Add(self.Options, flag=wx.GROW)
self.EditButton = wx.Button(self, label='...', size=wx.Size(30, -1))
self.Bind(wx.EVT_BUTTON, self.OnEditButtonClick, self.EditButton)
main_sizer.Add(self.EditButton, flag=wx.GROW)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.SetSizer(main_sizer)
def SetValue(self, value):
self.Options.SetValue(value)
return self.Options.GetValue()
def OnEditButtonClick(self, event):
# pop up the Duration Editor dialog
options = self.GetValue()
dialog = WampOptionsEditor(self.parent, options)
answer = dialog.ShowModal()
opt = dialog.GetOptions()
keycode = event.GetKeyCode()
if keycode in [wx.WXK_RETURN]:
self.Parent.Parent.ProcessEvent(event)
elif keycode == wx.WXK_ESCAPE:
self.Options.SetValue(self.Default)
self.Parent.Parent.CloseEditControl()
class WampOptionsCellEditor(wx.grid.GridCellEditor):
Grid cell editor that uses WampOptionsCellControl to display an edit button.
def __init__(self, table, row, col):
wx.grid.GridCellEditor.__init__(self)
self.colname = self.table.GetColLabelValue(col, False)
def Create(self, parent, id, evt_handler):
self.CellControl = WampOptionsCellControl(parent, self.table, self.row)
self.SetControl(self.CellControl)
self.CellControl.PushEventHandler(evt_handler)
def BeginEdit(self, row, col, grid):
self.CellControl.Enable()
self.CellControl.SetValue(self.table.GetValueByName(self.row, self.colname))
self.CellControl.SetFocus()
def EndEdit(self, row, col, grid, oldval):
value = self.CellControl.GetValue()
changed = value != oldval
def ApplyEdit(self, row, col, grid):
value = self.CellControl.GetValue()
self.table.SetValueByName(row, self.colname, value)
self.CellControl.Disable()
self.CellControl.SetDimensions(rect.x + 1, rect.y,