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

📄 tree.py

📁 Wxpython Implemented on Windows CE, Source code
💻 PY
📖 第 1 页 / 共 4 页
字号:
        try:
            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
                # This currently works under GTK, but not under MSW
                testWin = g.testWin = wx.PreFrame()
                res.LoadOnFrame(testWin, g.frame, STD_NAME)
                # Create status bar
                testWin.panel = testWin
                #testWin.CreateStatusBar()
                testWin.SetClientSize(testWin.GetBestSize())
                testWin.SetPosition(pos)
                testWin.Show(True)
            elif xxx.__class__ == xxxPanel:
                # Create new frame
                if not testWin:
                    testWin = g.testWin = wx.Frame(g.frame, -1, 'Panel: ' + name,
                                                  pos=pos, name=STD_NAME)
                testWin.panel = res.LoadPanel(testWin, STD_NAME)
                testWin.SetClientSize(testWin.GetBestSize())
                testWin.Show(True)
            elif xxx.__class__ == xxxDialog:
                testWin = g.testWin = res.LoadDialog(None, STD_NAME)
                testWin.panel = testWin
                testWin.Layout()
                testWin.SetPosition(pos)
                testWin.Show(True)
                # Dialog's default code does not produce wx.EVT_CLOSE
                wx.EVT_BUTTON(testWin, wx.ID_OK, self.OnCloseTestWin)
                wx.EVT_BUTTON(testWin, wx.ID_CANCEL, self.OnCloseTestWin)
            elif xxx.__class__ == xxxWizard:
                wiz = wx.wizard.PreWizard()
                res.LoadOnObject(wiz, None, STD_NAME, 'wxWizard')
                # Find first page (don't know better way)
                firstPage = None
                for w in wiz.GetChildren():
                    if isinstance(w, wx.wizard.WizardPage):
                        firstPage = w
                        break
                if not firstPage:
                    wx.LogError('Wizard is empty')
                else:
                    # Wizard should be modal
                    self.SetItemBold(item)
                    wiz.RunWizard(w)
                    self.SetItemBold(item, False)
                    wiz.Destroy()
            elif xxx.__class__ in [xxxWizardPage, xxxWizardPageSimple]:
                # Create new frame
                if not testWin:
                    testWin = g.testWin = wx.Frame(g.frame, -1, 'Wizard page: ' + name,
                                                  pos=pos, name=STD_NAME)
                testWin.panel = wx.PrePanel()
                res.LoadOnObject(testWin.panel, testWin, STD_NAME, 'wxPanel')
                testWin.SetClientSize(testWin.GetBestSize())
                testWin.Show(True)
            elif xxx.__class__ == xxxMenuBar:
                testWin = g.testWin = wx.Frame(g.frame, -1, 'MenuBar: ' + name,
                                              pos=pos, name=STD_NAME)
                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)
            if testWin:
                testWin.item = item
                wx.EVT_CLOSE(testWin, self.OnCloseTestWin)
                testWin.highLight = 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')
        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()

    # 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 is not a child
            if not isinstance(self.GetPyData(prev), xxxMenuBar):
                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))

    # Override to use like single-selection tree
    def GetSelection(self):
        return self.selection
    def SelectItem(self, item):
        self.UnselectAll()
        self.ChangeSelection(item)
        wx.TreeCtrl.SelectItem(self, item)

    # 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')
            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)
                m.AppendSeparator()
                m.Append(ID_NEW.REF, 'reference...', 'Create object_ref 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:
                    SetMenu(m, pullDownMenu.sizers, shift=True)
                else:
                    SetMenu(m, pullDownMenu.controls, shift=True)
                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())
        # Change tree icon for sizers
        if isinstance(xxx, xxxBoxSizer):
            self.SetItemImage(item, xxx.treeImage())
        # Set global modified state
        g.frame.SetModified()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -