📄 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 Noneclass 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 + -