diff -r 31e63e25b4cc -r 64beb9e9c749 controls/PouInstanceVariablesPanel.py --- a/controls/PouInstanceVariablesPanel.py Mon Aug 21 20:17:19 2017 +0000 +++ b/controls/PouInstanceVariablesPanel.py Mon Aug 21 23:22:58 2017 +0300 @@ -28,15 +28,32 @@ import wx.lib.agw.customtreectrl as CT import wx.lib.buttons +from PLCControler import \ + ITEMS_VARIABLE, \ + ITEM_CONFIGURATION, \ + ITEM_RESOURCE, \ + ITEM_POU, \ + ITEM_TRANSITION, \ + ITEM_ACTION + +from util.BitmapLibrary import GetBitmap + + # Customize CustomTreeItem for adding icon on item right CT.GenericTreeItem._rightimages = [] + def SetRightImages(self, images): self._rightimages = images + + CT.GenericTreeItem.SetRightImages = SetRightImages + def GetRightImages(self): return self._rightimages + + CT.GenericTreeItem.GetRightImages = GetRightImages @@ -59,14 +76,14 @@ w, h = self.GetClientSize() total_h = self.GetLineHeight(item) r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0]) - + bbox_width = (r_image_w + 4) * len(rightimages) + 4 bbox_height = r_image_h + 8 bbox_x = w - bbox_width bbox_y = item.GetY() + ((total_h > r_image_h) and [(total_h-r_image_h)/2] or [0])[0] - + return wx.Rect(bbox_x, bbox_y, bbox_width, bbox_height) - + return None def IsOverItemRightImage(self, item, point): @@ -75,30 +92,30 @@ point = self.CalcUnscrolledPosition(point) r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0]) images_bbx = self.GetItemRightImagesBBox(item) - + rect = wx.Rect(images_bbx.x + 4, images_bbx.y + 4, r_image_w, r_image_h) for r_image in rightimages: if rect.Inside(point): return r_image rect.x += r_image_w + 4 - + return None - + def PaintItem(self, item, dc, level, align): CT.CustomTreeCtrl.PaintItem(self, item, dc, level, align) - + rightimages = item.GetRightImages() if len(rightimages) > 0: images_bbx = self.GetItemRightImagesBBox(item) r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0]) - + dc.SetBrush(wx.TRANSPARENT_BRUSH) dc.SetPen(wx.TRANSPARENT_PEN) - + bg_width = (r_image_w + 4) * len(rightimages) + 4 bg_height = r_image_h + 8 - dc.DrawRectangle(images_bbx.x, images_bbx.y, + dc.DrawRectangle(images_bbx.x, images_bbx.y, images_bbx.width, images_bbx.height) x_pos = images_bbx.x + 4 for r_image in rightimages: @@ -106,98 +123,98 @@ r_image, dc, x_pos, images_bbx.y + 4, wx.IMAGELIST_DRAW_TRANSPARENT) x_pos += r_image_w + 4 - + + _ButtonCallbacks = namedtuple("ButtonCallbacks", ["leftdown", "dclick"]) -from PLCControler import ITEMS_VARIABLE, ITEM_CONFIGURATION, ITEM_RESOURCE, ITEM_POU, ITEM_TRANSITION, ITEM_ACTION -from util.BitmapLibrary import GetBitmap class PouInstanceVariablesPanel(wx.Panel): def __init__(self, parent, window, controller, debug): - wx.Panel.__init__(self, name='PouInstanceTreePanel', - parent=parent, pos=wx.Point(0, 0), - size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) - - self.ParentButton = wx.lib.buttons.GenBitmapButton(self, - bitmap=GetBitmap("top"), size=wx.Size(28, 28), style=wx.NO_BORDER) + wx.Panel.__init__(self, name='PouInstanceTreePanel', + parent=parent, pos=wx.Point(0, 0), + size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) + + self.ParentButton = wx.lib.buttons.GenBitmapButton( + self, bitmap=GetBitmap("top"), size=wx.Size(28, 28), style=wx.NO_BORDER) self.ParentButton.SetToolTipString(_("Parent instance")) - self.Bind(wx.EVT_BUTTON, self.OnParentButtonClick, - self.ParentButton) - + self.Bind(wx.EVT_BUTTON, self.OnParentButtonClick, + self.ParentButton) + self.InstanceChoice = wx.ComboBox(self, size=wx.Size(0, 0), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnInstanceChoiceChanged, - self.InstanceChoice) - - self.DebugButton = wx.lib.buttons.GenBitmapButton(self, - bitmap=GetBitmap("debug_instance"), size=wx.Size(28, 28), style=wx.NO_BORDER) + self.InstanceChoice) + + self.DebugButton = wx.lib.buttons.GenBitmapButton( + self, bitmap=GetBitmap("debug_instance"), size=wx.Size(28, 28), style=wx.NO_BORDER) self.DebugButton.SetToolTipString(_("Debug instance")) - self.Bind(wx.EVT_BUTTON, self.OnDebugButtonClick, - self.DebugButton) - - self.VariablesList = CustomTreeCtrlWithRightImage(self, - style=wx.SUNKEN_BORDER, - agwStyle=CT.TR_NO_BUTTONS| - CT.TR_SINGLE| - CT.TR_HAS_VARIABLE_ROW_HEIGHT| - CT.TR_HIDE_ROOT| - CT.TR_NO_LINES| - getattr(CT, "TR_ALIGN_WINDOWS_RIGHT", CT.TR_ALIGN_WINDOWS)) + self.Bind(wx.EVT_BUTTON, self.OnDebugButtonClick, + self.DebugButton) + + self.VariablesList = CustomTreeCtrlWithRightImage( + self, + style=wx.SUNKEN_BORDER, + agwStyle=(CT.TR_NO_BUTTONS | + CT.TR_SINGLE | + CT.TR_HAS_VARIABLE_ROW_HEIGHT | + CT.TR_HIDE_ROOT | + CT.TR_NO_LINES | + getattr(CT, "TR_ALIGN_WINDOWS_RIGHT", CT.TR_ALIGN_WINDOWS))) self.VariablesList.SetIndent(0) self.VariablesList.SetSpacing(5) - self.VariablesList.DoSelectItem = lambda *x,**y:True + self.VariablesList.DoSelectItem = lambda *x, **y: True self.VariablesList.Bind(CT.EVT_TREE_ITEM_ACTIVATED, - self.OnVariablesListItemActivated) + self.OnVariablesListItemActivated) self.VariablesList.Bind(wx.EVT_LEFT_DOWN, self.OnVariablesListLeftDown) self.VariablesList.Bind(wx.EVT_KEY_DOWN, self.OnVariablesListKeyDown) - + self.TreeRightImageList = wx.ImageList(24, 24) self.EditImage = self.TreeRightImageList.Add(GetBitmap("edit")) self.DebugInstanceImage = self.TreeRightImageList.Add(GetBitmap("debug_instance")) self.VariablesList.SetRightImageList(self.TreeRightImageList) - + self.ButtonCallBacks = { self.EditImage: _ButtonCallbacks( self.EditButtonCallback, None), self.DebugInstanceImage: _ButtonCallbacks( self.DebugButtonCallback, self.DebugButtonDClickCallback)} - + buttons_sizer = wx.FlexGridSizer(cols=3, hgap=0, rows=1, vgap=0) buttons_sizer.AddWindow(self.ParentButton) buttons_sizer.AddWindow(self.InstanceChoice, flag=wx.GROW) buttons_sizer.AddWindow(self.DebugButton) buttons_sizer.AddGrowableCol(1) buttons_sizer.AddGrowableRow(0) - + main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) main_sizer.AddSizer(buttons_sizer, flag=wx.GROW) main_sizer.AddWindow(self.VariablesList, flag=wx.GROW) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(1) - + self.SetSizer(main_sizer) - + self.ParentWindow = window self.Controller = controller self.Debug = debug if not self.Debug: self.DebugButton.Hide() - + self.PouTagName = None self.PouInfos = None self.PouInstance = None - + def __del__(self): self.Controller = None - + def SetTreeImageList(self, tree_image_list): self.VariablesList.SetImageList(tree_image_list) - + def SetController(self, controller): self.Controller = controller - + self.RefreshView() - + def SetPouType(self, tagname, pou_instance=None): if self.Controller is not None: if tagname == "Project": @@ -206,7 +223,7 @@ tagname = self.Controller.ComputeConfigurationName(config_name) if pou_instance is not None: self.PouInstance = pou_instance - + if self.PouTagName != tagname: self.PouTagName = tagname self.RefreshView() @@ -214,20 +231,20 @@ self.RefreshInstanceChoice() else: self.RefreshView() - + def ResetView(self): self.Controller = None - + self.PouTagName = None self.PouInfos = None self.PouInstance = None - + self.RefreshView() - + def RefreshView(self): self.Freeze() self.VariablesList.DeleteAllItems() - + if self.Controller is not None and self.PouTagName is not None: if self.PouTagName.split('::')[0] in ['A', 'T']: self.PouInfos = self.Controller.GetPouVariables('P::%s' % self.PouTagName.split('::')[1], self.Debug) @@ -244,24 +261,24 @@ text = "%s (%s)" % (var_infos.name, var_infos.type) else: text = var_infos.name - + right_images = [] if var_infos.edit: right_images.append(self.EditImage) - + if var_infos.debug and self.Debug: right_images.append(self.DebugInstanceImage) - + item = self.VariablesList.AppendItem(root, text) item.SetRightImages(right_images) self.VariablesList.SetItemImage(item, self.ParentWindow.GetTreeImage(var_infos.var_class)) self.VariablesList.SetPyData(item, var_infos) - + self.RefreshInstanceChoice() self.RefreshButtons() - + self.Thaw() - + def RefreshInstanceChoice(self): self.InstanceChoice.Clear() self.InstanceChoice.SetValue("") @@ -279,12 +296,12 @@ else: self.PouInstance = None self.InstanceChoice.SetValue(_("Select an instance")) - + def RefreshButtons(self): enabled = self.InstanceChoice.GetSelection() != -1 self.ParentButton.Enable(enabled and self.PouInfos.var_class != ITEM_CONFIGURATION) self.DebugButton.Enable(enabled and self.PouInfos.debug and self.Debug) - + root = self.VariablesList.GetRootItem() if root is not None and root.IsOk(): item, item_cookie = self.VariablesList.GetFirstChild(root) @@ -295,12 +312,12 @@ if child.GetName() != "edit": child.Enable(enabled) item, item_cookie = self.VariablesList.GetNextChild(root, item_cookie) - + def EditButtonCallback(self, infos): var_class = infos.var_class if var_class == ITEM_RESOURCE: tagname = self.Controller.ComputeConfigurationResourceName( - self.InstanceChoice.GetStringSelection(), + self.InstanceChoice.GetStringSelection(), infos.name) elif var_class == ITEM_TRANSITION: tagname = self.Controller.ComputePouTransitionName( @@ -314,7 +331,7 @@ var_class = ITEM_POU tagname = self.Controller.ComputePouName(infos.type) self.ParentWindow.EditProjectElement(var_class, tagname) - + def DebugButtonCallback(self, infos): if self.InstanceChoice.GetSelection() != -1: var_class = infos.var_class @@ -344,16 +361,16 @@ var_class, var_path, self.Controller.ComputePouName(infos.type)) - + def DebugButtonDClickCallback(self, infos): if self.InstanceChoice.GetSelection() != -1: if infos.var_class in ITEMS_VARIABLE: self.ParentWindow.AddDebugVariable( - "%s.%s" % (self.InstanceChoice.GetStringSelection(), - infos.name), + "%s.%s" % (self.InstanceChoice.GetStringSelection(), + infos.name), force=True, graph=True) - + def ShowInstanceChoicePopup(self): self.InstanceChoice.SetFocusFromKbd() size = self.InstanceChoice.GetSize() @@ -361,10 +378,10 @@ event.x = size.width / 2 event.y = size.height / 2 event.SetEventObject(self.InstanceChoice) - #event = wx.KeyEvent(wx.EVT_KEY_DOWN._getEvtType()) - #event.m_keyCode = wx.WXK_SPACE + # event = wx.KeyEvent(wx.EVT_KEY_DOWN._getEvtType()) + # event.m_keyCode = wx.WXK_SPACE self.InstanceChoice.GetEventHandler().ProcessEvent(event) - + def OnParentButtonClick(self, event): if self.InstanceChoice.GetSelection() != -1: parent_path = self.InstanceChoice.GetStringSelection().rsplit(".", 1)[0] @@ -373,11 +390,11 @@ wx.CallAfter(self.SetPouType, tagname, parent_path) wx.CallAfter(self.ParentWindow.SelectProjectTreeItem, tagname) event.Skip() - + def OnInstanceChoiceChanged(self, event): self.RefreshButtons() event.Skip() - + def OnDebugButtonClick(self, event): if self.InstanceChoice.GetSelection() != -1: self.ParentWindow.OpenDebugViewer( @@ -385,26 +402,26 @@ self.InstanceChoice.GetStringSelection(), self.PouTagName) event.Skip() - + def OnVariablesListItemActivated(self, event): selected_item = event.GetItem() if selected_item is not None and selected_item.IsOk(): item_infos = self.VariablesList.GetPyData(selected_item) if item_infos is not None: - + item_button = self.VariablesList.IsOverItemRightImage( selected_item, event.GetPoint()) if item_button is not None: callback = self.ButtonCallBacks[item_button].dclick if callback is not None: callback(item_infos) - + elif item_infos.var_class not in ITEMS_VARIABLE: instance_path = self.InstanceChoice.GetStringSelection() if item_infos.var_class == ITEM_RESOURCE: if instance_path != "": tagname = self.Controller.ComputeConfigurationResourceName( - instance_path, + instance_path, item_infos.name) else: tagname = None @@ -424,7 +441,7 @@ self.SetPouType(tagname, item_path) self.ParentWindow.SelectProjectTreeItem(tagname) event.Skip() - + def OnVariablesListLeftDown(self, event): if self.InstanceChoice.GetSelection() == -1: wx.CallAfter(self.ShowInstanceChoicePopup) @@ -434,15 +451,15 @@ if item is not None: item_infos = self.VariablesList.GetPyData(item) if item_infos is not None: - + item_button = self.VariablesList.IsOverItemRightImage( item, event.GetPosition()) if item_button is not None: callback = self.ButtonCallBacks[item_button].leftdown if callback is not None: callback(item_infos) - - elif (flags & CT.TREE_HITTEST_ONITEMLABEL and + + elif (flags & CT.TREE_HITTEST_ONITEMLABEL and item_infos.var_class in ITEMS_VARIABLE): self.ParentWindow.EnsureTabVisible( self.ParentWindow.DebugVariablePanel) @@ -457,4 +474,3 @@ keycode = event.GetKeyCode() if keycode != wx.WXK_LEFT: event.Skip() -