dialogs/ForceVariableDialog.py
changeset 2521 48ebcbe7f19b
parent 2513 1ee326651a74
child 3303 0ffb41625592
equal deleted inserted replaced
2493:0ad5e616d37f 2521:48ebcbe7f19b
   167 # -------------------------------------------------------------------------------
   167 # -------------------------------------------------------------------------------
   168 #                            Force Variable Dialog
   168 #                            Force Variable Dialog
   169 # -------------------------------------------------------------------------------
   169 # -------------------------------------------------------------------------------
   170 
   170 
   171 
   171 
   172 class ForceVariableDialog(wx.TextEntryDialog):
   172 class ForceVariableDialog(wx.Dialog):
       
   173     """Dialog to enforce new value for variables in debug panel"""
   173 
   174 
   174     def __init__(self, parent, iec_type, defaultValue=""):
   175     def __init__(self, parent, iec_type, defaultValue=""):
   175         wx.TextEntryDialog.__init__(
   176         """
       
   177         Constructor
       
   178         @param parent: Parent wx.Window of dialog for modal
       
   179         @param iec_type: IEC type of variable (string). For example 'BOOL', 'LREAL'.
       
   180         @param defaultValue: current variable value as string. Default is empty string.
       
   181         """
       
   182         wx.Dialog.__init__(
   176             self, parent,
   183             self, parent,
   177             message=_("Forcing Variable Value"),
   184             name='ForceVariableDialog',
   178             caption=_("Please enter value for a \"%s\" variable:") % iec_type,
   185             title=_("Please enter value for a \"%s\" variable:") % iec_type,
   179             defaultValue=defaultValue,
   186             style=wx.DEFAULT_DIALOG_STYLE, pos=wx.DefaultPosition)
   180             style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition)
       
   181 
   187 
   182         self.IEC_Type = iec_type
   188         self.IEC_Type = iec_type
   183 
   189         info_sizer = wx.BoxSizer(wx.VERTICAL)
   184         self.Bind(wx.EVT_BUTTON, self.OnOK,
   190 
   185                   self.GetSizer().GetItem(2).GetSizer().GetItem(1).
   191         message_label = wx.StaticText(self, label=_("Forcing Variable Value"))
   186                   GetSizer().GetAffirmativeButton())
   192         info_sizer.AddWindow(message_label, border=10,
   187         self.ValueTextCtrl = self.GetSizer().GetItem(1).GetWindow()
   193                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
   188         if self.IEC_Type == "BOOL":
   194 
   189             self.ToggleButton = wx.ToggleButton(self, label=_("Toggle value"))
   195         if GetTypeValue[self.IEC_Type] in [getinteger, getfloat]:
   190             value = GetTypeValue[self.IEC_Type](defaultValue)
   196             self.InitCtrlNumber(info_sizer, defaultValue)
   191             if value is not None:
   197         elif self.IEC_Type == "BOOL":
   192                 self.ToggleButton.SetValue(value)
   198             self.InitCtrlBool(info_sizer, defaultValue)
   193 
   199         else:
   194             border = self.GetSizer().GetItem(1).GetBorder()
   200             self.InitCtrlDefault(info_sizer, defaultValue)
   195             self.GetSizer().Insert(before=2, item=self.ToggleButton,
   201         self.GetEnteredValue = self.GetValueDefault
   196                                    border=border,
   202 
   197                                    flag=wx.LEFT | wx.RIGHT | wx.EXPAND)
   203         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
   198             self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleBoolValue, self.ToggleButton)
   204         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
   199 
   205         info_sizer.AddSizer(button_sizer, border=10, flag=wx.ALIGN_RIGHT | wx.ALL)
       
   206 
       
   207         self.SetSizer(info_sizer)
   200         self.Fit()
   208         self.Fit()
   201 
   209         self.ValueCtrl.SetFocus()
   202     def ToggleBoolValue(self, event):
   210 
   203         value = self.ToggleButton.GetValue()
   211     # ---------------------------------
   204         self.ValueTextCtrl.SetValue(text(value))
   212     # default type methods
       
   213     # ---------------------------------
       
   214 
       
   215     def InitCtrlDefault(self, info_sizer, defaultValue):
       
   216         """Add simple text control to change variable of any type"""
       
   217         self.ValueCtrl = wx.TextCtrl(self)
       
   218         self.ValueCtrl.SetValue(defaultValue)
       
   219         info_sizer.AddWindow(self.ValueCtrl, border=10, proportion=1,
       
   220                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
       
   221 
       
   222     def GetValueDefault(self):
       
   223         """
       
   224         Returns text representation for a variable value
       
   225         @return: variable value as a string
       
   226         """
       
   227         return text(self.ValueCtrl.GetValue())
       
   228 
       
   229     # -----------------------------------------------
       
   230     # integer and floating point number type methods
       
   231     # ----------------------------------------------
       
   232 
       
   233     def InitCtrlNumber(self, info_sizer, defaultValue):
       
   234         """Add controls to change float and integer variables"""
       
   235         sizer = wx.BoxSizer(wx.HORIZONTAL)
       
   236         self.InitCtrlDefault(sizer, defaultValue)
       
   237         self.SpinButtonCtrl = wx.SpinButton(self, style=wx.HORIZONTAL | wx.SP_WRAP)
       
   238         sizer.AddWindow(self.SpinButtonCtrl, border=10,
       
   239                         flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND)
       
   240         self.Bind(wx.EVT_SPIN_UP, self.SpinButtonChanged)
       
   241         self.Bind(wx.EVT_SPIN_DOWN, self.SpinButtonChanged)
       
   242         info_sizer.AddWindow(sizer, proportion=1, flag=wx.EXPAND)
       
   243 
       
   244     def SpinButtonChanged(self, evt):
       
   245         """Increment/decrement variable value"""
       
   246         value = self.GetValue()
       
   247         if value is not None:
       
   248             up = evt.GetEventType() == wx.EVT_SPIN_UP._getEvtType()
       
   249             value = value + 1 if up else value - 1
       
   250             self.ValueCtrl.SetValue(text(value))
       
   251         evt.Skip()
       
   252 
       
   253     # -----------------------------------------------
       
   254     # bool type related methods
       
   255     # ----------------------------------------------
       
   256 
       
   257     def InitCtrlBool(self, info_sizer, defaultValue):
       
   258         """Add button to change value of boolean variable"""
       
   259         self.ValueCtrl = wx.ToggleButton(self, label=_("Toggle value"))
       
   260         value = GetTypeValue[self.IEC_Type](defaultValue)
       
   261         if value is not None:
       
   262             self.ValueCtrl.SetValue(value)
       
   263 
       
   264         info_sizer.AddWindow(self.ValueCtrl, border=10,
       
   265                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
   205 
   266 
   206     def OnOK(self, event):
   267     def OnOK(self, event):
       
   268         """
       
   269         Checks new entered value
       
   270         before closing dialog window
       
   271         """
   207         message = None
   272         message = None
   208         value = self.ValueTextCtrl.GetValue()
   273         ret = True
       
   274         value = self.GetEnteredValue()
   209         if value == "":
   275         if value == "":
   210             message = _("You must type a value!")
   276             message = _("You must type a value!")
   211         elif GetTypeValue[self.IEC_Type](value) is None:
   277         elif GetTypeValue[self.IEC_Type](value) is None:
   212             message = _("Invalid value \"{a1}\" for \"{a2}\" variable!").format(a1=value, a2=self.IEC_Type)
   278             message = _("Invalid value \"{a1}\" for \"{a2}\" variable!").format(a1=value, a2=self.IEC_Type)
   213         if message is not None:
   279         if message is not None:
   214             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
   280             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
   215             dialog.ShowModal()
   281             dialog.ShowModal()
   216             dialog.Destroy()
   282             dialog.Destroy()
       
   283             ret = False
   217         else:
   284         else:
   218             self.EndModal(wx.ID_OK)
   285             self.EndModal(wx.ID_OK)
   219         event.Skip()
   286         event.Skip(ret)
   220 
   287 
   221     def GetValue(self):
   288     def GetValue(self):
   222         return GetTypeValue[self.IEC_Type](wx.TextEntryDialog.GetValue(self))
   289         """
       
   290         Return new enforce value of particular type
       
   291         """
       
   292         return GetTypeValue[self.IEC_Type](self.GetEnteredValue())