📄 projecteditor.py
字号:
icon = getBlankIcon()
if icon.GetHeight() != 16 or icon.GetWidth() != 16:
icon.SetHeight(16)
icon.SetWidth(16)
if wx.GetApp().GetDebug():
print "Warning: getBlankIcon isn't 16x16, not crossplatform"
self._blankIconIndex = iconList.AddIcon(icon)
icon = getFolderClosedIcon()
if icon.GetHeight() != 16 or icon.GetWidth() != 16:
icon.SetHeight(16)
icon.SetWidth(16)
if wx.GetApp().GetDebug():
print "Warning: getFolderIcon isn't 16x16, not crossplatform"
self._folderClosedIconIndex = iconList.AddIcon(icon)
icon = getFolderOpenIcon()
if icon.GetHeight() != 16 or icon.GetWidth() != 16:
icon.SetHeight(16)
icon.SetWidth(16)
if wx.GetApp().GetDebug():
print "Warning: getFolderIcon isn't 16x16, not crossplatform"
self._folderOpenIconIndex = iconList.AddIcon(icon)
self.AssignImageList(iconList)
def OnCompareItems(self, item1, item2):
item1IsFolder = (self.GetPyData(item1) == None)
item2IsFolder = (self.GetPyData(item2) == None)
if (item1IsFolder == item2IsFolder): # if both are folders or both not
return cmp(self.GetItemText(item1).lower(), self.GetItemText(item2).lower())
elif item1IsFolder and not item2IsFolder: # folders sort above non-folders
return -1
elif not item1IsFolder and item2IsFolder: # folders sort above non-folders
return 1
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 None
class 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():
f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -