📄 tree.py
字号:
testWin.panel = None # Set status bar to display help testWin.CreateStatusBar() testWin.menuBar = res.LoadMenuBar(STD_NAME) testWin.SetMenuBar(testWin.menuBar) testWin.Show(True) elif xxx.__class__ == xxxToolBar: testWin = g.testWin = wx.Frame(g.frame, -1, 'ToolBar: ' + name, pos=pos, name=STD_NAME) testWin.panel = None # Set status bar to display help testWin.CreateStatusBar() testWin.toolBar = res.LoadToolBar(testWin, STD_NAME) testWin.SetToolBar(testWin.toolBar) testWin.Show(True) # Catch some events, set highlight if testWin: testWin.item = item wx.EVT_CLOSE(testWin, self.OnCloseTestWin) wx.EVT_SIZE(testWin, self.OnSizeTestWin) # Add drop target if testWin.panel: testWin.panel.SetDropTarget(DropTarget()) else: testWin.SetDropTarget(DropTarget()) # Reset highlights testWin.highLight = testWin.highLightDT = None if highLight and not self.pendingHighLight: self.HighLight(highLight) except: if g.testWin: self.SetItemBold(item, False) g.testWinPos = g.testWin.GetPosition() g.testWin.Destroy() g.testWin = None 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): if not g.testWin: return self.SetItemBold(g.testWin.item, False) g.frame.tb.ToggleTool(g.frame.ID_TOOL_LOCATE, False) g.testWinPos = g.testWin.GetPosition() g.testWin.Destroy() g.testWin = None def OnCloseTestWin(self, evt): self.CloseTestWindow() def OnSizeTestWin(self, evt): # Update highlight after size change hl = g.testWin.highLight if hl: hl.Replace(self.FindNodePos(hl.item), hl.obj.GetSize()) hl.Refresh() #self.HighLight(g.testWin.highLight.item) evt.Skip() # Return index in parent, for real window children def WindowIndex(self, item): n = 0 # index of sibling prev = self.GetPrevSibling(item) while prev.IsOk(): # MenuBar and sizers are not real children (who else?) if not isinstance(self.GetPyData(prev), xxxMenuBar) and not \ isinstance(self.GetPyData(prev), xxxSizer): n += 1 prev = self.GetPrevSibling(prev) return n # Return item index in parent def ItemIndex(self, item): n = 0 # index of sibling prev = self.GetPrevSibling(item) while prev.IsOk(): prev = self.GetPrevSibling(prev) n += 1 return n # Full tree index of an item - list of positions def ItemFullIndex(self, item): if not item.IsOk(): return None l = [] while item != self.root: l.insert(0, self.ItemIndex(item)) item = self.GetItemParent(item) return l # Get item position from full index def ItemAtFullIndex(self, index): if index is None: return wx.TreeItemId() item = self.root for i in index: item = self.GetFirstChild(item)[0] for k in range(i): item = self.GetNextSibling(item) return item # True if next item should be inserted after current (vs. appended to it) def NeedInsert(self, item): xxx = self.GetPyData(item) if item == self.root: return False # root item if xxx.hasChildren and not self.GetChildrenCount(item, False): return False return not (self.IsExpanded(item) and self.GetChildrenCount(item, False)) # Pull-down def OnRightDown(self, evt): pullDownMenu = g.pullDownMenu # select this item pt = evt.GetPosition(); item, flags = self.HitTest(pt) if item.Ok() and flags & wx.TREE_HITTEST_ONITEM: self.SelectItem(item) # Setup menu menu = wx.Menu() item = self.selection if not item: menu.Append(g.pullDownMenu.ID_EXPAND, 'Expand', 'Expand tree') menu.Append(g.pullDownMenu.ID_COLLAPSE, 'Collapse', 'Collapse tree') else:# self.ctrl = evt.ControlDown() # save Ctrl state# self.shift = evt.ShiftDown() # and Shift too m = wx.Menu() # create menu if self.ctrl: needInsert = True else: needInsert = self.NeedInsert(item) if item == self.root or needInsert and self.GetItemParent(item) == self.root: SetMenu(m, pullDownMenu.topLevel) m.AppendSeparator() m.Append(ID_NEW.REF, 'reference...', 'Create object_ref node') m.Append(ID_NEW.COMMENT, 'comment', 'Create comment node') else: xxx = self.GetPyData(item).treeObject() # Check parent for possible child nodes if inserting sibling if needInsert: xxx = xxx.parent if xxx.__class__ == xxxMenuBar: m.Append(ID_NEW.MENU, 'Menu', 'Create menu') elif xxx.__class__ in [xxxToolBar, xxxTool] or \ xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar: SetMenu(m, pullDownMenu.toolBarControls) elif xxx.__class__ in [xxxMenu, xxxMenuItem]: SetMenu(m, pullDownMenu.menuControls) elif xxx.__class__ == xxxStdDialogButtonSizer: SetMenu(m, pullDownMenu.stdButtons) else: SetMenu(m, pullDownMenu.controls) if xxx.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]: m.Enable(m.FindItem('sizer'), False) elif not (xxx.isSizer or xxx.parent and xxx.parent.isSizer): 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') # Select correct label for create menu if not needInsert: if self.shift: menu.AppendMenu(wx.NewId(), 'Insert Child', m, 'Create child object as the first child') else: menu.AppendMenu(wx.NewId(), 'Append Child', m, 'Create child object as the last child') else: if self.shift: menu.AppendMenu(wx.NewId(), 'Create Sibling', m, 'Create sibling before selected object') else: menu.AppendMenu(wx.NewId(), 'Create Sibling', m, 'Create sibling after selected object') # Build replace menu if item != self.root: xxx = self.GetPyData(item).treeObject() m = wx.Menu() # create replace menu if xxx.__class__ == xxxMenuBar: m.Append(1000 + ID_NEW.MENU, 'Menu', 'Create menu') elif xxx.__class__ in [xxxMenu, xxxMenuItem]: SetMenu(m, pullDownMenu.menuControls, shift=True) elif xxx.__class__ == xxxToolBar and \ self.GetItemParent(item) == self.root: SetMenu(m, [], shift=True) elif xxx.__class__ in [xxxFrame, xxxDialog, xxxPanel]: SetMenu(m, [ (ID_NEW.PANEL, 'Panel', 'Create panel'), (ID_NEW.DIALOG, 'Dialog', 'Create dialog'), (ID_NEW.FRAME, 'Frame', 'Create frame')], shift=True) elif xxx.isSizer and self.ItemHasChildren(item): SetMenu(m, pullDownMenu.sizers, shift=True) else: SetMenu(m, pullDownMenu.controls, shift=True) if xxx.isElement: id = wx.NewId() menu.AppendMenu(id, 'Replace With', m) if not m.GetMenuItemCount(): menu.Enable(id, False) menu.Append(pullDownMenu.ID_SUBCLASS, 'Subclass...', 'Set "subclass" property') menu.AppendSeparator() # Not using standart IDs because we don't want to show shortcuts menu.Append(wx.ID_CUT, 'Cut', 'Cut to the clipboard') menu.Append(wx.ID_COPY, 'Copy', 'Copy to the clipboard') if self.ctrl and item != self.root: menu.Append(pullDownMenu.ID_PASTE_SIBLING, 'Paste Sibling', 'Paste from the clipboard as a sibling') else: menu.Append(wx.ID_PASTE, 'Paste', 'Paste from the clipboard') menu.Append(pullDownMenu.ID_DELETE, 'Delete', 'Delete object') if self.ItemHasChildren(item): menu.AppendSeparator() menu.Append(pullDownMenu.ID_EXPAND, 'Expand', 'Expand subtree') menu.Append(pullDownMenu.ID_COLLAPSE, 'Collapse', 'Collapse subtree') self.PopupMenu(menu, evt.GetPosition()) menu.Destroy() # Apply changes def Apply(self, xxx, item): g.panel.Apply() # Update tree view xxx = xxx.treeObject() if xxx.hasName and self.GetItemText(item) != xxx.name: self.SetItemText(item, xxx.treeName()) # Item width may have changed # !!! Tric to update tree width (wxGTK, ??) self.SetIndent(self.GetIndent()) elif xxx.className == 'comment': self.SetItemText(item, xxx.treeName()) # Change tree icon for sizers if isinstance(xxx, xxxBoxSizer): self.SetItemImage(item, xxx.treeImage()) # 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()################################################################################# DragAndDropclass DropTarget(wx.PyDropTarget): def __init__(self): self.do = MyDataObject() wx.DropTarget.__init__(self, self.do) # Find best object for dropping def WhereToDrop(self, x, y, d): # Find object by position obj = wx.FindWindowAtPoint(g.testWin.ClientToScreen((x,y))) if not obj: return wx.DragNone, () item = g.frame.FindObject(g.testWin.item, obj) if not item: return wx.DragNone, () xxx = g.tree.GetPyData(item).treeObject() parentItem = None # Check if window has a XRC sizer, then use it as parent if obj.GetSizer(): sizer = obj.GetSizer() sizerItem = g.frame.FindObject(g.testWin.item, sizer) if sizerItem: parentItem = sizerItem obj = sizer item = wx.TreeItemId() # if not sizer but can have children, it is parent with free placement elif xxx.hasChildren: parentItem = item item = wx.TreeItemId() # Otherwise, try to add to item's parent if not parentItem: parentItem = g.tree.GetItemParent(item) obj = g.tree.FindNodeObject(parentItem) parent = g.tree.GetPyData(parentItem).treeObject() return d,(obj,parent,parentItem,item) # Drop def OnData(self, x, y, d): self.GetData() id = int(self.do.GetDataHere()) d,other = self.WhereToDrop(x, y, d) if d != wx.DragNone: obj,parent,parentItem,item = other g.tree.selection = parentItem xxx = g.frame.CreateXXX(parent, parentItem, item, id) # Set coordinates if parent is not sizer if not parent.isSizer: xxx.set('pos', '%d,%d' % (x, y)) g.panel.SetData(xxx) g.frame.SetStatusText('Object created') self.RemoveHL() return d def OnDragOver(self, x, y, d): d,other = self.WhereToDrop(x, y, d) if d != wx.DragNone: obj,parent,parentItem,item = other pos, size = g.tree.FindNodePos(parentItem, obj), obj.GetSize() hl = g.testWin.highLightDT # Set color of highlighted item back to normal if hl and hl.item: if hl.item != parentItem: g.tree.SetItemTextColour(hl.item, g.tree.itemColour) # Highlight future parent g.tree.itemColour = g.tree.GetItemTextColour(parentItem) # save current if not hl or hl.item != parentItem: g.testWin.highLightDT = updateHL(hl, HighLightDTBox, pos, size) g.testWin.highLightDT.item = parentItem g.tree.SetItemTextColour(parentItem, g.tree.COLOUR_DT) g.tree.EnsureVisible(parentItem) g.frame.SetStatusText('Drop target: %s' % parent.treeName()) else: g.frame.SetStatusText('Inappropriate drop target') self.RemoveHL() return d def OnLeave(self): self.RemoveHL() def RemoveHL(self): hl = g.testWin.highLightDT if hl: if hl.item: g.tree.SetItemTextColour(hl.item, g.tree.itemColour) hl.Remove()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -