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()) |