diff -r 32099ee16154 -r 185d0d371ea4 Beremiz.py --- a/Beremiz.py Wed Feb 27 14:36:05 2008 +0100 +++ b/Beremiz.py Wed Feb 27 18:40:39 2008 +0100 @@ -68,6 +68,8 @@ SCROLLBAR_UNIT = 10 WINDOW_COLOUR = wx.Colour(240,240,240) TITLE_COLOUR = wx.Colour(200,200,220) +CHANGED_TITLE_COLOUR = wx.Colour(220,200,220) +CHANGED_WINDOW_COLOUR = wx.Colour(255,240,240) if wx.Platform == '__WXMSW__': faces = { 'times': 'Times New Roman', @@ -322,6 +324,7 @@ self.SetClientSize(wx.Size(1000, 600)) self.SetMenuBar(self.menuBar1) self.Bind(wx.EVT_ACTIVATE, self.OnFrameActivated) + self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) if wx.VERSION < (2, 8, 0): self.MainSplitter = wx.SplitterWindow(id=ID_BEREMIZMAINSPLITTER, @@ -384,6 +387,17 @@ self.RefreshPluginTree() self.RefreshMainMenu() + + def OnCloseFrame(self, event): + if self.PluginRoot.HasProjectOpened(): + if self.PluginRoot.runningPLC is not None: + wx.MessageBox("Please stop any running PLC before closing") + event.Veto() + return + if self.PluginRoot.ProjectTestModified(): + self.PluginRoot.SaveProject() + wx.MessageBox("Project saved") + event.Skip() def OnMoveWindow(self, event): self.GetBestSize() @@ -422,8 +436,12 @@ self.Freeze() self.ClearSizer(self.PLCParamsSizer) - if self.PluginRoot.HasProjectOpened(): + if self.PluginRoot.HasProjectOpened(): plcwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1)) + if self.PluginRoot.PlugTestModified(): + bkgdclr = CHANGED_TITLE_COLOUR + else: + bkgdclr = TITLE_COLOUR plcwindow.SetBackgroundColour(TITLE_COLOUR) self.PLCParamsSizer.AddWindow(plcwindow, 0, border=0, flag=wx.GROW) @@ -494,6 +512,8 @@ event.Skip() minimizebutton.Bind(wx.EVT_BUTTON, togglewindow, id=minimizebutton_id) + self.PluginInfos[self.PluginRoot] = {"main" : plcwindow, "params" : paramswindow} + self.PLCConfigMainSizer.Layout() self.RefreshScrollBars() self.Thaw() @@ -541,19 +561,34 @@ self.Freeze() self.ClearSizer(self.PluginTreeSizer) if self.PluginRoot.HasProjectOpened(): - index = [0] for child in self.PluginRoot.IECSortedChilds(): - self.GenerateTreeBranch(child, index) + self.GenerateTreeBranch(child) if not self.PluginInfos[child]["expanded"]: self.CollapsePlugin(child) self.PLCConfigMainSizer.Layout() self.RefreshScrollBars() self.Thaw() + def SetPluginParamsAttribute(self, plugin, *args, **kwargs): + res, StructChanged = plugin.SetParamsAttribute(*args, **kwargs) + if StructChanged: + wx.CallAfter(self.RefreshPluginTree) + else: + if plugin == self.PluginRoot: + bkgdclr = CHANGED_TITLE_COLOUR + items = ["main", "params"] + else: + bkgdclr = CHANGED_WINDOW_COLOUR + items = ["left", "middle", "params"] + for i in items: + self.PluginInfos[plugin][i].SetBackgroundColour(bkgdclr) + self.PluginInfos[plugin][i].Refresh() + return res + def ExpandPlugin(self, plugin, force = False): for child in self.PluginInfos[plugin]["children"]: - self.PluginTreeSizer.Show(self.PluginInfos[child]["left"]) - self.PluginTreeSizer.Show(self.PluginInfos[child]["middle"]) + self.PluginInfos[child]["left"].Show() + self.PluginInfos[child]["middle"].Show() # self.PluginTreeSizer.Show(self.PluginInfos[child]["right"]) if force or not self.PluginInfos[child]["expanded"]: self.ExpandPlugin(child, force) @@ -562,17 +597,22 @@ def CollapsePlugin(self, plugin, force = False): for child in self.PluginInfos[plugin]["children"]: - self.PluginTreeSizer.Hide(self.PluginInfos[child]["left"]) - self.PluginTreeSizer.Hide(self.PluginInfos[child]["middle"]) + self.PluginInfos[child]["left"].Hide() + self.PluginInfos[child]["middle"].Hide() # self.PluginTreeSizer.Hide(self.PluginInfos[child]["right"]) if force or self.PluginInfos[child]["expanded"]: self.CollapsePlugin(child, force) if force: self.PluginInfos[child]["expanded"] = False - def GenerateTreeBranch(self, plugin, index): + def GenerateTreeBranch(self, plugin): leftwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1)) - leftwindow.SetBackgroundColour(WINDOW_COLOUR) + if plugin.PlugTestModified(): + bkgdclr=CHANGED_WINDOW_COLOUR + else: + bkgdclr=WINDOW_COLOUR + + leftwindow.SetBackgroundColour(bkgdclr) if plugin not in self.PluginInfos: self.PluginInfos[plugin] = {"expanded" : False, "left_visible" : False, "middle_visible" : False} @@ -607,8 +647,7 @@ enablebutton.SetBitmapSelected(wx.Bitmap(os.path.join(CWD, 'images', 'Enabled.png'))) enablebutton.SetToggle(plugin.MandatoryParams[1].getEnabled()) def toggleenablebutton(event): - res, StructChanged = plugin.SetParamsAttribute("BaseParams.Enabled", enablebutton.GetToggle(), self.Log) - if StructChanged: wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, "BaseParams.Enabled", enablebutton.GetToggle(), self.Log) enablebutton.SetToggle(res) event.Skip() enablebutton.Bind(wx.EVT_BUTTON, toggleenablebutton, id=enablebutton_id) @@ -690,10 +729,10 @@ leftbuttonsizer.AddWindow(expandbutton, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) tc_id = wx.NewId() - tc = wx.TextCtrl(leftwindow, tc_id, size=wx.Size(150, 35), style=wx.TE_PROCESS_ENTER|wx.NO_BORDER) + tc = wx.TextCtrl(leftwindow, tc_id, size=wx.Size(150, 35), style=wx.NO_BORDER) tc.SetFont(wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"])) tc.SetValue(plugin.MandatoryParams[1].getName()) - tc.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(tc, plugin, "BaseParams.Name"), id=tc_id) + tc.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(tc, plugin, "BaseParams.Name"), id=tc_id) leftbuttonsizer.AddWindow(tc, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) @@ -726,7 +765,7 @@ leftwindowsizer.AddWindow(lb, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM) middlewindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1)) - middlewindow.SetBackgroundColour(wx.Colour(240,240,240)) + middlewindow.SetBackgroundColour(bkgdclr) self.PluginTreeSizer.AddWindow(middlewindow, 0, border=0, flag=wx.GROW) @@ -745,10 +784,11 @@ middlewindowsizer.AddSizer(middleparamssizer, 0, border=0, flag=wx.ALIGN_RIGHT) paramswindow = wx.Panel(middlewindow, -1, size=wx.Size(-1, -1)) - paramswindow.SetBackgroundColour(WINDOW_COLOUR) + paramswindow.SetBackgroundColour(bkgdclr) psizer = wx.BoxSizer(wx.HORIZONTAL) paramswindow.SetSizer(psizer) + self.PluginInfos[plugin]["params"] = paramswindow middleparamssizer.AddWindow(paramswindow, 0, border=5, flag=wx.ALL) @@ -801,13 +841,11 @@ event.Skip() middleminimizebutton.Bind(wx.EVT_BUTTON, togglemiddlerightwindow, id=middleminimizebutton_id) - self.PluginInfos[plugin]["left"] = index[0] - self.PluginInfos[plugin]["middle"] = index[0] + 1 -# self.PluginInfos[plugin]["right"] = index[0] + 2 -# index[0] += 3 - index[0] += 2 + self.PluginInfos[plugin]["left"] = leftwindow + self.PluginInfos[plugin]["middle"] = middlewindow +# self.PluginInfos[plugin]["right"] = rightwindow for child in self.PluginInfos[plugin]["children"]: - self.GenerateTreeBranch(child, index) + self.GenerateTreeBranch(child) if not self.PluginInfos[child]["expanded"]: self.CollapsePlugin(child) @@ -827,8 +865,7 @@ def GetItemChannelChangedFunction(self, plugin, value): def OnPluginTreeItemChannelChanged(event): - res, StructChanged = plugin.SetParamsAttribute("BaseParams.IEC_Channel", value, self.Log) - wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, "BaseParams.IEC_Channel", value, self.Log) event.Skip() return OnPluginTreeItemChannelChanged @@ -866,16 +903,14 @@ def GetChoiceCallBackFunction(self, choicectrl, plugin, path): def OnChoiceChanged(event): - res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log) - if StructChanged: wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log) choicectrl.SetStringSelection(res) event.Skip() return OnChoiceChanged def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, plugin, path): def OnChoiceContentChanged(event): - res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log) - if StructChanged: wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log) choicectrl.SetStringSelection(res) infos = self.PluginRoot.GetParamsAttributes(path) staticbox = staticboxsizer.GetStaticBox() @@ -893,16 +928,14 @@ def GetTextCtrlCallBackFunction(self, textctrl, plugin, path): def OnTextCtrlChanged(event): - res, StructChanged = plugin.SetParamsAttribute(path, textctrl.GetValue(), self.Log) - if StructChanged: wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, path, textctrl.GetValue(), self.Log) textctrl.SetValue(res) event.Skip() return OnTextCtrlChanged def GetCheckBoxCallBackFunction(self, chkbx, plugin, path): def OnCheckBoxChanged(event): - res, StructChanged = plugin.SetParamsAttribute(path, chkbx.IsChecked(), self.Log) - if StructChanged: wx.CallAfter(self.RefreshPluginTree) + res = self.SetPluginParamsAttribute(plugin, path, chkbx.IsChecked(), self.Log) chkbx.SetValue(res) event.Skip() return OnCheckBoxChanged @@ -1040,10 +1073,9 @@ spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, plugin, element_path), id=id) else: textctrl = wx.TextCtrl(id=id, name=element_infos["name"], parent=parent, - pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.TE_PROCESS_ENTER) + pos=wx.Point(0, 0), size=wx.Size(150, 25), style=0)#wx.TE_PROCESS_ENTER) boxsizer.AddWindow(textctrl, 0, border=0, flag=0) textctrl.SetValue(str(element_infos["value"])) - textctrl.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(textctrl, plugin, element_path), id=id) textctrl.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(textctrl, plugin, element_path)) first = False @@ -1100,6 +1132,7 @@ def OnSaveProjectMenu(self, event): if self.PluginRoot.HasProjectOpened(): self.PluginRoot.SaveProject() + self.RefreshAll() event.Skip() def OnPropertiesMenu(self, event):