355 self.Log = LogPseudoFile(self.LogConsole) |
355 self.Log = LogPseudoFile(self.LogConsole) |
356 |
356 |
357 # Add beremiz's icon in top left corner of the frame |
357 # Add beremiz's icon in top left corner of the frame |
358 self.SetIcon(wx.Icon(os.path.join(CWD, "images", "brz.ico"), wx.BITMAP_TYPE_ICO)) |
358 self.SetIcon(wx.Icon(os.path.join(CWD, "images", "brz.ico"), wx.BITMAP_TYPE_ICO)) |
359 |
359 |
360 self.PluginRoot = PluginsRoot(self) |
360 self.PluginRoot = PluginsRoot(self, self.Log) |
361 self.DisableEvents = False |
361 self.DisableEvents = False |
362 |
362 |
363 self.PluginInfos = {} |
363 self.PluginInfos = {} |
364 |
364 |
365 if projectOpen: |
365 if projectOpen: |
366 self.PluginRoot.LoadProject(projectOpen, self.Log) |
366 self.PluginRoot.LoadProject(projectOpen) |
367 self.RefreshPLCParams() |
367 self.RefreshPLCParams() |
368 self.RefreshPluginTree() |
368 self.RefreshPluginTree() |
369 |
369 |
370 self.RefreshMainMenu() |
370 self.RefreshMainMenu() |
371 |
371 |
570 if horizontal: |
570 if horizontal: |
571 msizer = wx.FlexGridSizer(cols=len(plugin.PluginMethods)) |
571 msizer = wx.FlexGridSizer(cols=len(plugin.PluginMethods)) |
572 else: |
572 else: |
573 msizer = wx.FlexGridSizer(cols=1) |
573 msizer = wx.FlexGridSizer(cols=1) |
574 for plugin_method in plugin.PluginMethods: |
574 for plugin_method in plugin.PluginMethods: |
575 if "method" in plugin_method: |
575 if "method" in plugin_method and plugin_method.get("shown",True): |
576 id = wx.NewId() |
576 id = wx.NewId() |
577 button = GenBitmapTextButton(id=id, parent=parent, |
577 button = GenBitmapTextButton(id=id, parent=parent, |
578 bitmap=wx.Bitmap(os.path.join(CWD, "%s.png"%plugin_method.get("bitmap", os.path.join("images", "Unknown")))), label=plugin_method["name"], |
578 bitmap=wx.Bitmap(os.path.join(CWD, "%s.png"%plugin_method.get("bitmap", os.path.join("images", "Unknown")))), label=plugin_method["name"], |
579 name=plugin_method["name"], pos=wx.DefaultPosition, style=wx.NO_BORDER) |
579 name=plugin_method["name"], pos=wx.DefaultPosition, style=wx.NO_BORDER) |
580 button.SetToolTipString(plugin_method["tooltip"]) |
580 button.SetToolTipString(plugin_method["tooltip"]) |
673 enablebutton.SetToolTipString("Enable/Disable this plugin") |
673 enablebutton.SetToolTipString("Enable/Disable this plugin") |
674 make_genbitmaptogglebutton_flat(enablebutton) |
674 make_genbitmaptogglebutton_flat(enablebutton) |
675 enablebutton.SetBitmapSelected(wx.Bitmap(os.path.join(CWD, 'images', 'Enabled.png'))) |
675 enablebutton.SetBitmapSelected(wx.Bitmap(os.path.join(CWD, 'images', 'Enabled.png'))) |
676 enablebutton.SetToggle(plugin.MandatoryParams[1].getEnabled()) |
676 enablebutton.SetToggle(plugin.MandatoryParams[1].getEnabled()) |
677 def toggleenablebutton(event): |
677 def toggleenablebutton(event): |
678 res = self.SetPluginParamsAttribute(plugin, "BaseParams.Enabled", enablebutton.GetToggle(), self.Log) |
678 res = self.SetPluginParamsAttribute(plugin, "BaseParams.Enabled", enablebutton.GetToggle()) |
679 enablebutton.SetToggle(res) |
679 enablebutton.SetToggle(res) |
680 event.Skip() |
680 event.Skip() |
681 enablebutton.Bind(wx.EVT_BUTTON, toggleenablebutton, id=enablebutton_id) |
681 enablebutton.Bind(wx.EVT_BUTTON, toggleenablebutton, id=enablebutton_id) |
682 rolesizer.AddWindow(enablebutton, 0, border=0, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) |
682 rolesizer.AddWindow(enablebutton, 0, border=0, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) |
683 |
683 |
893 self.RefreshPLCParams() |
893 self.RefreshPLCParams() |
894 self.RefreshPluginTree() |
894 self.RefreshPluginTree() |
895 |
895 |
896 def GetItemChannelChangedFunction(self, plugin, value): |
896 def GetItemChannelChangedFunction(self, plugin, value): |
897 def OnPluginTreeItemChannelChanged(event): |
897 def OnPluginTreeItemChannelChanged(event): |
898 res = self.SetPluginParamsAttribute(plugin, "BaseParams.IEC_Channel", value, self.Log) |
898 res = self.SetPluginParamsAttribute(plugin, "BaseParams.IEC_Channel", value) |
899 event.Skip() |
899 event.Skip() |
900 return OnPluginTreeItemChannelChanged |
900 return OnPluginTreeItemChannelChanged |
901 |
901 |
902 def _GetAddPluginFunction(self, name, plugin): |
902 def _GetAddPluginFunction(self, name, plugin): |
903 def OnPluginMenu(event): |
903 def OnPluginMenu(event): |
921 """ Generate the callbackfunc for a given plugin method""" |
921 """ Generate the callbackfunc for a given plugin method""" |
922 def OnButtonClick(event): |
922 def OnButtonClick(event): |
923 # Disable button to prevent re-entrant call |
923 # Disable button to prevent re-entrant call |
924 event.GetEventObject().Disable() |
924 event.GetEventObject().Disable() |
925 # Call |
925 # Call |
926 getattr(plugin,method)(self.Log) |
926 getattr(plugin,method)() |
927 # Re-enable button |
927 # Re-enable button |
928 event.GetEventObject().Enable() |
928 event.GetEventObject().Enable() |
929 # Trigger refresh on Idle |
929 # Trigger refresh on Idle |
930 wx.CallAfter(self.RefreshAll) |
930 wx.CallAfter(self.RefreshAll) |
931 event.Skip() |
931 event.Skip() |
932 return OnButtonClick |
932 return OnButtonClick |
933 |
933 |
934 def GetChoiceCallBackFunction(self, choicectrl, plugin, path): |
934 def GetChoiceCallBackFunction(self, choicectrl, plugin, path): |
935 def OnChoiceChanged(event): |
935 def OnChoiceChanged(event): |
936 res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log) |
936 res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection()) |
937 choicectrl.SetStringSelection(res) |
937 choicectrl.SetStringSelection(res) |
938 event.Skip() |
938 event.Skip() |
939 return OnChoiceChanged |
939 return OnChoiceChanged |
940 |
940 |
941 def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, plugin, path): |
941 def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, plugin, path): |
942 def OnChoiceContentChanged(event): |
942 def OnChoiceContentChanged(event): |
943 res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log) |
943 res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection()) |
944 if wx.VERSION < (2, 8, 0): |
944 if wx.VERSION < (2, 8, 0): |
945 self.ParamsPanel.Freeze() |
945 self.ParamsPanel.Freeze() |
946 choicectrl.SetStringSelection(res) |
946 choicectrl.SetStringSelection(res) |
947 infos = self.PluginRoot.GetParamsAttributes(path) |
947 infos = self.PluginRoot.GetParamsAttributes(path) |
948 staticbox = staticboxsizer.GetStaticBox() |
948 staticbox = staticboxsizer.GetStaticBox() |
956 event.Skip() |
956 event.Skip() |
957 return OnChoiceContentChanged |
957 return OnChoiceContentChanged |
958 |
958 |
959 def GetTextCtrlCallBackFunction(self, textctrl, plugin, path): |
959 def GetTextCtrlCallBackFunction(self, textctrl, plugin, path): |
960 def OnTextCtrlChanged(event): |
960 def OnTextCtrlChanged(event): |
961 res = self.SetPluginParamsAttribute(plugin, path, textctrl.GetValue(), self.Log) |
961 res = self.SetPluginParamsAttribute(plugin, path, textctrl.GetValue()) |
962 textctrl.SetValue(res) |
962 textctrl.SetValue(res) |
963 event.Skip() |
963 event.Skip() |
964 return OnTextCtrlChanged |
964 return OnTextCtrlChanged |
965 |
965 |
966 def GetCheckBoxCallBackFunction(self, chkbx, plugin, path): |
966 def GetCheckBoxCallBackFunction(self, chkbx, plugin, path): |
967 def OnCheckBoxChanged(event): |
967 def OnCheckBoxChanged(event): |
968 res = self.SetPluginParamsAttribute(plugin, path, chkbx.IsChecked(), self.Log) |
968 res = self.SetPluginParamsAttribute(plugin, path, chkbx.IsChecked()) |
969 chkbx.SetValue(res) |
969 chkbx.SetValue(res) |
970 event.Skip() |
970 event.Skip() |
971 return OnCheckBoxChanged |
971 return OnCheckBoxChanged |
972 |
972 |
973 def ClearSizer(self, sizer): |
973 def ClearSizer(self, sizer): |
1110 defaultpath = os.getcwd() |
1110 defaultpath = os.getcwd() |
1111 dialog = wx.DirDialog(self , "Choose a project", defaultpath, wx.DD_NEW_DIR_BUTTON) |
1111 dialog = wx.DirDialog(self , "Choose a project", defaultpath, wx.DD_NEW_DIR_BUTTON) |
1112 if dialog.ShowModal() == wx.ID_OK: |
1112 if dialog.ShowModal() == wx.ID_OK: |
1113 projectpath = dialog.GetPath() |
1113 projectpath = dialog.GetPath() |
1114 if os.path.isdir(projectpath): |
1114 if os.path.isdir(projectpath): |
1115 result = self.PluginRoot.LoadProject(projectpath, self.Log) |
1115 result = self.PluginRoot.LoadProject(projectpath) |
1116 if not result: |
1116 if not result: |
1117 self.RefreshPLCParams() |
1117 self.RefreshPLCParams() |
1118 self.RefreshPluginTree() |
1118 self.RefreshPluginTree() |
1119 self.RefreshMainMenu() |
1119 self.RefreshMainMenu() |
1120 else: |
1120 else: |
1214 |
1214 |
1215 def AddPlugin(self, PluginType, plugin): |
1215 def AddPlugin(self, PluginType, plugin): |
1216 dialog = wx.TextEntryDialog(self, "Please enter a name for plugin:", "Add Plugin", "", wx.OK|wx.CANCEL) |
1216 dialog = wx.TextEntryDialog(self, "Please enter a name for plugin:", "Add Plugin", "", wx.OK|wx.CANCEL) |
1217 if dialog.ShowModal() == wx.ID_OK: |
1217 if dialog.ShowModal() == wx.ID_OK: |
1218 PluginName = dialog.GetValue() |
1218 PluginName = dialog.GetValue() |
1219 plugin.PlugAddChild(PluginName, PluginType, self.Log) |
1219 plugin.PlugAddChild(PluginName, PluginType) |
1220 self.RefreshPluginTree() |
1220 self.RefreshPluginTree() |
1221 dialog.Destroy() |
1221 dialog.Destroy() |
1222 |
1222 |
1223 def DeletePlugin(self, plugin): |
1223 def DeletePlugin(self, plugin): |
1224 dialog = wx.MessageDialog(self, "Really delete plugin ?", "Remove plugin", wx.YES_NO|wx.NO_DEFAULT) |
1224 dialog = wx.MessageDialog(self, "Really delete plugin ?", "Remove plugin", wx.YES_NO|wx.NO_DEFAULT) |