⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.py

📁 用python写的ide开发环境,巨强大,不过需要wxpython的支持
💻 PY
📖 第 1 页 / 共 4 页
字号:
                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 + -