dialogs/ForceVariableDialog.py
changeset 2521 48ebcbe7f19b
parent 2513 1ee326651a74
child 3303 0ffb41625592
--- a/dialogs/ForceVariableDialog.py	Mon Mar 11 09:18:58 2019 +0100
+++ b/dialogs/ForceVariableDialog.py	Mon Mar 11 13:51:07 2019 +0100
@@ -169,43 +169,109 @@
 # -------------------------------------------------------------------------------
 
 
-class ForceVariableDialog(wx.TextEntryDialog):
+class ForceVariableDialog(wx.Dialog):
+    """Dialog to enforce new value for variables in debug panel"""
 
     def __init__(self, parent, iec_type, defaultValue=""):
-        wx.TextEntryDialog.__init__(
+        """
+        Constructor
+        @param parent: Parent wx.Window of dialog for modal
+        @param iec_type: IEC type of variable (string). For example 'BOOL', 'LREAL'.
+        @param defaultValue: current variable value as string. Default is empty string.
+        """
+        wx.Dialog.__init__(
             self, parent,
-            message=_("Forcing Variable Value"),
-            caption=_("Please enter value for a \"%s\" variable:") % iec_type,
-            defaultValue=defaultValue,
-            style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition)
+            name='ForceVariableDialog',
+            title=_("Please enter value for a \"%s\" variable:") % iec_type,
+            style=wx.DEFAULT_DIALOG_STYLE, pos=wx.DefaultPosition)
 
         self.IEC_Type = iec_type
-
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).
-                  GetSizer().GetAffirmativeButton())
-        self.ValueTextCtrl = self.GetSizer().GetItem(1).GetWindow()
-        if self.IEC_Type == "BOOL":
-            self.ToggleButton = wx.ToggleButton(self, label=_("Toggle value"))
-            value = GetTypeValue[self.IEC_Type](defaultValue)
-            if value is not None:
-                self.ToggleButton.SetValue(value)
-
-            border = self.GetSizer().GetItem(1).GetBorder()
-            self.GetSizer().Insert(before=2, item=self.ToggleButton,
-                                   border=border,
-                                   flag=wx.LEFT | wx.RIGHT | wx.EXPAND)
-            self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleBoolValue, self.ToggleButton)
-
+        info_sizer = wx.BoxSizer(wx.VERTICAL)
+
+        message_label = wx.StaticText(self, label=_("Forcing Variable Value"))
+        info_sizer.AddWindow(message_label, border=10,
+                             flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
+        if GetTypeValue[self.IEC_Type] in [getinteger, getfloat]:
+            self.InitCtrlNumber(info_sizer, defaultValue)
+        elif self.IEC_Type == "BOOL":
+            self.InitCtrlBool(info_sizer, defaultValue)
+        else:
+            self.InitCtrlDefault(info_sizer, defaultValue)
+        self.GetEnteredValue = self.GetValueDefault
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
+        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
+        info_sizer.AddSizer(button_sizer, border=10, flag=wx.ALIGN_RIGHT | wx.ALL)
+
+        self.SetSizer(info_sizer)
         self.Fit()
-
-    def ToggleBoolValue(self, event):
-        value = self.ToggleButton.GetValue()
-        self.ValueTextCtrl.SetValue(text(value))
+        self.ValueCtrl.SetFocus()
+
+    # ---------------------------------
+    # default type methods
+    # ---------------------------------
+
+    def InitCtrlDefault(self, info_sizer, defaultValue):
+        """Add simple text control to change variable of any type"""
+        self.ValueCtrl = wx.TextCtrl(self)
+        self.ValueCtrl.SetValue(defaultValue)
+        info_sizer.AddWindow(self.ValueCtrl, border=10, proportion=1,
+                             flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
+    def GetValueDefault(self):
+        """
+        Returns text representation for a variable value
+        @return: variable value as a string
+        """
+        return text(self.ValueCtrl.GetValue())
+
+    # -----------------------------------------------
+    # integer and floating point number type methods
+    # ----------------------------------------------
+
+    def InitCtrlNumber(self, info_sizer, defaultValue):
+        """Add controls to change float and integer variables"""
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.InitCtrlDefault(sizer, defaultValue)
+        self.SpinButtonCtrl = wx.SpinButton(self, style=wx.HORIZONTAL | wx.SP_WRAP)
+        sizer.AddWindow(self.SpinButtonCtrl, border=10,
+                        flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND)
+        self.Bind(wx.EVT_SPIN_UP, self.SpinButtonChanged)
+        self.Bind(wx.EVT_SPIN_DOWN, self.SpinButtonChanged)
+        info_sizer.AddWindow(sizer, proportion=1, flag=wx.EXPAND)
+
+    def SpinButtonChanged(self, evt):
+        """Increment/decrement variable value"""
+        value = self.GetValue()
+        if value is not None:
+            up = evt.GetEventType() == wx.EVT_SPIN_UP._getEvtType()
+            value = value + 1 if up else value - 1
+            self.ValueCtrl.SetValue(text(value))
+        evt.Skip()
+
+    # -----------------------------------------------
+    # bool type related methods
+    # ----------------------------------------------
+
+    def InitCtrlBool(self, info_sizer, defaultValue):
+        """Add button to change value of boolean variable"""
+        self.ValueCtrl = wx.ToggleButton(self, label=_("Toggle value"))
+        value = GetTypeValue[self.IEC_Type](defaultValue)
+        if value is not None:
+            self.ValueCtrl.SetValue(value)
+
+        info_sizer.AddWindow(self.ValueCtrl, border=10,
+                             flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
     def OnOK(self, event):
+        """
+        Checks new entered value
+        before closing dialog window
+        """
         message = None
-        value = self.ValueTextCtrl.GetValue()
+        ret = True
+        value = self.GetEnteredValue()
         if value == "":
             message = _("You must type a value!")
         elif GetTypeValue[self.IEC_Type](value) is None:
@@ -214,9 +280,13 @@
             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
+            ret = False
         else:
             self.EndModal(wx.ID_OK)
-        event.Skip()
+        event.Skip(ret)
 
     def GetValue(self):
-        return GetTypeValue[self.IEC_Type](wx.TextEntryDialog.GetValue(self))
+        """
+        Return new enforce value of particular type
+        """
+        return GetTypeValue[self.IEC_Type](self.GetEnteredValue())