def __init__(self, parent, ID, bitmapname, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="genstatbmp"): bitmap = GetBitmap(bitmapname) if bitmap is None: bitmap = wx.Bitmap(0, 0) wx.StaticBitmap.__init__(self, parent, ID, bitmap, pos, size, style, name)
def __init__(self, parent, controler, name, folder, enable_dragndrop=False): self.Folder = os.path.realpath(folder) self.EnableDragNDrop = enable_dragndrop if wx.Platform == '__WXMSW__': self.HomeDirectory = "/" else: self.HomeDirectory = os.path.expanduser("~") EditorPanel.__init__(self, parent, name, None, None) self.Controler = controler self.EditableFileExtensions = [] self.EditButton.Hide() self.SetIcon(GetBitmap("FOLDER"))
def _init_ctrls(self, prnt): self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL, name='HeaderLabel', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) search_results_tree_style = CT.TR_HAS_BUTTONS | CT.TR_NO_LINES | CT.TR_HAS_VARIABLE_ROW_HEIGHT self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE, name="SearchResultsTree", parent=self, pos=wx.Point(0, 0), style=search_results_tree_style) if wx.VERSION >= (2, 8, 11): self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style) self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated, id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE) self.ResetButton = wx.lib.buttons.GenBitmapButton( self, bitmap=GetBitmap("reset"), size=wx.Size(28, 28), style=wx.NO_BORDER) self.ResetButton.SetToolTipString(_("Reset search result")) self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton) self._init_sizers()
def RefreshStatusToolBar(self): StatusToolBar = self.Panes["StatusToolBar"] StatusToolBar.ClearTools() StatusToolBar.SetMinSize(StatusToolBar.GetToolBitmapSize()) if self.CTR is not None: for confnode_method in self.CTR.StatusMethods: if "method" in confnode_method and confnode_method.get("shown", True): tool = StatusToolBar.AddTool( toolId=wx.ID_ANY, bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), shortHelp=confnode_method["tooltip"], label=confnode_method["name"]) self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), tool) StatusToolBar.Realize() self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show() else: self.AUIManager.GetPane("StatusToolBar").Hide() self.AUIManager.GetPane("EditorToolBar").Position(2) self.AUIManager.GetPane("StatusToolBar").Position(1) self.AUIManager.Update()
def _init_Editor(self, parent): self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER | wx.TAB_TRAVERSAL) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(0) main_sizer.AddGrowableRow(1) tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) tasks_sizer.AddGrowableCol(0) tasks_sizer.AddGrowableRow(1) main_sizer.AddSizer(tasks_sizer, border=5, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) tasks_buttons_sizer.AddGrowableCol(0) tasks_buttons_sizer.AddGrowableRow(0) tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW) tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:')) tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM) for name, bitmap, help in [ ("AddTaskButton", "add_element", _("Add task")), ("DeleteTaskButton", "remove_element", _("Remove task")), ("UpTaskButton", "up", _("Move task up")), ("DownTaskButton", "down", _("Move task down")) ]: button = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) tasks_buttons_sizer.AddWindow(button) self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL) self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange) tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW) instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) instances_sizer.AddGrowableCol(0) instances_sizer.AddGrowableRow(1) main_sizer.AddSizer(instances_sizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) instances_buttons_sizer.AddGrowableCol(0) instances_buttons_sizer.AddGrowableRow(0) instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW) instances_label = wx.StaticText(self.Editor, label=_(u'Instances:')) instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM) for name, bitmap, help in [ ("AddInstanceButton", "add_element", _("Add instance")), ("DeleteInstanceButton", "remove_element", _("Remove instance")), ("UpInstanceButton", "up", _("Move instance up")), ("DownInstanceButton", "down", _("Move instance down")) ]: button = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) instances_buttons_sizer.AddWindow(button) self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL) self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange) instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW) self.Editor.SetSizer(main_sizer)
class GraphButton(object): """ Class that implements a custom button for graphic Viewer """ def __init__(self, x, y, bitmap, callback): """ Constructor @param x: X coordinate of Button in Graphic Viewer @param y: Y coordinate of Button in Graphic Viewer @param bitmap: Name of bitmap to use for button @param callback: Reference to function to call when button is pressed """ # Save button position self.SetPosition(x, y) # Set button bitmap self.SetBitmap(bitmap) # By default button is hide and enabled self.Shown = False self.Enabled = True # Save reference to callback function self.Callback = callback def __del__(self): """ Destructor """ # Remove reference to callback function self.callback = None def SetBitmap(self, bitmap): """ Set bitmap to use for button @param bitmap: Name of bitmap to use for button """ # Get wx.Bitmap object corresponding to bitmap self.Bitmap = GetBitmap(bitmap) def GetSize(self): """ Return size of button @return: wx.Size object containing button size """ # Button size is size of bitmap return self.Bitmap.GetSize() def SetPosition(self, x, y): """ Set button position @param x: X coordinate of Button in Graphic Viewer @param y: Y coordinate of Button in Graphic Viewer """ self.Position = wx.Point(x, y) def Show(self, show=True): """ Mark if button to be displayed in Graphic Viewer @param show: True if button to be displayed in Graphic Viewer (default True) """ self.Shown = show def Hide(self): """ Hide button from Graphic Viewer """ self.Show(False) def IsShown(self): """ Return if button is displayed in Graphic Viewer @return: True if button is displayed in Graphic Viewer """ return self.Shown def Enable(self, enable=True): """ Mark if button is active in Graphic Viewer @param enable: True if button is active in Graphic Viewer (default True) """ self.Enabled = enable def Disable(self): """ Deactivate button in Graphic Viewer """ self.Enabled = False def IsEnabled(self): """ Return if button is active in Graphic Viewer @return: True if button is active in Graphic Viewer """ return self.Enabled def HitTest(self, x, y): """ Test if point is inside button @param x: X coordinate of point @param y: Y coordinate of point @return: True if button is active and displayed and point is inside button """ # Return immediately if button is hidden or inactive if not (self.IsShown() and self.IsEnabled()): return False # Test if point is inside button w, h = self.Bitmap.GetSize() rect = wx.Rect(self.Position.x, self.Position.y, w, h) return rect.Contains(x, y) def ProcessCallback(self): """ Call callback function if defined """ if self.Callback is not None: self.Callback() def Draw(self, dc): """ Draw button in Graphic Viewer @param dc: wx.DC object corresponding to Graphic Viewer device context """ # Only draw button if button is active and displayed if self.Shown and self.Enabled: dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
def __init__(self, parent, window, controler): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=4) main_sizer.AddGrowableCol(1) main_sizer.AddGrowableRow(0) controls_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSizer(controls_sizer, border=5, flag=wx.ALL) for name, bitmap, help in [ ("AddVariableButton", "add_element", _("Add variable")), ("DeleteVariableButton", "remove_element", _("Remove variable")), ("UpVariableButton", "up", _("Move variable up")), ("DownVariableButton", "down", _("Move variable down")) ]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) controls_sizer.AddWindow(button, border=5, flag=wx.BOTTOM) self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown) main_sizer.AddWindow(self.VariablesGrid, flag=wx.GROW) self.SetSizer(main_sizer) self.ParentWindow = window self.Controler = controler self.VariablesDefaultValue = { "Name": "LocalVar0", "Type": DefaultType, "Initial": "", "Description": "", "OnChange": "", "Options": "" } self.Table = VariablesTable(self, [], self.GetVariableTableColnames()) self.ColAlignements = [wx.ALIGN_RIGHT] + \ [wx.ALIGN_LEFT]*(len(self.VariablesDefaultValue)) self.ColSizes = [20, 150 ] + [130] * (len(self.VariablesDefaultValue) - 1) self.VariablesGrid.SetTable(self.Table) self.VariablesGrid.SetButtons({ "Add": self.AddVariableButton, "Delete": self.DeleteVariableButton, "Up": self.UpVariableButton, "Down": self.DownVariableButton }) def _AddVariable(new_row): if new_row > 0: row_content = self.Table.data[new_row - 1].copy() old_name = row_content['Name'] row_content['Name'] =\ self.Controler.GenerateNewName(old_name, old_name+'%d') else: row_content = self.VariablesDefaultValue.copy() self.Table.InsertRow(new_row, row_content) self.RefreshModel() self.RefreshView() return new_row setattr(self.VariablesGrid, "_AddRow", _AddVariable) def _DeleteVariable(row): self.Table.RemoveRow(row) self.RefreshModel() self.RefreshView() setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) def _MoveVariable(row, move): new_row = self.Table.MoveRow(row, move) if new_row != row: self.RefreshModel() self.RefreshView() return new_row setattr(self.VariablesGrid, "_MoveRow", _MoveVariable) self.VariablesGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) self.VariablesGrid.SetColAttr(col, attr) self.VariablesGrid.SetColSize(col, self.ColSizes[col]) self.Table.ResetView(self.VariablesGrid)
def _init_Editor(self, parent): tabs_num = len(self.CONFNODEEDITOR_TABS) if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0: tabs_num += 1 if tabs_num > 1 or self.SHOW_BASE_PARAMS: self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER | wx.SP_3D) self.MainSizer = wx.BoxSizer(wx.VERTICAL) if self.SHOW_BASE_PARAMS: baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL) self.MainSizer.AddSizer(baseparamseditor_sizer, border=5, flag=wx.GROW | wx.ALL) self.FullIECChannel = wx.StaticText(self.Editor, -1) self.FullIECChannel.SetFont( wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName=faces["helv"])) baseparamseditor_sizer.AddWindow(self.FullIECChannel, flag=wx.ALIGN_CENTER_VERTICAL) updownsizer = wx.BoxSizer(wx.VERTICAL) baseparamseditor_sizer.AddSizer(updownsizer, border=5, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton( self.Editor, bitmap=GetBitmap('IECCDown'), size=wx.Size(16, 16), style=wx.NO_BORDER) self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1), self.IECCUpButton) updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT) self.IECCDownButton = wx.lib.buttons.GenBitmapButton( self.Editor, bitmap=GetBitmap('IECCUp'), size=wx.Size(16, 16), style=wx.NO_BORDER) self.IECCDownButton.Bind( wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1), self.IECCDownButton) updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT) self.ConfNodeName = wx.TextCtrl(self.Editor, size=wx.Size(150, 25)) self.ConfNodeName.SetFont( wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName=faces["helv"])) self.ConfNodeName.Bind( wx.EVT_TEXT, self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), self.ConfNodeName) baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL) buttons_sizer = self.GenerateMethodButtonSizer() baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER) if tabs_num > 1: self.ConfNodeNoteBook = wx.Notebook(self.Editor) parent = self.ConfNodeNoteBook self.MainSizer.AddWindow(self.ConfNodeNoteBook, 1, flag=wx.GROW) else: parent = self.Editor self.ConfNodeNoteBook = None self.Editor.SetSizer(self.MainSizer) else: self.ConfNodeNoteBook = None self.Editor = None for title, create_func_name in self.CONFNODEEDITOR_TABS: editor = getattr(self, create_func_name)(parent) if self.ConfNodeNoteBook is not None: self.ConfNodeNoteBook.AddPage(editor, title) elif self.SHOW_BASE_PARAMS: self.MainSizer.AddWindow(editor, 1, flag=wx.GROW) else: self.Editor = editor if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0: panel_style = wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL if self.ConfNodeNoteBook is None and parent != self.Editor: panel_style |= wx.SUNKEN_BORDER self.ParamsEditor = wx.ScrolledWindow(parent, style=panel_style) self.ParamsEditor.Bind(wx.EVT_SIZE, self.OnParamsEditorResize) self.ParamsEditor.Bind(wx.EVT_SCROLLWIN, self.OnParamsEditorScroll) self.ParamsEditorSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=1, vgap=5) self.ParamsEditorSizer.AddGrowableCol(0) self.ParamsEditorSizer.AddGrowableRow(0) self.ParamsEditor.SetSizer(self.ParamsEditorSizer) self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL) self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM) self.RefreshConfNodeParamsSizer() if self.ConfNodeNoteBook is not None: self.ConfNodeNoteBook.AddPage(self.ParamsEditor, _("Config")) elif self.SHOW_BASE_PARAMS: self.MainSizer.AddWindow(self.ParamsEditor, 1, flag=wx.GROW) else: self.Editor = self.ParamsEditor else: self.ParamsEditor = None
def __init__(self, parent, folder, filter=None, editable=True): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) main_sizer = wx.BoxSizer(wx.VERTICAL) self.Tree = wx.TreeCtrl( self, style=(wx.TR_HAS_BUTTONS | wx.TR_SINGLE | wx.SUNKEN_BORDER | wx.TR_HIDE_ROOT | wx.TR_LINES_AT_ROOT | wx.TR_EDIT_LABELS)) if wx.Platform == '__WXMSW__': self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTreeItemExpanded, self.Tree) self.Tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown) else: self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnTreeItemExpanded, self.Tree) self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnTreeItemCollapsed, self.Tree) self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTreeBeginLabelEdit, self.Tree) self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTreeEndLabelEdit, self.Tree) main_sizer.Add(self.Tree, 1, flag=wx.GROW) if filter is not None: self.Filter = wx.ComboBox(self, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnFilterChanged, self.Filter) main_sizer.Add(self.Filter, flag=wx.GROW) else: self.Filter = None self.SetSizer(main_sizer) self.Folder = folder self.Editable = editable self.TreeImageList = wx.ImageList(16, 16) self.TreeImageDict = {} for item_type, bitmap in [(DRIVE, "tree_drive"), (FOLDER, "tree_folder"), (FILE, "tree_file")]: self.TreeImageDict[item_type] = self.TreeImageList.Add( GetBitmap(bitmap)) self.Tree.SetImageList(self.TreeImageList) self.Filters = {} if self.Filter is not None: filter_parts = filter.split("|") for idx in list(range(0, len(filter_parts), 2)): if filter_parts[idx + 1] == "*.*": self.Filters[filter_parts[idx]] = "" else: self.Filters[filter_parts[idx]] = filter_parts[idx + 1].replace( "*", "") self.Filter.Append(filter_parts[idx]) if idx == 0: self.Filter.SetStringSelection(filter_parts[idx]) self.CurrentFilter = self.Filters[self.Filter.GetStringSelection()] else: self.CurrentFilter = ""
def _init_Editor(self, parent): self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER) self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) self.MainSizer.AddGrowableCol(0) self.MainSizer.AddGrowableRow(1) top_sizer = wx.BoxSizer(wx.HORIZONTAL) self.MainSizer.AddSizer(top_sizer, border=5, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:')) top_sizer.AddWindow(derivation_type_label, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT) self.DerivationType = wx.ComboBox(self.Editor, size=wx.Size(200, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType) top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT) typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:')) typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL) self.MainSizer.AddSizer(typeinfos_sizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT) # Panel for Directly derived data types self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) typeinfos_sizer.AddWindow(self.DirectlyPanel, 1) directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) directly_basetype_label = wx.StaticText(self.DirectlyPanel, label=_('Base Type:')) directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType) directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW | wx.ALL) directly_initialvalue_label = wx.StaticText(self.DirectlyPanel, label=_('Initial Value:')) directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, style=wx.TE_PROCESS_ENTER | wx.TE_RICH) self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue) directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.ALL) self.DirectlyPanel.SetSizer(directly_panel_sizer) # Panel for Subrange data types self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) typeinfos_sizer.AddWindow(self.SubrangePanel, 1) subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0) subrange_basetype_label = wx.StaticText(self.SubrangePanel, label=_('Base Type:')) subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, self.SubrangeBaseType) subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW | wx.ALL) subrange_initialvalue_label = wx.StaticText(self.SubrangePanel, label=_('Initial Value:')) subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue) subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW | wx.ALL) subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:')) subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum) subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW | wx.ALL) for i in xrange(2): subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1) subrange_maximum_label = wx.StaticText(self.SubrangePanel, label=_('Maximum:')) subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL) self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum) subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW | wx.ALL) self.SubrangePanel.SetSizer(subrange_panel_sizer) # Panel for Enumerated data types self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1) enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) self.EnumeratedValues = CustomEditableListBox( self.EnumeratedPanel, label=_("Values:"), style=(wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)) setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit) for func in [ "_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton" ]: setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged) enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, flag=wx.GROW | wx.ALL) enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1) enumerated_initialvalue_label = wx.StaticText( self.EnumeratedPanel, label=_('Initial Value:')) enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue) enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL) self.EnumeratedPanel.SetSizer(enumerated_panel_sizer) # Panel for Array data types self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) typeinfos_sizer.AddWindow(self.ArrayPanel, 1) array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0) array_panel_sizer.AddGrowableCol(0) array_panel_sizer.AddGrowableCol(1) array_panel_sizer.AddGrowableRow(1) array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL) array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW) array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:')) array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType) array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW | wx.ALL) array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL) array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW) array_initialvalue_label = wx.StaticText(self.ArrayPanel, label=_('Initial Value:')) array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL) self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel, style=wx.TE_PROCESS_ENTER | wx.TE_RICH) self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue) array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.ALL) self.ArrayDimensions = CustomEditableListBox( self.ArrayPanel, label=_("Dimensions:"), style=(wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)) for func in [ "_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton" ]: setattr(self.ArrayDimensions, func, self.OnDimensionsChanged) array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW | wx.ALL) self.ArrayPanel.SetSizer(array_panel_sizer) # Panel for Structure data types self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL) typeinfos_sizer.AddWindow(self.StructurePanel, 1) structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) structure_panel_sizer.AddGrowableCol(0) structure_panel_sizer.AddGrowableRow(1) structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) structure_button_sizer.AddGrowableCol(0) structure_button_sizer.AddGrowableRow(0) structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, flag=wx.ALL | wx.GROW) structure_elements_label = wx.StaticText(self.StructurePanel, label=_('Elements :')) structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM) for name, bitmap, help in [ ("StructureAddButton", "add_element", _("Add element")), ("StructureDeleteButton", "remove_element", _("Remove element")), ("StructureUpButton", "up", _("Move element up")), ("StructureDownButton", "down", _("Move element down")) ]: button = wx.lib.buttons.GenBitmapButton(self.StructurePanel, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) structure_button_sizer.AddWindow(button) self.StructureElementsGrid = CustomGrid(self.StructurePanel, size=wx.Size(0, 150), style=wx.VSCROLL) self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnStructureElementsGridCellChange) self.StructureElementsGrid.Bind( wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnStructureElementsGridEditorShown) structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW) self.StructurePanel.SetSizer(structure_panel_sizer) self.Editor.SetSizer(self.MainSizer)
def __init__(self, parent, window): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER) DebugViewer.__init__(self, None, False, False) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(1) filter_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer.AddSizer(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW) self.MessageFilter = wx.ComboBox(self, style=wx.CB_READONLY) self.MessageFilter.Append(_("All")) levels = LogLevels[:3] levels.reverse() for level in levels: self.MessageFilter.Append(_(level)) self.Bind(wx.EVT_COMBOBOX, self.OnMessageFilterChanged, self.MessageFilter) filter_sizer.AddWindow(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL) self.SearchMessage = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER) self.SearchMessage.ShowSearchButton(True) self.SearchMessage.ShowCancelButton(True) self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage) self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.OnSearchMessageSearchButtonClick, self.SearchMessage) self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.OnSearchMessageCancelButtonClick, self.SearchMessage) filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL) self.CleanButton = wx.lib.buttons.GenBitmapButton( self, bitmap=GetBitmap("Clean"), size=wx.Size(28, 28), style=wx.NO_BORDER) self.CleanButton.SetToolTipString(_("Clean log messages")) self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton) filter_sizer.AddWindow(self.CleanButton) message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) message_panel_sizer.AddGrowableCol(0) message_panel_sizer.AddGrowableRow(0) main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW) self.MessagePanel = wx.Panel(self) if wx.Platform == '__WXMSW__': self.Font = wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName='Courier New') else: self.Font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName='Courier') self.MessagePanel.Bind(wx.EVT_LEFT_UP, self.OnMessagePanelLeftUp) self.MessagePanel.Bind(wx.EVT_RIGHT_UP, self.OnMessagePanelRightUp) self.MessagePanel.Bind(wx.EVT_LEFT_DCLICK, self.OnMessagePanelLeftDCLick) self.MessagePanel.Bind(wx.EVT_MOTION, self.OnMessagePanelMotion) self.MessagePanel.Bind(wx.EVT_LEAVE_WINDOW, self.OnMessagePanelLeaveWindow) self.MessagePanel.Bind(wx.EVT_MOUSEWHEEL, self.OnMessagePanelMouseWheel) self.MessagePanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnMessagePanelEraseBackground) self.MessagePanel.Bind(wx.EVT_PAINT, self.OnMessagePanelPaint) self.MessagePanel.Bind(wx.EVT_SIZE, self.OnMessagePanelResize) message_panel_sizer.AddWindow(self.MessagePanel, flag=wx.GROW) self.MessageScrollBar = LogScrollBar(self, wx.Size(16, -1)) message_panel_sizer.AddWindow(self.MessageScrollBar, flag=wx.GROW) self.SetSizer(main_sizer) self.LeftButtons = [] for label, callback in [ ("+" + text, self.GenerateOnDurationButton(duration)) for text, duration in CHANGE_TIMESTAMP_BUTTONS ]: self.LeftButtons.append(LogButton(label, callback)) self.RightButtons = [] for label, callback in [ ("-" + text, self.GenerateOnDurationButton(-duration)) for text, duration in CHANGE_TIMESTAMP_BUTTONS ]: self.RightButtons.append(LogButton(label, callback)) self.MessageFilter.SetSelection(0) self.LogSource = None self.ResetLogMessages() self.ParentWindow = window self.LevelIcons = [GetBitmap("LOG_" + level) for level in LogLevels] self.LevelFilters = [range(i) for i in xrange(4, 0, -1)] self.CurrentFilter = self.LevelFilters[0] self.CurrentSearchValue = "" self.ScrollSpeed = 0. self.LastStartTime = None self.ScrollTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnScrollTimer, self.ScrollTimer) self.LastMousePos = None self.MessageToolTip = None self.MessageToolTipTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnMessageToolTipTimer, self.MessageToolTipTimer)
def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True): # Add beremiz's icon in top left corner of the frame self.icon = wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO) self.__init_execute_path() IDEFrame.__init__(self, parent, debug) self.Log = LogPseudoFile(self.LogConsole, self.SelectTab) self.local_runtime = None self.runtime_port = None self.local_runtime_tmpdir = None self.LastPanelSelected = None # Define Tree item icon list self.LocationImageList = wx.ImageList(16, 16) self.LocationImageDict = {} # Icons for location items for imgname, itemtype in [("CONFIGURATION", LOCATION_CONFNODE), ("RESOURCE", LOCATION_MODULE), ("PROGRAM", LOCATION_GROUP), ("VAR_INPUT", LOCATION_VAR_INPUT), ("VAR_OUTPUT", LOCATION_VAR_OUTPUT), ("VAR_LOCAL", LOCATION_VAR_MEMORY)]: self.LocationImageDict[itemtype] = self.LocationImageList.Add( GetBitmap(imgname)) # Icons for other items for imgname, itemtype in [("Extension", ITEM_CONFNODE)]: self.TreeImageDict[itemtype] = self.TreeImageList.Add( GetBitmap(imgname)) if projectOpen is not None: projectOpen = DecodeFileSystemPath(projectOpen, False) if projectOpen is not None and os.path.isdir(projectOpen): self.CTR = ProjectController(self, self.Log) self.Controler = self.CTR result, _err = self.CTR.LoadProject(projectOpen, buildpath) if not result: self.LibraryPanel.SetController(self.Controler) self.ProjectTree.Enable(True) self.PouInstanceVariablesPanel.SetController(self.Controler) self.RefreshConfigRecentProjects(os.path.abspath(projectOpen)) self.RefreshAfterLoad() else: self.ResetView() self.ShowErrorMessage(result) else: self.CTR = ctr self.Controler = ctr if ctr is not None: ctr.SetAppFrame(self, self.Log) self.LibraryPanel.SetController(self.Controler) self.ProjectTree.Enable(True) self.PouInstanceVariablesPanel.SetController(self.Controler) self.RefreshAfterLoad() if self.EnableDebug: self.DebugVariablePanel.SetDataProducer(self.CTR) self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) self.RefreshAll() self.LogConsole.SetFocus()
def __init__(self, parent, window, controler): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) """ main sizer """ requestPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=4) requestPanelSizer.AddGrowableCol(1) requestPanelSizer.AddGrowableRow(0) """ sizer with control buttons """ controls_sizer = wx.BoxSizer(wx.VERTICAL) requestPanelSizer.AddSizer(controls_sizer, border=5, flag=wx.ALL) for name, bitmap, help in [ ("AddVariableButton", "add_element", _("Add variable")), ("DeleteVariableButton", "remove_element", _("Remove variable")), ("UpVariableButton", "up", _("Move variable up")), ("DownVariableButton", "down", _("Move variable down")) ]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) controls_sizer.AddWindow(button, border=5, flag=wx.BOTTOM) """ variable grid """ self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown) requestPanelSizer.AddWindow(self.VariablesGrid, flag=wx.GROW) """ add header to grid """ mainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=4) mainSizer.AddGrowableRow(1) mainSizer.AddGrowableCol(0) headerSizer = wx.BoxSizer(wx.HORIZONTAL) label = wx.StaticText(self, label=" Request data") font = wx.Font(14, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) label.SetFont(font) headerSizer.Add(label) self.masterSelectCmbx = ComboBoxWithLabel( self, "", ("Master0", "Master1", "Master2")) wx.EVT_COMBOBOX(self, self.masterSelectCmbx.cmbbox.GetId(), self.OnChangeMasterOption) headerSizer.Add(self.masterSelectCmbx, flag=wx.ALIGN_CENTER_VERTICAL) mainSizer.AddSizer(headerSizer, flag=wx.GROW) mainSizer.AddSizer(requestPanelSizer, flag=wx.GROW) self.SetSizer(mainSizer) self.ParentWindow = window self.Controler = controler """ request defaule data value """ self.VariablesDefaultValue = { "Name": "", "Address": "1", "Len": "1", "Data type": "WORD", "Modbus type": HOLDING_REGISTER_READ, "Description": DESCRIPTION, "Device ID": "1", "Transfer method": "Periodic", "Period (ms)": "100", "Timeout (ms)": "100", } self.Table = MBRequestDataTable(self) self.ColAlignements = [wx.ALIGN_RIGHT] + \ [wx.ALIGN_LEFT]*(len(self.VariablesDefaultValue)) self.ColSizes = [20, 150 ] + [100] * (len(self.VariablesDefaultValue) - 1) self.VariablesGrid.SetTable(self.Table) self.VariablesGrid.SetButtons({ "Add": self.AddVariableButton, "Delete": self.DeleteVariableButton, "Up": self.UpVariableButton, "Down": self.DownVariableButton }) """ handlers for adding variable """ def _AddVariable(new_row): if new_row > 0: row_content = self.Table.data[new_row - 1].copy() newAddr = int(row_content["Address"]) newLen = int(row_content["Len"]) if row_content["Data type"] in ("REAL", "INT"): newLen = newLen * 2 newAddr = newAddr + newLen row_content["Address"] = str(newAddr) result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"]) if result is not None: name = row_content["Name"][:result.start(1)] suffix = result.group(1) if suffix != "": start_idx = int(suffix) else: start_idx = 0 else: name = row_content["Name"] start_idx = 0 row_content["Name"] = self.Controler.GenerateNewName( name + "%d", start_idx) else: row_content = self.VariablesDefaultValue.copy() self.Table.InsertRow(new_row, row_content) self.RefreshModel() self.RefreshView() return new_row setattr(self.VariablesGrid, "_AddRow", _AddVariable) """ handlers for deleting variable """ def _DeleteVariable(row): self.Table.RemoveRow(row) self.RefreshModel() self.RefreshView() setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) """ handlers for moving varible """ def _MoveVariable(row, move): new_row = self.Table.MoveRow(row, move) if new_row != row: self.RefreshModel() self.RefreshView() return new_row setattr(self.VariablesGrid, "_MoveRow", _MoveVariable) self.VariablesGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) self.VariablesGrid.SetColAttr(col, attr) self.VariablesGrid.SetColSize(col, self.ColSizes[col]) self.Table.ResetView(self.VariablesGrid)
def SetImageListCheck(self, sizex, sizey, imglist=None): CT.CustomTreeCtrl.SetImageListCheck(self, sizex, sizey, imglist=None) self.ExtraImages = {} for image in ["function", "functionBlock", "program"]: self.ExtraImages[image] = self._imageListCheck.Add(GetBitmap(image.upper()))
def __init__(self, parent): wx.Dialog.__init__(self, parent, title=_('Edit action block properties')) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(1) top_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) top_sizer.AddGrowableCol(0) top_sizer.AddGrowableRow(0) main_sizer.AddSizer(top_sizer, border=20, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT) actions_label = wx.StaticText(self, label=_('Actions:')) top_sizer.AddWindow(actions_label, flag=wx.ALIGN_BOTTOM) for name, bitmap, help in [ ("AddButton", "add_element", _("Add action")), ("DeleteButton", "remove_element", _("Remove action")), ("UpButton", "up", _("Move action up")), ("DownButton", "down", _("Move action down")) ]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) top_sizer.AddWindow(button) self.ActionsGrid = CustomGrid(self, size=wx.Size(-1, 250), style=wx.VSCROLL) self.ActionsGrid.DisableDragGridSize() self.ActionsGrid.EnableScrolling(False, True) self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnActionsGridCellChange) main_sizer.AddSizer(self.ActionsGrid, border=20, flag=wx.GROW | wx.LEFT | wx.RIGHT) button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE) self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton()) main_sizer.AddSizer(button_sizer, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT) self.SetSizer(main_sizer) self.Table = ActionTable(self, [], GetActionTableColnames()) typelist = GetTypeList() self.TypeList = ",".join(map(_, typelist)) self.TranslateType = dict([(_(value), value) for value in typelist]) self.ColSizes = [60, 90, 130, 200, 50] self.ColAlignements = [ wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT ] self.ActionsGrid.SetTable(self.Table) self.ActionsGrid.SetDefaultValue( _ActionInfos("N", "Action", "", "", "")) self.ActionsGrid.SetButtons({ "Add": self.AddButton, "Delete": self.DeleteButton, "Up": self.UpButton, "Down": self.DownButton }) self.ActionsGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) self.ActionsGrid.SetColAttr(col, attr) self.ActionsGrid.SetColMinimalWidth(col, self.ColSizes[col]) self.ActionsGrid.AutoSizeColumn(col, False) self.Table.ResetView(self.ActionsGrid) self.ActionsGrid.SetFocus() self.ActionsGrid.RefreshButtons() self.Fit()
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) self.ParentButton.SetToolTipString(_("Parent instance")) 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.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.VariablesList.SetIndent(0) self.VariablesList.SetSpacing(5) self.VariablesList.DoSelectItem = lambda *x, **y: True self.VariablesList.Bind(CT.EVT_TREE_ITEM_ACTIVATED, 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 __init__(self, parent, var_type, controller): wx.Dialog.__init__(self, parent, title=_('Browse Locations'), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) self.DIRFILTERCHOICE_OPTIONS = dict([ (_(option), filter) for option, filter in GetDirFilterChoiceOptions() ]) main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(1) locations_label = wx.StaticText(self, label=_('Locations available:')) main_sizer.AddWindow(locations_label, border=20, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW) self.LocationsTree = wx.TreeCtrl( self, style=(wx.TR_HAS_BUTTONS | wx.TR_SINGLE | wx.SUNKEN_BORDER | wx.TR_HIDE_ROOT | wx.TR_LINES_AT_ROOT)) self.LocationsTree.SetInitialSize(wx.Size(-1, 300)) self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnLocationsTreeItemActivated, self.LocationsTree) main_sizer.AddWindow(self.LocationsTree, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW) self.RenameCheckBox = wx.CheckBox( self, label=_("Rename variable to signal name")) self.Config = wx.ConfigBase.Get() default_checked = self.Config.Read( "RenameVariableOnLocationChange") == "True" self.RenameCheckBox.SetValue(default_checked) self.do_rename = default_checked main_sizer.AddWindow(self.RenameCheckBox, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW) button_gridsizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) button_gridsizer.AddGrowableCol(1) button_gridsizer.AddGrowableCol(3) button_gridsizer.AddGrowableRow(0) main_sizer.AddSizer(button_gridsizer, border=20, flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.GROW) direction_label = wx.StaticText(self, label=_('Direction:')) button_gridsizer.AddWindow(direction_label, flag=wx.ALIGN_CENTER_VERTICAL) self.DirFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.DirFilterChoice) button_gridsizer.AddWindow(self.DirFilterChoice, flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL) filter_label = wx.StaticText(self, label=_('Type:')) button_gridsizer.AddWindow(filter_label, flag=wx.ALIGN_CENTER_VERTICAL) self.TypeFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.TypeFilterChoice) button_gridsizer.AddWindow(self.TypeFilterChoice, flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL) button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE) self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton()) button_gridsizer.AddSizer(button_sizer, flag=wx.ALIGN_RIGHT) self.SetSizer(main_sizer) self.Controller = controller self.VarType = var_type self.BaseVarType = self.Controller.GetBaseType(self.VarType) self.VarTypeSize = LOCATION_SIZES[self.BaseVarType] self.Locations = self.Controller.GetVariableLocationTree() # Define Tree item icon list self.TreeImageList = wx.ImageList(16, 16) self.TreeImageDict = {} # Icons for items for imgname, itemtype in [("CONFIGURATION", LOCATION_CONFNODE), ("RESOURCE", LOCATION_MODULE), ("PROGRAM", LOCATION_GROUP), ("VAR_INPUT", LOCATION_VAR_INPUT), ("VAR_OUTPUT", LOCATION_VAR_OUTPUT), ("VAR_LOCAL", LOCATION_VAR_MEMORY)]: self.TreeImageDict[itemtype] = self.TreeImageList.Add( GetBitmap(imgname)) # Assign icon list to TreeCtrls self.LocationsTree.SetImageList(self.TreeImageList) # Set a options for the choice for option, _filter in GetDirFilterChoiceOptions(): self.DirFilterChoice.Append(_(option)) self.DirFilterChoice.SetStringSelection(_("All")) for option in GetTypeFilterChoiceOptions(): self.TypeFilterChoice.Append(_(option)) self.TypeFilterChoice.SetStringSelection(_("All")) self.RefreshFilters() self.RefreshLocationsTree() self.Fit()
def _init_Editor(self, parent): self.Editor = wx.Panel(parent) main_sizer = wx.BoxSizer(wx.HORIZONTAL) left_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSizer(left_sizer, 1, border=5, flag=wx.GROW | wx.ALL) managed_dir_label = wx.StaticText(self.Editor, label=_(self.TagName) + ":") left_sizer.AddWindow(managed_dir_label, border=5, flag=wx.GROW | wx.BOTTOM) self.ManagedDir = FolderTree(self.Editor, self.Folder, FILTER) left_sizer.AddWindow(self.ManagedDir, 1, flag=wx.GROW) managed_treectrl = self.ManagedDir.GetTreeCtrl() self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, managed_treectrl) if self.EnableDragNDrop: self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag, managed_treectrl) button_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSizer(button_sizer, border=5, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL) for idx, (name, bitmap, help) in enumerate([ ("DeleteButton", "remove_element", _("Remove file from left folder")), ("LeftCopyButton", "LeftCopy", _("Copy file from right folder to left")), ("RightCopyButton", "RightCopy", _("Copy file from left folder to right")), ("EditButton", "edit", _("Edit file")) ]): button = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) if idx > 0: flag = wx.TOP else: flag = 0 self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button) button_sizer.AddWindow(button, border=20, flag=flag) right_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSizer(right_sizer, 1, border=5, flag=wx.GROW | wx.ALL) if wx.Platform == '__WXMSW__': system_dir_label = wx.StaticText(self.Editor, label=_("My Computer:")) else: system_dir_label = wx.StaticText(self.Editor, label=_("Home Directory:")) right_sizer.AddWindow(system_dir_label, border=5, flag=wx.GROW | wx.BOTTOM) self.SystemDir = FolderTree(self.Editor, self.HomeDirectory, FILTER, False) right_sizer.AddWindow(self.SystemDir, 1, flag=wx.GROW) system_treectrl = self.SystemDir.GetTreeCtrl() self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, system_treectrl) self.Editor.SetSizer(main_sizer)
def __init__(self, parent, producer, window): """ Constructor @param parent: Reference to the parent wx.Window @param producer: Object receiving debug value and dispatching them to consumers @param window: Reference to Beremiz frame """ wx.Panel.__init__(self, parent, style=wx.SP_3D | wx.TAB_TRAVERSAL) # List of values possible for graph range # Format is [(time_in_plain_text, value_in_nanosecond),...] self.RANGE_VALUES = [(_("%dms") % i, i * MILLISECOND) for i in (10, 20, 50, 100, 200, 500)] + \ [(_("%ds") % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \ [(_("%dm") % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \ [(_("%dh") % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)] # Save Reference to Beremiz frame self.ParentWindow = window # Variable storing flag indicating that variable displayed in table # received new value and then table need to be refreshed self.HasNewData = False # Variable storing flag indicating that refresh has been forced, and # that next time refresh is possible, it will be done even if no new # data is available self.Force = False self.SetBackgroundColour(wx.WHITE) main_sizer = wx.BoxSizer(wx.VERTICAL) self.Ticks = numpy.array([]) # List of tick received self.StartTick = 0 # Tick starting range of data displayed self.Fixed = False # Flag that range of data is fixed self.CursorTick = None # Tick of cursor for displaying values self.DraggingAxesPanel = None self.DraggingAxesBoundingBox = None self.DraggingAxesMousePos = None self.VetoScrollEvent = False self.VariableNameMask = [] self.GraphicPanels = [] graphics_button_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer.Add(graphics_button_sizer, border=5, flag=wx.GROW | wx.ALL) range_label = wx.StaticText(self, label=_('Range:')) graphics_button_sizer.Add(range_label, flag=wx.ALIGN_CENTER_VERTICAL) self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) graphics_button_sizer.Add(self.CanvasRange, 1, border=5, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) self.CanvasRange.Clear() default_range_idx = 0 for idx, (text, _value) in enumerate(self.RANGE_VALUES): self.CanvasRange.Append(text) if _value == 1000000000: default_range_idx = idx self.CanvasRange.SetSelection(default_range_idx) for name, bitmap, help in [("CurrentButton", "current", _("Go to current value")), ("LoadButton", "open", _("load vars")), ("SaveButton", "save", _("save vars")), ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTip(help) setattr(self, name, button) self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button) graphics_button_sizer.Add(button, border=5, flag=wx.LEFT) self.CanvasPosition = wx.ScrollBar(self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL) self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, self.OnPositionChanging, self.CanvasPosition) self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnPositionChanging, self.CanvasPosition) main_sizer.Add(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM) self.TickSizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer.Add(self.TickSizer, border=5, flag=wx.ALL | wx.GROW) self.TickLabel = wx.StaticText(self) self.TickSizer.Add(self.TickLabel, border=5, flag=wx.RIGHT) self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_CENTER | wx.NO_BORDER) self.TickSizer.Add(self.MaskLabel, 1, border=5, flag=wx.RIGHT | wx.GROW) self.TickTimeLabel = wx.StaticText(self) self.TickSizer.Add(self.TickTimeLabel) self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL | wx.VSCROLL) self.GraphicsWindow.SetBackgroundColour(wx.WHITE) self.GraphicsWindow.SetDropTarget(DebugVariableDropTarget(self)) self.GraphicsWindow.Bind(wx.EVT_PAINT, self.OnGraphicsWindowPaint) self.GraphicsWindow.Bind(wx.EVT_SIZE, self.OnGraphicsWindowResize) self.GraphicsWindow.Bind(wx.EVT_MOUSEWHEEL, self.OnGraphicsWindowMouseWheel) main_sizer.Add(self.GraphicsWindow, 1, flag=wx.GROW) self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL) self.GraphicsWindow.SetSizer(self.GraphicsSizer) DebugViewer.__init__(self, producer, True) self.SetSizer(main_sizer) self.SetTickTime()
def __init__(self, parent, window, controler, element_type, debug=False): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0) self.MainSizer.AddGrowableCol(0) self.MainSizer.AddGrowableRow(1) controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5) controls_sizer.AddGrowableCol(5) controls_sizer.AddGrowableRow(0) self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW | wx.ALL) self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:')) controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL) self.ReturnType = wx.ComboBox(self, size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType) controls_sizer.AddWindow(self.ReturnType) self.DescriptionLabel = wx.StaticText(self, label=_('Description:')) controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL) self.Description = wx.TextCtrl(self, size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description) self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged) controls_sizer.AddWindow(self.Description) class_filter_label = wx.StaticText(self, label=_('Class Filter:')) controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL) self.ClassFilter = wx.ComboBox(self, size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter) controls_sizer.AddWindow(self.ClassFilter) for name, bitmap, help in [ ("AddButton", "add_element", _("Add variable")), ("DeleteButton", "remove_element", _("Remove variable")), ("UpButton", "up", _("Move variable up")), ("DownButton", "down", _("Move variable down")) ]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) controls_sizer.AddWindow(button) self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL) self.VariablesGrid.SetDropTarget(VariableDropTarget(self)) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown) self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW) self.SetSizer(self.MainSizer) self.ParentWindow = window self.Controler = controler self.ElementType = element_type self.Debug = debug self.RefreshHighlightsTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer) self.Filter = "All" self.FilterChoices = [] self.FilterChoiceTransfer = GetFilterChoiceTransfer() self.DefaultValue = { "Name": "", "Class": "", "Type": "INT", "Location": "", "Initial Value": "", "Option": "", "Documentation": "", "Edit": True } if element_type in ["config", "resource"]: self.DefaultTypes = {"All": "Global"} else: self.DefaultTypes = { "All": "Local", "Interface": "Input", "Variables": "Local" } if element_type in ["config", "resource"] \ or element_type in ["program", "transition", "action"]: # this is an element that can have located variables self.Table = VariableTable(self, [], GetVariableTableColnames(True)) if element_type in ["config", "resource"]: self.FilterChoices = ["All", "Global"] #,"Access"] else: self.FilterChoices = [ "All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp" ] #,"Access"] # these condense the ColAlignements list l = wx.ALIGN_LEFT c = wx.ALIGN_CENTER # Num Name Class Type Loc Init Option Doc #self.ColSizes = [40, 80, 70, 80, 80, 80, 100, 80] self.ColSizes = [30, 120, 70, 80, 80, 80, 70, 160] self.ColAlignements = [c, l, l, l, l, l, l, l] else: # this is an element that cannot have located variables self.Table = VariableTable(self, [], GetVariableTableColnames(False)) if element_type == "function": self.FilterChoices = [ "All", "Interface", " Input", " Output", " InOut", "Variables", " Local" ] else: self.FilterChoices = [ "All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp" ] # these condense the ColAlignements list l = wx.ALIGN_LEFT c = wx.ALIGN_CENTER # Num Name Class Type Init Option Doc #self.ColSizes = [40, 80, 70, 80, 80, 100, 160] self.ColSizes = [30, 120, 70, 80, 80, 70, 160] self.ColAlignements = [c, l, l, l, l, l, l] for choice in self.FilterChoices: self.ClassFilter.Append(_(choice)) reverse_transfer = {} for filter, choice in self.FilterChoiceTransfer.items(): reverse_transfer[choice] = filter self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter])) self.RefreshTypeList() self.VariablesGrid.SetTable(self.Table) self.VariablesGrid.SetButtons({ "Add": self.AddButton, "Delete": self.DeleteButton, "Up": self.UpButton, "Down": self.DownButton }) self.VariablesGrid.SetEditable(not self.Debug) def _AddVariable(new_row): if new_row > 0: row_content = self.Values[new_row - 1].copy() result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"]) if result is not None: name = row_content["Name"][:result.start(1)] suffix = result.group(1) if suffix != "": start_idx = int(suffix) else: start_idx = 0 else: name = row_content["Name"] start_idx = 0 else: row_content = None start_idx = 0 name = "LocalVar" if row_content is not None and row_content["Edit"]: row_content = self.Values[new_row - 1].copy() else: row_content = self.DefaultValue.copy() if self.Filter in self.DefaultTypes: row_content["Class"] = self.DefaultTypes[self.Filter] else: row_content["Class"] = self.Filter row_content["Name"] = self.Controler.GenerateNewName( self.TagName, None, name + "%d", start_idx) if self.Filter == "All" and len(self.Values) > 0: self.Values.insert(new_row, row_content) else: self.Values.append(row_content) new_row = self.Table.GetNumberRows() self.SaveValues() self.RefreshValues() return new_row setattr(self.VariablesGrid, "_AddRow", _AddVariable) def _DeleteVariable(row): if self.Table.GetValueByName(row, "Edit"): self.Values.remove(self.Table.GetRow(row)) self.SaveValues() self.RefreshValues() setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) def _MoveVariable(row, move): if self.Filter == "All": new_row = max(0, min(row + move, len(self.Values) - 1)) if new_row != row: self.Values.insert(new_row, self.Values.pop(row)) self.SaveValues() self.RefreshValues() return new_row return row setattr(self.VariablesGrid, "_MoveRow", _MoveVariable) def _RefreshButtons(): if self: table_length = len(self.Table.data) row_class = None row_edit = True row = 0 if table_length > 0: row = self.VariablesGrid.GetGridCursorRow() row_edit = self.Table.GetValueByName(row, "Edit") self.AddButton.Enable(not self.Debug) self.DeleteButton.Enable(not self.Debug and (table_length > 0 and row_edit)) self.UpButton.Enable( not self.Debug and (table_length > 0 and row > 0 and self.Filter == "All")) self.DownButton.Enable( not self.Debug and (table_length > 0 and row < table_length - 1 and self.Filter == "All")) setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons) self.VariablesGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) self.VariablesGrid.SetColAttr(col, attr) self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col]) self.VariablesGrid.AutoSizeColumn(col, False)
def __init__(self, parent, window, controler, element_type, debug=False): wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL) self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0) self.MainSizer.AddGrowableCol(0) self.MainSizer.AddGrowableRow(1) controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5) controls_sizer.AddGrowableCol(5) controls_sizer.AddGrowableRow(0) self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW | wx.ALL) self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:')) controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL) self.ReturnType = wx.ComboBox(self, size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType) controls_sizer.AddWindow(self.ReturnType) self.DescriptionLabel = wx.StaticText(self, label=_('Description:')) controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL) self.Description = wx.TextCtrl(self, size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER) self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description) self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged) controls_sizer.AddWindow(self.Description) class_filter_label = wx.StaticText(self, label=_('Class Filter:')) controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL) self.ClassFilter = wx.ComboBox(self, size=wx.Size(145, -1), style=wx.CB_READONLY) self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter) controls_sizer.AddWindow(self.ClassFilter) for name, bitmap, help in [ ("AddButton", "add_element", _("Add variable")), ("DeleteButton", "remove_element", _("Remove variable")), ("UpButton", "up", _("Move variable up")), ("DownButton", "down", _("Move variable down"))]: button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER) button.SetToolTipString(help) setattr(self, name, button) controls_sizer.AddWindow(button) self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL | wx.HSCROLL) self.VariablesGrid.SetDropTarget(VariableDropTarget(self)) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange) self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick) self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown) self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW) self.SetSizer(self.MainSizer) self.ParentWindow = window self.Controler = controler self.ElementType = element_type self.Debug = debug self.RefreshHighlightsTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer) self.Filter = "All" self.FilterChoices = [] self.FilterChoiceTransfer = GetFilterChoiceTransfer() self.DefaultValue = _VariableInfos("LocalVar0", "", "", "", "", True, "", DefaultType, ([], []), 0) if element_type in ["config", "resource"]: self.DefaultTypes = {"All": "Global"} else: self.DefaultTypes = {"All": "Local", "Interface": "Input", "Variables": "Local"} if element_type in ["config", "resource"] \ or element_type in ["program", "transition", "action"]: # this is an element that can have located variables self.Table = VariableTable(self, [], GetVariableTableColnames(True)) if element_type in ["config", "resource"]: self.FilterChoices = ["All", "Global"] # ,"Access"] else: self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp"] # ,"Access"] # these condense the ColAlignements list left = wx.ALIGN_LEFT center = wx.ALIGN_CENTER # Num Name Class Type Loc Init Option Doc self.ColSettings = { "size": [40, 80, 100, 80, 110, 120, 100, 160], "alignement": [center, left, left, left, left, left, left, left], "fixed_size": [True, False, True, False, True, True, True, False], } else: # this is an element that cannot have located variables self.Table = VariableTable(self, [], GetVariableTableColnames(False)) if element_type == "function": self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", "Variables", " Local"] else: self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp"] # these condense the alignements list left = wx.ALIGN_LEFT center = wx.ALIGN_CENTER # Num Name Class Type Init Option Doc self.ColSettings = { "size": [40, 80, 100, 80, 120, 100, 160], "alignement": [center, left, left, left, left, left, left], "fixed_size": [True, False, True, False, True, True, False], } self.PanelWidthMin = sum(self.ColSettings["size"]) self.ElementType = element_type self.BodyType = None for choice in self.FilterChoices: self.ClassFilter.Append(_(choice)) reverse_transfer = {} for filter, choice in self.FilterChoiceTransfer.items(): reverse_transfer[choice] = filter self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter])) self.RefreshTypeList() self.VariablesGrid.SetTable(self.Table) self.VariablesGrid.SetButtons({"Add": self.AddButton, "Delete": self.DeleteButton, "Up": self.UpButton, "Down": self.DownButton}) self.VariablesGrid.SetEditable(not self.Debug) def _AddVariable(new_row): row_content = self.DefaultValue.copy() if new_row > 0: # doesn't copy values of previous var if it's non-editable (like a FB) if self.Values[new_row-1].Edit: row_content = self.Values[new_row-1].copy() old_name = self.Values[new_row-1].Name row_content.Name = self.Controler.GenerateNewName( self.TagName, old_name, old_name+'%d') # increment location address if row_content.Location != "" and LOCATION_MODEL_SET.match(row_content.Location): old_location = row_content.Location model = re.compile("%[IQM][XBWLD]?(.*\.|)") prefix = model.match(old_location).group(0) addr = int(re.split(model, old_location)[-1]) + 1 row_content.Location = prefix + unicode(addr) if not row_content.Class: row_content.Class = self.DefaultTypes.get(self.Filter, self.Filter) if self.Filter == "All" and len(self.Values) > 0: self.Values.insert(new_row, row_content) else: self.Values.append(row_content) new_row = self.Table.GetNumberRows() self.SaveValues() if self.ElementType == "resource": self.ParentWindow.RefreshView(variablepanel=False) self.RefreshValues() return new_row setattr(self.VariablesGrid, "_AddRow", _AddVariable) def _DeleteVariable(row): if _GetRowEdit(row): self.Values.remove(self.Table.GetRow(row)) self.SaveValues() if self.ElementType == "resource": self.ParentWindow.RefreshView(variablepanel=False) self.RefreshValues() setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) def _MoveVariable(row, move): if self.Filter == "All": new_row = max(0, min(row + move, len(self.Values) - 1)) if new_row != row: self.Values.insert(new_row, self.Values.pop(row)) self.SaveValues() self.RefreshValues() return new_row return row setattr(self.VariablesGrid, "_MoveRow", _MoveVariable) def _GetRowEdit(row): row_edit = False if self: row_edit = self.Table.GetValueByName(row, "Edit") bodytype = self.Controler.GetEditedElementBodyType(self.TagName) row_edit = row_edit or (bodytype in ["ST", "IL"]) return row_edit def _RefreshButtons(): if self: table_length = len(self.Table.data) row_edit = True row = 0 if table_length > 0: row = self.VariablesGrid.GetGridCursorRow() row_edit = _GetRowEdit(row) self.AddButton.Enable(not self.Debug) self.DeleteButton.Enable(not self.Debug and (table_length > 0 and row_edit)) self.UpButton.Enable(not self.Debug and (table_length > 0 and row > 0 and self.Filter == "All")) self.DownButton.Enable(not self.Debug and (table_length > 0 and row < table_length - 1 and self.Filter == "All")) setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons) panel_width = window.Parent.ScreenRect.Width - 35 if panel_width > self.PanelWidthMin: stretch_cols_width = panel_width stretch_cols_sum = 0 for col in range(len(self.ColSettings["fixed_size"])): if self.ColSettings["fixed_size"][col]: stretch_cols_width -= self.ColSettings["size"][col] else: stretch_cols_sum += self.ColSettings["size"][col] self.VariablesGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): attr = wx.grid.GridCellAttr() attr.SetAlignment(self.ColSettings["alignement"][col], wx.ALIGN_CENTRE) self.VariablesGrid.SetColAttr(col, attr) self.VariablesGrid.SetColMinimalWidth(col, self.ColSettings["size"][col]) if (panel_width > self.PanelWidthMin) and not self.ColSettings["fixed_size"][col]: self.VariablesGrid.SetColSize(col, int((float(self.ColSettings["size"][col])/stretch_cols_sum)*stretch_cols_width)) else: self.VariablesGrid.SetColSize(col, self.ColSettings["size"][col])