X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b372319fa08ce9b2794040bcdcb82b559d53da25..a9c95884805a56442482036cd204e56c47a03d2c:/wxPython/wx/tools/XRCed/tree.py diff --git a/wxPython/wx/tools/XRCed/tree.py b/wxPython/wx/tools/XRCed/tree.py index abc0a8e452..f384b15da5 100644 --- a/wxPython/wx/tools/XRCed/tree.py +++ b/wxPython/wx/tools/XRCed/tree.py @@ -128,6 +128,9 @@ class ID_NEW: REF = wx.NewId() COMMENT = wx.NewId() + CUSTOM = wx.NewId() + for i in range(99): wx.NewId() # reserve IDs for custom controls + LAST = wx.NewId() @@ -377,7 +380,13 @@ class PullDownMenu: ID_NEW.HELP_BUTTON: ('wxID_HELP', '&Help'), ID_NEW.CONTEXT_HELP_BUTTON: ('wxID_CONTEXT_HELP', '&Help'), } - + self.custom = ['custom', 'User-defined controls'] + self.customMap = {} + + def addCustom(self, klass): + n = len(self.custom)-2 + self.custom.append((ID_NEW.CUSTOM + n, klass)) + self.customMap[ID_NEW.CUSTOM + n] = klass ################################################################################ @@ -416,6 +425,7 @@ class HighLightBox: l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2)) l4.SetBackgroundColour(wx.RED) self.lines = [l1, l2, l3, l4] + self.size = size # Move highlight to a new position def Replace(self, pos, size): if size.width == -1: size.width = 0 @@ -424,6 +434,7 @@ class HighLightBox: self.lines[1].SetDimensions(pos.x, pos.y, 2, size.height) self.lines[2].SetDimensions(pos.x + size.width - 2, pos.y, 2, size.height) self.lines[3].SetDimensions(pos.x, pos.y + size.height - 2, size.width, 2) + self.size = size # Remove it def Remove(self): map(wx.Window.Destroy, self.lines) @@ -435,10 +446,12 @@ class HighLightBox: class XML_Tree(wx.TreeCtrl): def __init__(self, parent, id): - wx.TreeCtrl.__init__(self, parent, id, style = wx.TR_HAS_BUTTONS | wx.TR_MULTIPLE) + wx.TreeCtrl.__init__(self, parent, id, + style = wx.TR_HAS_BUTTONS | wx.TR_MULTIPLE | wx.TR_EDIT_LABELS) self.SetBackgroundColour(wx.Colour(224, 248, 224)) - self.fontComment = wx.Font(g.sysFont().GetPointSize(), wx.DEFAULT, - wx.FONTSTYLE_ITALIC, wx.NORMAL) + self.fontComment = wx.FFont(self.GetFont().GetPointSize(), + self.GetFont().GetFamily(), + wx.FONTFLAG_ITALIC) # Register events wx.EVT_TREE_SEL_CHANGED(self, self.GetId(), self.OnSelChanged) # One works on Linux, another on Windows @@ -449,6 +462,8 @@ class XML_Tree(wx.TreeCtrl): wx.EVT_RIGHT_DOWN(self, self.OnRightDown) wx.EVT_TREE_ITEM_EXPANDED(self, self.GetId(), self.OnItemExpandedCollapsed) wx.EVT_TREE_ITEM_COLLAPSED(self, self.GetId(), self.OnItemExpandedCollapsed) + self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnBeginLabelEdit) + self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnEndLabelEdit) self.selection = None self.selectionChanging = False @@ -609,6 +624,7 @@ class XML_Tree(wx.TreeCtrl): # Different color for references and comments if xxx.className == 'comment': self.SetItemTextColour(newItem, 'Blue') + self.SetItemFont(newItem, self.fontComment) elif treeObj.ref: self.SetItemTextColour(newItem, 'DarkGreen') elif treeObj.hasStyle and treeObj.params.get('hidden', False): @@ -767,16 +783,22 @@ class XML_Tree(wx.TreeCtrl): if not obj or xxx.hasStyle and xxx.params.get('hidden', False): if g.testWin.highLight: g.testWin.highLight.Remove() return - pos = self.FindNodePos(item, obj) + pos = self.FindNodePos(item, obj) size = obj.GetSize() # Highlight # Negative positions are not working quite well - if g.testWin.highLight: - g.testWin.highLight.Replace(pos, size) + hl = g.testWin.highLight + # If highlight object has the same size SetDimension does not repaint it + # so we must remove the old HL window + if hl and hl.size == size: + hl.Remove() + hl = None + if hl: + hl.Replace(pos, size) else: - g.testWin.highLight = HighLightBox(pos, size) - g.testWin.highLight.Refresh() - g.testWin.highLight.item = item + g.testWin.highLight = hl = HighLightBox(pos, size) + hl.Refresh() + hl.item = item def ShowTestWindow(self, item): xxx = self.GetPyData(item) @@ -830,19 +852,6 @@ class XML_Tree(wx.TreeCtrl): testWin = g.testWin # Create a window with this resource xxx = self.GetPyData(item).treeObject() - - # If frame -# if xxx.__class__ == xxxFrame: - # Frame can't have many children, - # but it's first child possibly can... -# child = self.GetFirstChild(item)[0] -# if child.IsOk() and self.GetPyData(child).__class__ == xxxPanel: -# # Clean-up before recursive call or error -# wx.MemoryFSHandler.RemoveFile('xxx.xrc') -# wx.EndBusyCursor() -# self.CreateTestWin(child) -# return - # Close old window, remember where it was highLight = None if testWin: @@ -897,6 +906,10 @@ class XML_Tree(wx.TreeCtrl): if not g.currentEncoding: xmlFlags != xrc.XRC_USE_LOCALE res = xrc.XmlResource('', xmlFlags) + xrc.XmlResource.Set(res) # set as global + # Register handlers + addHandlers() + # Same module list res.Load('memory:xxx.xrc') try: if xxx.__class__ == xxxFrame: @@ -996,6 +1009,9 @@ class XML_Tree(wx.TreeCtrl): inf = sys.exc_info() wx.LogError(traceback.format_exception(inf[0], inf[1], None)[-1]) wx.LogError('Error loading resource') + # Cleanup + res.Unload('xxx.xrc') + xrc.XmlResource.Set(None) wx.MemoryFSHandler.RemoveFile('xxx.xrc') def CloseTestWindow(self): @@ -1117,6 +1133,9 @@ class XML_Tree(wx.TreeCtrl): m.Enable(ID_NEW.SPACER, False) if xxx.__class__ is not xxxFrame: m.Enable(ID_NEW.MENU_BAR, False) + # Add custom controls menu + if len(pullDownMenu.custom) > 2: + SetMenu(m, [pullDownMenu.custom]) m.AppendSeparator() m.Append(ID_NEW.REF, 'reference...', 'Create object_ref node') m.Append(ID_NEW.COMMENT, 'comment', 'Create comment node') @@ -1203,3 +1222,17 @@ class XML_Tree(wx.TreeCtrl): # Set global modified state g.frame.SetModified() + def OnBeginLabelEdit(self, evt): + xxx = self.GetPyData(evt.GetItem()) + if xxx.isElement: + evt.Veto() + else: + evt.Skip() + + def OnEndLabelEdit(self, evt): + xxx = self.GetPyData(evt.GetItem()) + node = xxx.node + if not xxx.isElement: + node.data = evt.GetLabel() + g.panel.SetData(xxx) + evt.Skip()