Rewrite ForceVariableDialog. It's not based on wx.TextEntryDialog
authorAndrey Skvortsov <andrej.skvortzov@gmail.com>
Thu, 14 Feb 2019 09:44:19 +0300
changeset 2508 9076249f11eb
parent 2506 8dbdf20f795b
child 2509 9c5f835b031e
Rewrite ForceVariableDialog. It's not based on wx.TextEntryDialog

Don't customize standard wx.TextEntryDialog on the fly, implement your
own dialog for that with expected behavior and without any hacks.
dialogs/ForceVariableDialog.py
--- a/dialogs/ForceVariableDialog.py	Mon Jan 14 12:30:32 2019 +0300
+++ b/dialogs/ForceVariableDialog.py	Thu Feb 14 09:44:19 2019 +0300
@@ -169,34 +169,43 @@
 # -------------------------------------------------------------------------------
 
 
-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__(
+        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()
+        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)
+
+        self.ValueTextCtrl = wx.TextCtrl(self)
+        self.ValueTextCtrl.SetValue(defaultValue)
+        info_sizer.AddWindow(self.ValueTextCtrl, border=10,
+                             flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+
         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)
+            info_sizer.AddWindow(self.ToggleButton, border=10,
+                                 flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
             self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleBoolValue, self.ToggleButton)
 
+        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):