dialogs/FBDVariableDialog.py
changeset 714 131ea7f237b9
parent 577 9dbb79722fbc
child 741 330f578e228d
equal deleted inserted replaced
713:95a0a427f3ef 714:131ea7f237b9
    25 import wx
    25 import wx
    26 
    26 
    27 from graphics import *
    27 from graphics import *
    28 
    28 
    29 #-------------------------------------------------------------------------------
    29 #-------------------------------------------------------------------------------
    30 #                          Create New Variable Dialog
    30 #                                    Helpers
    31 #-------------------------------------------------------------------------------
    31 #-------------------------------------------------------------------------------
    32 
       
    33 [ID_FBDVARIABLEDIALOG, ID_FBDVARIABLEDIALOGSPACER, 
       
    34  ID_FBDVARIABLEDIALOGNAME, ID_FBDVARIABLEDIALOGCLASS, 
       
    35  ID_FBDVARIABLEDIALOGPREVIEW, ID_FBDVARIABLEDIALOGEXPRESSION,
       
    36  ID_FBDVARIABLEDIALOGEXECUTIONORDER, ID_FBDVARIABLEDIALOGSTATICTEXT1, 
       
    37  ID_FBDVARIABLEDIALOGSTATICTEXT2, ID_FBDVARIABLEDIALOGSTATICTEXT3, 
       
    38  ID_FBDVARIABLEDIALOGSTATICTEXT4, ID_FBDVARIABLEDIALOGSTATICTEXT5
       
    39 ] = [wx.NewId() for _init_ctrls in range(12)]
       
    40 
    32 
    41 VARIABLE_CLASSES_DICT = {INPUT : _("Input"),
    33 VARIABLE_CLASSES_DICT = {INPUT : _("Input"),
    42                          INOUT : _("InOut"),
    34                          INOUT : _("InOut"),
    43                          OUTPUT : _("Output")}
    35                          OUTPUT : _("Output")}
    44 VARIABLE_CLASSES_DICT_REVERSE = dict([(value, key) for key, value in VARIABLE_CLASSES_DICT.iteritems()])
    36 VARIABLE_CLASSES_DICT_REVERSE = dict(
       
    37     [(value, key) for key, value in VARIABLE_CLASSES_DICT.iteritems()])
       
    38 
       
    39 #-------------------------------------------------------------------------------
       
    40 #                          Create New Variable Dialog
       
    41 #-------------------------------------------------------------------------------
    45 
    42 
    46 class FBDVariableDialog(wx.Dialog):
    43 class FBDVariableDialog(wx.Dialog):
    47     
    44 
    48     if wx.VERSION < (2, 6, 0):
    45     def __init__(self, parent, controller, transition = ""):
    49         def Bind(self, event, function, id = None):
    46         wx.Dialog.__init__(self, parent,
    50             if id is not None:
    47               size=wx.Size(400, 380), title=_('Variable Properties'))
    51                 event(self, id, function)
    48         
    52             else:
    49         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10)
    53                 event(self, function)
    50         main_sizer.AddGrowableCol(0)
    54     
    51         main_sizer.AddGrowableRow(2)
    55     def _init_coll_flexGridSizer1_Items(self, parent):
    52         
    56         parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    53         column_sizer = wx.BoxSizer(wx.HORIZONTAL)
    57         parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
    54         main_sizer.AddSizer(column_sizer, border=20, 
    58         
    55               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    59     def _init_coll_flexGridSizer1_Growables(self, parent):
    56         
    60         parent.AddGrowableCol(0)
    57         left_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
    61         parent.AddGrowableRow(0)
    58         left_gridsizer.AddGrowableCol(0)
    62     
    59         column_sizer.AddSizer(left_gridsizer, 1, border=5, 
    63     def _init_coll_MainSizer_Items(self, parent):
    60               flag=wx.GROW|wx.RIGHT)
    64         parent.AddSizer(self.TopSizer, 0, border=0, flag=wx.GROW)
    61         
    65         parent.AddWindow(self.staticText5, 0, border=0, flag=wx.GROW)
    62         class_label = wx.StaticText(self, label=_('Class:'))
    66         parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
    63         left_gridsizer.AddWindow(class_label, flag=wx.GROW)
    67         
    64         
    68     def _init_coll_MainSizer_Growables(self, parent):
    65         self.Class = wx.ComboBox(self, style=wx.CB_READONLY)
    69         parent.AddGrowableCol(0)
    66         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, self.Class)
    70         parent.AddGrowableRow(2)
    67         left_gridsizer.AddWindow(self.Class, flag=wx.GROW)
    71     
    68         
    72     def _init_coll_TopSizer_Items(self, parent):
    69         expression_label = wx.StaticText(self, label=_('Expression:'))
    73         parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
    70         left_gridsizer.AddWindow(expression_label, flag=wx.GROW)
    74         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
    71         
    75     
    72         self.Expression = wx.TextCtrl(self)
    76     def _init_coll_LeftGridSizer_Items(self, parent):
    73         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, self.Expression)
    77         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
    74         left_gridsizer.AddWindow(self.Expression, flag=wx.GROW)
    78         parent.AddWindow(self.Class, 0, border=0, flag=wx.GROW)
    75         
    79         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
    76         execution_order_label = wx.StaticText(self, label=_('Execution Order:'))
    80         parent.AddWindow(self.Expression, 0, border=0, flag=wx.GROW)
    77         left_gridsizer.AddWindow(execution_order_label, flag=wx.GROW)
    81         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
    78         
    82         parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
    79         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
    83         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
    80         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, self.ExecutionOrder)
    84     
    81         left_gridsizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
    85     def _init_coll_LeftGridSizer_Growables(self, parent):
    82         
    86         parent.AddGrowableCol(0)
    83         right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    87         parent.AddGrowableRow(2)
    84         right_gridsizer.AddGrowableCol(0)
    88             
    85         right_gridsizer.AddGrowableRow(1)
    89     def _init_coll_RightGridSizer_Items(self, parent):
    86         column_sizer.AddSizer(right_gridsizer, 1, border=5, 
    90         parent.AddWindow(self.staticText4, 0, border=0, flag=wx.GROW)
    87               flag=wx.GROW|wx.LEFT)
    91         parent.AddWindow(self.VariableName, 0, border=0, flag=wx.GROW)
    88         
    92         
    89         name_label = wx.StaticText(self, label=_('Name:'))
    93     def _init_coll_RightGridSizer_Growables(self, parent):
    90         right_gridsizer.AddWindow(name_label, flag=wx.GROW)
    94         parent.AddGrowableCol(0)
    91         
    95         parent.AddGrowableRow(1)
    92         self.VariableName = wx.ListBox(self, style=wx.LB_SINGLE|wx.LB_SORT)
    96         
    93         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
    97     def _init_sizers(self):
    94         right_gridsizer.AddWindow(self.VariableName, flag=wx.GROW)
    98         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    95         
    99         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
    96         preview_label = wx.StaticText(self, label=_('Preview:'))
   100         self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
    97         main_sizer.AddWindow(preview_label, border=20,
   101         self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
    98               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   102         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    99         
   103 
   100         self.Preview = wx.Panel(self, 
   104         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
   101               style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
   105         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
       
   106         self._init_coll_MainSizer_Items(self.MainSizer)
       
   107         self._init_coll_MainSizer_Growables(self.MainSizer)
       
   108         self._init_coll_TopSizer_Items(self.TopSizer)
       
   109         self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
       
   110         self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
       
   111         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
       
   112         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
       
   113         
       
   114         self.SetSizer(self.flexGridSizer1)
       
   115 
       
   116     def _init_ctrls(self, prnt, ctrler):
       
   117         wx.Dialog.__init__(self, id=ID_FBDVARIABLEDIALOG,
       
   118               name='FBDVariableDialog', parent=prnt,
       
   119               size=wx.Size(400, 380), style=wx.DEFAULT_DIALOG_STYLE,
       
   120               title=_('Variable Properties'))
       
   121         self.SetClientSize(wx.Size(400, 380))
       
   122 
       
   123         self.staticText1 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT1,
       
   124               label=_('Class:'), name='staticText1', parent=self,
       
   125               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   126 
       
   127         self.staticText2 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT2,
       
   128               label=_('Expression:'), name='staticText2', parent=self,
       
   129               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   130 
       
   131         self.staticText3 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT3,
       
   132               label=_('Execution Order:'), name='staticText3', parent=self,
       
   133               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   134 
       
   135         self.staticText4 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT4,
       
   136               label=_('Name:'), name='staticText4', parent=self,
       
   137               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   138 
       
   139         self.staticText5 = wx.StaticText(id=ID_FBDVARIABLEDIALOGSTATICTEXT5,
       
   140               label=_('Preview:'), name='staticText5', parent=self,
       
   141               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   142 
       
   143         self.Class = wx.ComboBox(id=ID_FBDVARIABLEDIALOGCLASS,
       
   144               name='Class', parent=self, pos=wx.Point(0, 0),
       
   145               size=wx.Size(0, 28), style=wx.CB_READONLY)
       
   146         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, id=ID_FBDVARIABLEDIALOGCLASS)
       
   147         
       
   148         self.VariableName = wx.ListBox(id=ID_FBDVARIABLEDIALOGNAME,
       
   149               name='Name', parent=self, pos=wx.Point(0, 0),
       
   150               size=wx.Size(0, 90), style=wx.LB_SINGLE|wx.LB_SORT)
       
   151         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, id=ID_FBDVARIABLEDIALOGNAME)
       
   152 
       
   153         self.Expression = wx.TextCtrl(id=ID_FBDVARIABLEDIALOGEXPRESSION,
       
   154               name='Expression', parent=self, pos=wx.Point(0, 0),
       
   155               size=wx.Size(0, 24), style=0)
       
   156         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, id=ID_FBDVARIABLEDIALOGEXPRESSION)
       
   157 
       
   158         self.ExecutionOrder = wx.SpinCtrl(id=ID_FBDVARIABLEDIALOGEXECUTIONORDER,
       
   159               name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
       
   160               size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
       
   161         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_FBDVARIABLEDIALOGEXECUTIONORDER)
       
   162 
       
   163         self.Spacer = wx.Panel(id=ID_FBDVARIABLEDIALOGSPACER,
       
   164               name='Spacer', parent=self, pos=wx.Point(0, 0),
       
   165               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
       
   166 
       
   167         self.Preview = wx.Panel(id=ID_FBDVARIABLEDIALOGPREVIEW,
       
   168               name='Preview', parent=self, pos=wx.Point(0, 0),
       
   169               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
   170         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
   102         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
   171         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
   103         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
   172         setattr(self.Preview, "GetScaling", lambda:None)
   104         setattr(self.Preview, "GetScaling", lambda:None)
   173         setattr(self.Preview, "IsOfType", ctrler.IsOfType)
   105         setattr(self.Preview, "IsOfType", controller.IsOfType)
   174 
   106         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
   175         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   107         main_sizer.AddWindow(self.Preview, border=20,
   176         if wx.VERSION >= (2, 5, 0):
   108               flag=wx.GROW|wx.LEFT|wx.RIGHT)
   177             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
   109         
   178             self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
   110         button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   179         else:
   111         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
   180             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
   112         main_sizer.AddSizer(button_sizer, border=20, 
   181             wx.EVT_PAINT(self.Preview, self.OnPaint)
   113               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   182         
   114         
   183         self._init_sizers()
   115         self.SetSizer(main_sizer)
   184 
   116         
   185     def __init__(self, parent, controler, transition = ""):
       
   186         self._init_ctrls(parent, controler)
       
   187         self.Transition = transition
   117         self.Transition = transition
   188         self.Variable = None
   118         self.Variable = None
   189         self.VarList = []
   119         self.VarList = []
   190         self.MinVariableSize = None
   120         self.MinVariableSize = None
   191         
   121         
   254         values["width"], values["height"] = self.Variable.GetSize()
   184         values["width"], values["height"] = self.Variable.GetSize()
   255         values["executionOrder"] = self.ExecutionOrder.GetValue()
   185         values["executionOrder"] = self.ExecutionOrder.GetValue()
   256         return values
   186         return values
   257 
   187 
   258     def OnOK(self, event):
   188     def OnOK(self, event):
       
   189         message = None
   259         expression = self.Expression.GetValue()
   190         expression = self.Expression.GetValue()
   260         if self.Expression.IsEnabled():
   191         if self.Expression.IsEnabled():
   261             value = expression
   192             value = expression
   262         else:
   193         else:
   263             value = self.VariableName.GetStringSelection()
   194             value = self.VariableName.GetStringSelection()
   264         if value == "":
   195         if value == "":
   265             message = wx.MessageDialog(self, _("At least a variable or an expression must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
   196             message = _("At least a variable or an expression must be selected!")
   266             message.ShowModal()
       
   267             message.Destroy()
       
   268         elif value.upper() in IEC_KEYWORDS:
   197         elif value.upper() in IEC_KEYWORDS:
   269             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
   198             message = _("\"%s\" is a keyword. It can't be used!") % value
       
   199         if message is not None:
       
   200             message = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
   270             message.ShowModal()
   201             message.ShowModal()
   271             message.Destroy()
   202             message.Destroy()
   272         else:
   203         else:
   273             self.EndModal(wx.ID_OK)
   204             self.EndModal(wx.ID_OK)
   274 
   205