diff -r 44bf0ba866e9 -r 94e620cbd9de editors/ConfTreeNodeEditor.py --- a/editors/ConfTreeNodeEditor.py Tue Feb 24 11:50:54 2015 +0100 +++ b/editors/ConfTreeNodeEditor.py Wed Feb 25 13:59:01 2015 +0100 @@ -29,11 +29,6 @@ SCROLLBAR_UNIT = 10 -CWD = os.path.split(os.path.realpath(__file__))[0] - -def Bpath(*args): - return os.path.join(CWD,*args) - class GenBitmapTextButton(wx.lib.buttons.GenBitmapTextButton): def _GetLabelSize(self): """ used internally """ @@ -88,82 +83,82 @@ class GenStaticBitmap(wx.StaticBitmap): - """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32, + """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32, and accept image name as __init__ parameter, fail silently if file do not exist""" 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.EmptyBitmap(0, 0) - - wx.StaticBitmap.__init__(self, parent, ID, + + wx.StaticBitmap.__init__(self, parent, ID, bitmap, pos, size, style, name) class ConfTreeNodeEditor(EditorPanel): - + SHOW_BASE_PARAMS = True SHOW_PARAMS = True CONFNODEEDITOR_TABS = [] - + 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, + 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, + 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.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"])) - baseparamseditor_sizer.AddWindow(self.FullIECChannel, + baseparamseditor_sizer.AddWindow(self.FullIECChannel, flag=wx.ALIGN_CENTER_VERTICAL) - + updownsizer = wx.BoxSizer(wx.VERTICAL) - baseparamseditor_sizer.AddSizer(updownsizer, border=5, + baseparamseditor_sizer.AddSizer(updownsizer, border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) - - self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor, + + 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.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, + + 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.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1), self.IECCDownButton) updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT) - - self.ConfNodeName = wx.TextCtrl(self.Editor, + + 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.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.Bind(wx.EVT_TEXT, + self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), self.ConfNodeName) - baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5, + 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 @@ -171,12 +166,12 @@ 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: @@ -185,28 +180,28 @@ 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, + 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, + 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: @@ -215,40 +210,40 @@ self.Editor = self.ParamsEditor else: self.ParamsEditor = None - + def __init__(self, parent, controler, window, tagname=""): EditorPanel.__init__(self, parent, tagname, window, controler) - + icon_name = self.Controler.GetIconName() if icon_name is not None: self.SetIcon(GetBitmap(icon_name)) else: self.SetIcon(GetBitmap("Extension")) - + def __del__(self): self.Controler.OnCloseEditor(self) - + def GetTagName(self): return self.Controler.CTNFullName() - + def GetTitle(self): fullname = self.Controler.CTNFullName() if self.Controler.CTNTestModified(): return "~%s~" % fullname return fullname - + def HasNoModel(self): return False - + def GetBufferState(self): return False, False - + def Undo(self): pass - + def Redo(self): pass - + def RefreshView(self): EditorPanel.RefreshView(self) if self.SHOW_BASE_PARAMS: @@ -257,33 +252,33 @@ if self.ParamsEditor is not None: self.RefreshConfNodeParamsSizer() self.RefreshScrollbars() - + def RefreshIECChannelControlsState(self): self.FullIECChannel.SetLabel(self.Controler.GetFullIEC_Channel()) self.IECCDownButton.Enable(self.Controler.BaseParams.getIEC_Channel() > 0) self.MainSizer.Layout() - + def RefreshConfNodeParamsSizer(self): self.Freeze() self.ConfNodeParamsSizer.Clear(True) - + confnode_infos = self.Controler.GetParamsAttributes() if len(confnode_infos) > 0: self.GenerateSizerElements(self.ConfNodeParamsSizer, confnode_infos, None, False) - + self.ParamsEditorSizer.Layout() self.Thaw() - + def GenerateMethodButtonSizer(self): normal_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]) mouseover_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, underline=True, faceName = faces["helv"]) - + msizer = wx.BoxSizer(wx.HORIZONTAL) - + for confnode_method in self.Controler.ConfNodeMethods: if "method" in confnode_method and confnode_method.get("shown",True): button = GenBitmapTextButton(self.Editor, - bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), + bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), label=confnode_method["name"], style=wx.NO_BORDER) button.SetFont(normal_bt_font) button.SetToolTipString(confnode_method["tooltip"]) @@ -305,7 +300,7 @@ button.Disable() msizer.AddWindow(button, flag=wx.ALIGN_CENTER) return msizer - + def GenerateSizerElements(self, sizer, elements, path, clean = True): if clean: sizer.Clear(True) @@ -321,44 +316,44 @@ label = _(name) if value is not None: label += " - %s" % _(value) - staticbox = wx.StaticBox(self.ParamsEditor, + staticbox = wx.StaticBox(self.ParamsEditor, label=_(label), size=wx.Size(10, 0)) staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL) if first: - sizer.AddSizer(staticboxsizer, border=5, + sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.TOP|wx.BOTTOM) else: - sizer.AddSizer(staticboxsizer, border=5, + sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.BOTTOM) - self.GenerateSizerElements(staticboxsizer, - element_infos["children"], + self.GenerateSizerElements(staticboxsizer, + element_infos["children"], element_path) else: boxsizer = wx.FlexGridSizer(cols=3, rows=1) boxsizer.AddGrowableCol(1) if first: - sizer.AddSizer(boxsizer, border=5, + sizer.AddSizer(boxsizer, border=5, flag=wx.GROW|wx.ALL) else: - sizer.AddSizer(boxsizer, border=5, + sizer.AddSizer(boxsizer, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM) - + staticbitmap = GenStaticBitmap(ID=-1, bitmapname=element_infos["name"], name="%s_bitmap"%element_infos["name"], parent=self.ParamsEditor, pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0) boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT) - - statictext = wx.StaticText(self.ParamsEditor, + + statictext = wx.StaticText(self.ParamsEditor, label="%s:"%_(element_infos["name"])) - boxsizer.AddWindow(statictext, border=5, + boxsizer.AddWindow(statictext, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.RIGHT) - + if isinstance(element_infos["type"], types.ListType): if isinstance(element_infos["value"], types.TupleType): browse_boxsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.AddSizer(browse_boxsizer) - - textctrl = wx.TextCtrl(self.ParamsEditor, + + textctrl = wx.TextCtrl(self.ParamsEditor, size=wx.Size(275, -1), style=wx.TE_READONLY) if element_infos["value"] is not None: textctrl.SetValue(element_infos["value"][0]) @@ -366,19 +361,19 @@ else: value_infos = None browse_boxsizer.AddWindow(textctrl) - - button = wx.Button(self.ParamsEditor, + + button = wx.Button(self.ParamsEditor, label="...", size=wx.Size(25, 25)) browse_boxsizer.AddWindow(button) - button.Bind(wx.EVT_BUTTON, - self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"], - value_infos, element_path), + button.Bind(wx.EVT_BUTTON, + self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"], + value_infos, element_path), button) else: - combobox = wx.ComboBox(self.ParamsEditor, + combobox = wx.ComboBox(self.ParamsEditor, size=wx.Size(300, -1), style=wx.CB_READONLY) boxsizer.AddWindow(combobox) - + if element_infos["use"] == "optional": combobox.Append("") if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType): @@ -386,8 +381,8 @@ combobox.Append(choice) name = element_infos["name"] value = element_infos["value"] - - staticbox = wx.StaticBox(self.ParamsEditor, + + staticbox = wx.StaticBox(self.ParamsEditor, label="%s - %s"%(_(name), _(value)), size=wx.Size(10, 0)) staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL) sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.BOTTOM) @@ -402,7 +397,7 @@ else: combobox.SetStringSelection(element_infos["value"]) combobox.Bind(wx.EVT_COMBOBOX, callback, combobox) - + elif isinstance(element_infos["type"], types.DictType): scmin = -(2**31) scmax = 2**31-1 @@ -410,50 +405,50 @@ scmin = element_infos["type"]["min"] if "max" in element_infos["type"]: scmax = element_infos["type"]["max"] - spinctrl = wx.SpinCtrl(self.ParamsEditor, + spinctrl = wx.SpinCtrl(self.ParamsEditor, size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax) boxsizer.AddWindow(spinctrl) if element_infos["value"] is not None: spinctrl.SetValue(element_infos["value"]) - spinctrl.Bind(wx.EVT_SPINCTRL, + spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path), spinctrl) - + else: if element_infos["type"] == "boolean": checkbox = wx.CheckBox(self.ParamsEditor, size=wx.Size(17, 25)) boxsizer.AddWindow(checkbox) if element_infos["value"] is not None: checkbox.SetValue(element_infos["value"]) - checkbox.Bind(wx.EVT_CHECKBOX, - self.GetCheckBoxCallBackFunction(checkbox, element_path), + checkbox.Bind(wx.EVT_CHECKBOX, + self.GetCheckBoxCallBackFunction(checkbox, element_path), checkbox) - + elif element_infos["type"] in ["unsignedLong", "long","integer"]: if element_infos["type"].startswith("unsigned"): scmin = 0 else: scmin = -(2**31) scmax = 2**31-1 - spinctrl = wx.SpinCtrl(self.ParamsEditor, + spinctrl = wx.SpinCtrl(self.ParamsEditor, size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax) boxsizer.AddWindow(spinctrl) if element_infos["value"] is not None: spinctrl.SetValue(element_infos["value"]) - spinctrl.Bind(wx.EVT_SPINCTRL, - self.GetTextCtrlCallBackFunction(spinctrl, element_path), + spinctrl.Bind(wx.EVT_SPINCTRL, + self.GetTextCtrlCallBackFunction(spinctrl, element_path), spinctrl) - + else: choices = self.ParentWindow.GetConfigEntry(element_path, [""]) - textctrl = TextCtrlAutoComplete(name=element_infos["name"], - parent=self.ParamsEditor, - choices=choices, + textctrl = TextCtrlAutoComplete(name=element_infos["name"], + parent=self.ParamsEditor, + choices=choices, element_path=element_path, size=wx.Size(300, -1)) - + boxsizer.AddWindow(textctrl) if element_infos["value"] is not None: textctrl.ChangeValue(str(element_infos["value"])) @@ -461,8 +456,8 @@ textctrl.Bind(wx.EVT_TEXT_ENTER, callback) textctrl.Bind(wx.EVT_KILL_FOCUS, callback) first = False - - + + def GetItemChannelChangedFunction(self, dir): def OnConfNodeTreeItemChannelChanged(event): confnode_IECChannel = self.Controler.BaseParams.getIEC_Channel() @@ -471,28 +466,28 @@ wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU, PROJECTTREE) event.Skip() return OnConfNodeTreeItemChannelChanged - + def SetConfNodeParamsAttribute(self, *args, **kwargs): res, StructChanged = self.Controler.SetParamsAttribute(*args, **kwargs) if StructChanged and self.ParamsEditor is not None: wx.CallAfter(self.RefreshConfNodeParamsSizer) wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU) return res - + def GetButtonCallBackFunction(self, method, push=False): """ Generate the callbackfunc for a given confnode method""" def OnButtonClick(event): - # Disable button to prevent re-entrant call + # Disable button to prevent re-entrant call event.GetEventObject().Disable() # Call getattr(self.Controler,method)() - # Re-enable button + # Re-enable button event.GetEventObject().Enable() - + if not push: event.Skip() return OnButtonClick - + def GetChoiceCallBackFunction(self, choicectrl, path): def OnChoiceChanged(event): res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection()) @@ -501,14 +496,14 @@ choicectrl.SetStringSelection(res) event.Skip() return OnChoiceChanged - + def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path): def OnChoiceContentChanged(event): res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection()) wx.CallAfter(self.RefreshConfNodeParamsSizer) event.Skip() return OnChoiceContentChanged - + def GetTextCtrlCallBackFunction(self, textctrl, path, refresh=False): def OnTextCtrlChanged(event): res = self.SetConfNodeParamsAttribute(path, textctrl.GetValue()) @@ -522,14 +517,14 @@ wx.CallAfter(self.ParentWindow.SelectProjectTreeItem, self.GetTagName()) event.Skip() return OnTextCtrlChanged - + def GetCheckBoxCallBackFunction(self, chkbx, path): def OnCheckBoxChanged(event): res = self.SetConfNodeParamsAttribute(path, chkbx.IsChecked()) chkbx.SetValue(res) event.Skip() return OnCheckBoxChanged - + def GetBrowseCallBackFunction(self, name, textctrl, library, value_infos, path): infos = [value_infos] def OnBrowseButton(event): @@ -541,7 +536,7 @@ dialog.Destroy() event.Skip() return OnBrowseButton - + def RefreshScrollbars(self): self.ParamsEditor.GetBestSize() xstart, ystart = self.ParamsEditor.GetViewStart() @@ -550,17 +545,17 @@ posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT)) posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT)) self.ParamsEditor.Scroll(posx, posy) - self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, + self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy) - + def OnParamsEditorResize(self, event): self.RefreshScrollbars() event.Skip() - + def OnParamsEditorScroll(self, event): control = self.ParamsEditor.FindFocus() if isinstance(control, TextCtrlAutoComplete): control.DismissListBox() self.Refresh() event.Skip() - +