📄 projecteditor.py
字号:
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 + -