📄 outlineservice.py
字号:
def FindDistanceToTreeItems(self, item, position, distances, items):
data = self.GetPyData(item)
this_dist = 1000000
if data and data[2]:
positionTuple = data[2]
if position >= positionTuple[1]:
items.append(item)
distances.append(position - positionTuple[1])
if self.ItemHasChildren(item):
child, cookie = self.GetFirstChild(item)
while child.IsOk():
self.FindDistanceToTreeItems(child, position, distances, items)
child, cookie = self.GetNextChild(item, cookie)
return False
def SetDoSelectCallback(self, item, view, callbackdata):
""" When an item in the outline view is selected,
a method is called to select the respective text in the document view.
The view must define the method DoSelectCallback(self, data) in order for this to work
"""
self.SetPyData(item, (self._origOrderIndex, view, callbackdata))
self._origOrderIndex = self._origOrderIndex + 1
def CallDoLoadOutlineCallback(self, event):
""" Invoke the DoLoadOutlineCallback
"""
rootItem = self.GetRootItem()
if rootItem:
data = self.GetPyData(rootItem)
if data:
view = data[self.VIEW]
if view and view.DoLoadOutlineCallback():
self.SortAllChildren(self.GetRootItem())
def GetCallbackView(self):
rootItem = self.GetRootItem()
if rootItem:
return self.GetPyData(rootItem)[self.VIEW]
else:
return None
class OutlineService(Service.Service):
#----------------------------------------------------------------------------
# Constants
#----------------------------------------------------------------------------
SHOW_WINDOW = wx.NewId() # keep this line for each subclass, need unique ID for each Service
SORT = wx.NewId()
SORT_ASC = wx.NewId()
SORT_DESC = wx.NewId()
SORT_NONE = wx.NewId()
#----------------------------------------------------------------------------
# Overridden methods
#----------------------------------------------------------------------------
def __init__(self, serviceName, embeddedWindowLocation = wx.lib.pydocview.EMBEDDED_WINDOW_BOTTOM):
Service.Service.__init__(self, serviceName, embeddedWindowLocation)
self._validViewTypes = []
def _CreateView(self):
return OutlineView(self)
def InstallControls(self, frame, menuBar = None, toolBar = None, statusBar = None, document = None):
Service.Service.InstallControls(self, frame, menuBar, toolBar, statusBar, document)
wx.EVT_MENU(frame, OutlineService.SORT_ASC, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, OutlineService.SORT_ASC, frame.ProcessUpdateUIEvent)
wx.EVT_MENU(frame, OutlineService.SORT_DESC, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, OutlineService.SORT_DESC, frame.ProcessUpdateUIEvent)
wx.EVT_MENU(frame, OutlineService.SORT_NONE, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, OutlineService.SORT_NONE, frame.ProcessUpdateUIEvent)
if wx.GetApp().GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:
return True
viewMenu = menuBar.GetMenu(menuBar.FindMenu(_("&View")))
self._outlineSortMenu = wx.Menu()
self._outlineSortMenu.AppendRadioItem(OutlineService.SORT_NONE, _("Unsorted"), _("Display items in original order"))
self._outlineSortMenu.AppendRadioItem(OutlineService.SORT_ASC, _("Sort A-Z"), _("Display items in ascending order"))
self._outlineSortMenu.AppendRadioItem(OutlineService.SORT_DESC, _("Sort Z-A"), _("Display items in descending order"))
viewMenu.AppendMenu(wx.NewId(), _("Outline Sort"), self._outlineSortMenu)
return True
#----------------------------------------------------------------------------
# Event Processing Methods
#----------------------------------------------------------------------------
def ProcessEvent(self, event):
if Service.Service.ProcessEvent(self, event):
return True
id = event.GetId()
if id == OutlineService.SORT_ASC:
self.OnSort(event)
return True
elif id == OutlineService.SORT_DESC:
self.OnSort(event)
return True
elif id == OutlineService.SORT_NONE:
self.OnSort(event)
return True
else:
return False
def ProcessUpdateUIEvent(self, event):
if Service.Service.ProcessUpdateUIEvent(self, event):
return True
id = event.GetId()
if id == OutlineService.SORT_ASC:
event.Enable(True)
config = wx.ConfigBase_Get()
sort = config.ReadInt("OutlineSort", SORT_NONE)
if sort == SORT_ASC:
self._outlineSortMenu.Check(OutlineService.SORT_ASC, True)
else:
self._outlineSortMenu.Check(OutlineService.SORT_ASC, False)
return True
elif id == OutlineService.SORT_DESC:
event.Enable(True)
config = wx.ConfigBase_Get()
sort = config.ReadInt("OutlineSort", SORT_NONE)
if sort == SORT_DESC:
self._outlineSortMenu.Check(OutlineService.SORT_DESC, True)
else:
self._outlineSortMenu.Check(OutlineService.SORT_DESC, False)
return True
elif id == OutlineService.SORT_NONE:
event.Enable(True)
config = wx.ConfigBase_Get()
sort = config.ReadInt("OutlineSort", SORT_NONE)
if sort == SORT_NONE:
self._outlineSortMenu.Check(OutlineService.SORT_NONE, True)
else:
self._outlineSortMenu.Check(OutlineService.SORT_NONE, False)
return True
else:
return False
def OnSort(self, event):
id = event.GetId()
if id == OutlineService.SORT_ASC:
wx.ConfigBase_Get().WriteInt("OutlineSort", SORT_ASC)
self.GetView().OnSort(SORT_ASC)
return True
elif id == OutlineService.SORT_DESC:
wx.ConfigBase_Get().WriteInt("OutlineSort", SORT_DESC)
self.GetView().OnSort(SORT_DESC)
return True
elif id == OutlineService.SORT_NONE:
wx.ConfigBase_Get().WriteInt("OutlineSort", SORT_NONE)
self.GetView().OnSort(SORT_NONE)
return True
#----------------------------------------------------------------------------
# Service specific methods
#----------------------------------------------------------------------------
def LoadOutline(self, view, position=-1, force=False):
if not self.GetView():
return
if hasattr(view, "DoLoadOutlineCallback"):
self.SaveExpansionState()
if view.DoLoadOutlineCallback(force=force):
self.GetView().OnSort(wx.ConfigBase_Get().ReadInt("OutlineSort", SORT_NONE))
self.LoadExpansionState()
if position >= 0:
self.SyncToPosition(position)
def SyncToPosition(self, position):
if not self.GetView():
return
self.GetView().GetTreeCtrl().SelectClosestItem(position)
def OnCloseFrame(self, event):
Service.Service.OnCloseFrame(self, event)
self.SaveExpansionState(clear = True)
return True
def SaveExpansionState(self, clear = False):
if clear:
expanded = []
elif self.GetView():
expanded = self.GetView().GetExpansionState()
wx.ConfigBase_Get().Write("OutlineLastExpanded", expanded.__repr__())
def LoadExpansionState(self):
expanded = wx.ConfigBase_Get().Read("OutlineLastExpanded")
if expanded:
self.GetView().SetExpansionState(eval(expanded))
#----------------------------------------------------------------------------
# Timer Methods
#----------------------------------------------------------------------------
def StartBackgroundTimer(self):
self._timer = wx.PyTimer(self.DoBackgroundRefresh)
self._timer.Start(250)
def DoBackgroundRefresh(self):
""" Refresh the outline view periodically """
self._timer.Stop()
foundRegisteredView = False
if self.GetView():
currView = wx.GetApp().GetDocumentManager().GetCurrentView()
if currView:
for viewType in self._validViewTypes:
if isinstance(currView, viewType):
self.LoadOutline(currView)
foundRegisteredView = True
break
if not foundRegisteredView:
self.GetView().ClearTreeCtrl()
self._timer.Start(1000) # 1 second interval
def AddViewTypeForBackgroundHandler(self, viewType):
self._validViewTypes.append(viewType)
def GetViewTypesForBackgroundHandler(self):
return self._validViewTypes
def RemoveViewTypeForBackgroundHandler(self, viewType):
self._validViewTypes.remove(viewType)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -