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

📄 projecteditor.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 5 页
字号:
    def AppendFolder(self, parent, folderName):        item = wx.TreeCtrl.AppendItem(self, parent, folderName)        self.SetItemImage(item, self._folderClosedIconIndex, wx.TreeItemIcon_Normal)        self.SetItemImage(item, self._folderOpenIconIndex, wx.TreeItemIcon_Expanded)        self.SetPyData(item, None)        return item    def AppendItem(self, parent, filename, file):        item = wx.TreeCtrl.AppendItem(self, parent, filename)        found = False        template = wx.GetApp().GetDocumentManager().FindTemplateForPath(filename)        if template:            for t, iconIndex in self._iconIndexLookup:                if t is template:                    self.SetItemImage(item, iconIndex, wx.TreeItemIcon_Normal)                    self.SetItemImage(item, iconIndex, wx.TreeItemIcon_Expanded)##                    self.SetItemImage(item, iconIndex, wx.TreeItemIcon_Selected)                    found = True                    break        if not found:            self.SetItemImage(item, self._blankIconIndex, wx.TreeItemIcon_Normal)            self.SetItemImage(item, self._blankIconIndex, wx.TreeItemIcon_Expanded)##            self.SetItemImage(item, self._blankIconIndex, wx.TreeItemIcon_Selected)        self.SetPyData(item, file)                return item    def AddFolder(self, folderPath):        folderItems = []                if folderPath != None:            folderTree = folderPath.split('/')                        item = self.GetRootItem()            for folderName in folderTree:                found = False                                (child, cookie) = self.GetFirstChild(item)                while child.IsOk():                    file = self.GetPyData(child)                    if file:                        pass                    else: # folder                        if self.GetItemText(child) == folderName:                            item = child                            found = True                            break                    (child, cookie) = self.GetNextChild(item, cookie)                                    if not found:                    item = self.AppendFolder(item, folderName)                    folderItems.append(item)        return folderItems            def FindItem(self, filePath, parentItem=None):        if not parentItem:            parentItem = self.GetRootItem()                    (child, cookie) = self.GetFirstChild(parentItem)        while child.IsOk():            file = self.GetPyData(child)            if file:                if file.filePath == filePath:                    return child            else: # folder                result = self.FindItem(filePath, child)  # do recursive call                if result:                    return result            (child, cookie) = self.GetNextChild(parentItem, cookie)                return None    def FindFolder(self, folderPath):        if folderPath != None:            folderTree = folderPath.split('/')                        item = self.GetRootItem()            for folderName in folderTree:                found = False                                (child, cookie) = self.GetFirstChild(item)                while child.IsOk():                    file = self.GetPyData(child)                    if file:                        pass                    else: # folder                        if self.GetItemText(child) == folderName:                            item = child                            found = True                            break                    (child, cookie) = self.GetNextChild(item, cookie)                                if found:                return item                        return None    def FindClosestFolder(self, x, y):        item, flags = self.HitTest((x,y))        if item:            file = self.GetPyData(item)            if file:                item = self.GetItemParent(item)                return item            return item        return Noneclass ProjectView(wx.lib.docview.View):    LOGICAL_MODE  = "logical"    PHYSICAL_MODE = "physical"    #----------------------------------------------------------------------------    # Overridden methods    #----------------------------------------------------------------------------    def __init__(self, service = None):        wx.lib.docview.View.__init__(self)        # self._service = service  # not used, but kept to match other Services        self._projectChoice = None        self._logicalBtn = None        self._physicalBtn = None        self._treeCtrl = None        self._editingSoDontKillFocus = False        self._checkEditMenu = True        self._loading = False  # flag to not to try to saving state of folders while it is loading    def GetDocumentManager(self):  # Overshadow this since the superclass uses the view._viewDocument attribute directly, which the project editor doesn't use since it hosts multiple docs        return wx.GetApp().GetDocumentManager()    def Destroy(self):        projectService = wx.GetApp().GetService(ProjectService)        if projectService:            projectService.SetView(None)        wx.lib.docview.View.Destroy(self)    def GetDocument(self):        if not self._projectChoice:            return None        selItem = self._projectChoice.GetSelection()        if selItem == wx.NOT_FOUND:            return None        document = self._projectChoice.GetClientData(selItem)        return document    def Activate(self, activate = True):        if not wx.GetApp().IsMDI():            if activate and not self.IsShown():                self.Show()        if self.IsShown():            wx.lib.docview.View.Activate(self, activate = activate)            if activate and self._treeCtrl:                self._treeCtrl.SetFocus()    def OnCreate(self, doc, flags):        config = wx.ConfigBase_Get()        if wx.GetApp().IsMDI():            self._embeddedWindow = wx.GetApp().GetTopWindow().GetEmbeddedWindow(wx.lib.pydocview.EMBEDDED_WINDOW_TOPLEFT)            self.SetFrame(self._embeddedWindow)            frame = self._embeddedWindow            wx.EVT_SIZE(frame, self.OnSize)        else:            self._embeddedWindow = None            pos = config.ReadInt("ProjectFrameXLoc", -1), config.ReadInt("ProjectFrameYLoc", -1)            # make sure frame is visible            screenWidth = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_X)            screenHeight = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)            if pos[0] < 0 or pos[0] >= screenWidth or pos[1] < 0 or pos[1] >= screenHeight:                pos = wx.DefaultPosition            size = wx.Size(config.ReadInt("ProjectFrameXSize", -1), config.ReadInt("ProjectFrameYSize", -1))            title = _("Projects")            if self.GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI and wx.GetApp().GetAppName():                title =  title + " - " + wx.GetApp().GetAppName()            frame = wx.GetApp().CreateDocumentFrame(self, doc, 0, title = title, pos = pos, size = size)            if config.ReadInt("ProjectFrameMaximized", False):                frame.Maximize(True)        panel = wx.Panel(frame, -1)        sizer = wx.BoxSizer(wx.VERTICAL)        butSizer = wx.BoxSizer(wx.HORIZONTAL)        self._projectChoice = wx.Choice(panel, -1)        panel.Bind(wx.EVT_CHOICE, self.OnProjectSelect, self._projectChoice)        w, h = self._projectChoice.GetSize()        self._logicalBtn = wx.lib.buttons.GenBitmapToggleButton(panel, -1, getLogicalModeOffBitmap(), size=(h,h))        self._logicalBtn.SetBitmapSelected(getLogicalModeOnBitmap())        self._logicalBtn.SetToggle(True)        self._logicalBtn.SetToolTipString(_("View Files by Logical Groups"))        panel.Bind(wx.EVT_BUTTON, self.OnSelectMode, self._logicalBtn)        self._physicalBtn = wx.lib.buttons.GenBitmapToggleButton(panel, -1, getPhysicalModeOffBitmap(), size=(h,h))        self._physicalBtn.SetBitmapSelected(getPhysicalModeOnBitmap())        self._physicalBtn.SetToolTipString(_("View Files by Physical Disk Layout"))        panel.Bind(wx.EVT_BUTTON, self.OnSelectMode, self._physicalBtn)                butSizer.Add(self._projectChoice, 1, wx.EXPAND)        butSizer.Add(self._logicalBtn, 0)        butSizer.Add(self._physicalBtn, 0)        sizer.Add(butSizer, 0, wx.EXPAND)        self._treeCtrl = ProjectTreeCtrl(panel, -1, style = wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS | wx.TR_EDIT_LABELS | wx.TR_DEFAULT_STYLE | wx.TR_MULTIPLE | wx.TR_EXTENDED)        self._treeCtrl.AddRoot(_("Projects"))        if self._embeddedWindow:            sizer.Add(self._treeCtrl, 1, wx.EXPAND|wx.BOTTOM, HALF_SPACE)  # allow space for embedded window resize-sash        else:            sizer.Add(self._treeCtrl, 1, wx.EXPAND)        panel.SetSizer(sizer)                sizer = wx.BoxSizer(wx.VERTICAL)                if wx.GetApp().IsMDI():            sizer.Add(panel, 1, wx.EXPAND|wx.BOTTOM, 3) # wxBug: without bottom margin, can't resize embedded window        else:            sizer.Add(panel, 1, wx.EXPAND)                    frame.SetSizer(sizer)        frame.Layout()        self.Activate()        if wx.GetApp().IsMDI():            wx.EVT_SET_FOCUS(self._treeCtrl, self.OnFocus)            wx.EVT_KILL_FOCUS(self._treeCtrl, self.OnKillFocus)        if self.GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:            wx.EVT_TREE_ITEM_ACTIVATED(self._treeCtrl, self._treeCtrl.GetId(), self.OnOpenSelectionSDI)        else:            wx.EVT_TREE_ITEM_ACTIVATED(self._treeCtrl, self._treeCtrl.GetId(), self.OnOpenSelection)        wx.EVT_TREE_BEGIN_LABEL_EDIT(self._treeCtrl, self._treeCtrl.GetId(), self.OnBeginLabelEdit)        wx.EVT_TREE_END_LABEL_EDIT(self._treeCtrl, self._treeCtrl.GetId(), self.OnEndLabelEdit)        wx.EVT_RIGHT_DOWN(self._treeCtrl, self.OnRightClick)        wx.EVT_KEY_DOWN(self._treeCtrl, self.OnKeyPressed)        wx.EVT_TREE_ITEM_COLLAPSED(self._treeCtrl, self._treeCtrl.GetId(), self.SaveFolderState)        wx.EVT_TREE_ITEM_EXPANDED(self._treeCtrl, self._treeCtrl.GetId(), self.SaveFolderState)        wx.EVT_TREE_BEGIN_DRAG(self._treeCtrl, self._treeCtrl.GetId(), self.OnBeginDrag)        wx.EVT_TREE_END_DRAG(self._treeCtrl, self._treeCtrl.GetId(), self.OnEndDrag)        wx.EVT_LEFT_DOWN(self._treeCtrl, self.OnLeftClick)        # drag-and-drop support        dt = ProjectFileDropTarget(self)        self._treeCtrl.SetDropTarget(dt)                return True    def OnSelectMode(self, event):        btn = event.GetEventObject()        down = event.GetIsDown()        if btn == self._logicalBtn:            self._physicalBtn.SetToggle(not down)        else:  # btn == self._physicalBtn:            self._logicalBtn.SetToggle(not down)        self.LoadProject(self.GetDocument())    def GetMode(self):        if not self._physicalBtn.up:            return ProjectView.PHYSICAL_MODE        else:  # elif self._logicalBtn.GetValue():            return ProjectView.LOGICAL_MODE    def OnProjectSelect(self, event=None):        self.LoadProject(self.GetDocument())        if self.GetDocument():            filename = self.GetDocument().GetFilename()        else:            filename = ''        self._projectChoice.SetToolTipString(filename)    def OnSize(self, event):        event.Skip()        wx.CallAfter(self.GetFrame().Layout)    def OnBeginDrag(self, event):        if self.GetMode() == ProjectView.PHYSICAL_MODE:            return                    item = event.GetItem()        if item.IsOk():            self._draggingItems = []            for item in self._treeCtrl.GetSelections():                if self._IsItemFile(item):                    self._draggingItems.append(item)            if len(self._draggingItems):                event.Allow()    def OnEndDrag(self, event):        item = event.GetItem()        if item.IsOk():            files = []            for ditem in self._draggingItems:                file = self._GetItemFile(ditem)                if file not in files:                    files.append(file)                                folderPath = self._GetItemFolderPath(item)            self.GetDocument().GetCommandProcessor().Submit(ProjectMoveFilesCommand(self.GetDocument(), files, folderPath))    def WriteProjectConfig(self):        frame = self.GetFrame()        config = wx.ConfigBase_Get()        if frame and not self._embeddedWindow:            if not frame.IsMaximized():                config.WriteInt("ProjectFrameXLoc", frame.GetPositionTuple()[0])                config.WriteInt("ProjectFrameYLoc", frame.GetPositionTuple()[1])                config.WriteInt("ProjectFrameXSize", frame.GetSizeTuple()[0])                config.WriteInt("ProjectFrameYSize", frame.GetSizeTuple()[1])        

⌨️ 快捷键说明

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