📄 pydocview.py
字号:
service.InstallControls(self, menuBar = menuBar, toolBar = toolBar, statusBar = statusBar)
if hasattr(service, "ShowWindow"):
service.ShowWindow() # instantiate service windows for correct positioning, we'll hide/show them later based on user preference
if wx.Platform != '__WXMAC__':
self.SetMenuBar(menuBar) # wxBug: Have to set the menubar at the very end or the automatic MDI "window" menu doesn't get put in the right place when the services add new menus to the menubar
def ProcessEvent(self, event):
"""
Processes an event, searching event tables and calling zero or more
suitable event handler function(s). Note that the ProcessEvent
method is called from the wxPython docview framework directly since
wxPython does not have a virtual ProcessEvent function.
"""
id = event.GetId()
if id == SAVEALL_ID:
self.OnFileSaveAll(event)
return True
return wx.GetApp().ProcessEvent(event)
def ProcessUpdateUIEvent(self, event):
"""
Processes a UI event, searching event tables and calling zero or more
suitable event handler function(s). Note that the ProcessEvent
method is called from the wxPython docview framework directly since
wxPython does not have a virtual ProcessEvent function.
"""
id = event.GetId()
if id == wx.ID_CUT:
event.Enable(False)
return True
elif id == wx.ID_COPY:
event.Enable(False)
return True
elif id == wx.ID_PASTE:
event.Enable(False)
return True
elif id == wx.ID_CLEAR:
event.Enable(False)
return True
elif id == wx.ID_SELECTALL:
event.Enable(False)
return True
elif id == SAVEALL_ID:
filesModified = False
docs = wx.GetApp().GetDocumentManager().GetDocuments()
for doc in docs:
if doc.IsModified():
filesModified = True
break
event.Enable(filesModified)
return True
else:
return wx.GetApp().ProcessUpdateUIEvent(event)
def CreateEmbeddedWindows(self, windows=0, minSize=20):
"""
Create the specified embedded windows around the edges of the frame.
"""
frameSize = self.GetSize() # TODO: GetClientWindow.GetSize is still returning 0,0 since the frame isn't fully constructed yet, so using full frame size
defaultHSize = max(minSize, int(frameSize[0] / 6))
defaultVSize = max(minSize, int(frameSize[1] / 7))
defaultSubVSize = int(frameSize[1] / 2)
config = wx.ConfigBase_Get()
if windows & (EMBEDDED_WINDOW_LEFT | EMBEDDED_WINDOW_TOPLEFT | EMBEDDED_WINDOW_BOTTOMLEFT):
self._leftEmbWindow = self._CreateEmbeddedWindow(self, (max(minSize,config.ReadInt("MDIEmbedLeftSize", defaultHSize)), -1), wx.LAYOUT_VERTICAL, wx.LAYOUT_LEFT, visible = config.ReadInt("MDIEmbedLeftVisible", 1), sash = wx.SASH_RIGHT)
else:
self._leftEmbWindow = None
if windows & EMBEDDED_WINDOW_TOPLEFT:
self._topLeftEmbWindow = self._CreateEmbeddedWindow(self._leftEmbWindow, (-1, config.ReadInt("MDIEmbedTopLeftSize", defaultSubVSize)), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_TOP, visible = config.ReadInt("MDIEmbedTopLeftVisible", 1), sash = wx.SASH_BOTTOM)
else:
self._topLeftEmbWindow = None
if windows & EMBEDDED_WINDOW_BOTTOMLEFT:
self._bottomLeftEmbWindow = self._CreateEmbeddedWindow(self._leftEmbWindow, (-1, config.ReadInt("MDIEmbedBottomLeftSize", defaultSubVSize)), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_BOTTOM, visible = config.ReadInt("MDIEmbedBottomLeftVisible", 1))
else:
self._bottomLeftEmbWindow = None
if windows & (EMBEDDED_WINDOW_RIGHT | EMBEDDED_WINDOW_TOPRIGHT | EMBEDDED_WINDOW_BOTTOMRIGHT):
self._rightEmbWindow = self._CreateEmbeddedWindow(self, (max(minSize,config.ReadInt("MDIEmbedRightSize", defaultHSize)), -1), wx.LAYOUT_VERTICAL, wx.LAYOUT_RIGHT, visible = config.ReadInt("MDIEmbedRightVisible", 1), sash = wx.SASH_LEFT)
else:
self._rightEmbWindow = None
if windows & EMBEDDED_WINDOW_TOPRIGHT:
self._topRightEmbWindow = self._CreateEmbeddedWindow(self._rightEmbWindow, (-1, config.ReadInt("MDIEmbedTopRightSize", defaultSubVSize)), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_TOP, visible = config.ReadInt("MDIEmbedTopRightVisible", 1), sash = wx.SASH_BOTTOM)
else:
self._topRightEmbWindow = None
if windows & EMBEDDED_WINDOW_BOTTOMRIGHT:
self._bottomRightEmbWindow = self._CreateEmbeddedWindow(self._rightEmbWindow, (-1, config.ReadInt("MDIEmbedBottomRightSize", defaultSubVSize)), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_BOTTOM, visible = config.ReadInt("MDIEmbedBottomRightVisible", 1))
else:
self._bottomRightEmbWindow = None
if windows & EMBEDDED_WINDOW_TOP:
self._topEmbWindow = self._CreateEmbeddedWindow(self, (-1, max(minSize,config.ReadInt("MDIEmbedTopSize", defaultVSize))), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_TOP, visible = config.ReadInt("MDIEmbedTopVisible", 1), sash = wx.SASH_BOTTOM)
else:
self._topEmbWindow = None
if windows & EMBEDDED_WINDOW_BOTTOM:
self._bottomEmbWindow = self._CreateEmbeddedWindow(self, (-1, max(minSize,config.ReadInt("MDIEmbedBottomSize", defaultVSize))), wx.LAYOUT_HORIZONTAL, wx.LAYOUT_BOTTOM, visible = config.ReadInt("MDIEmbedBottomVisible", 1), sash = wx.SASH_TOP)
else:
self._bottomEmbWindow = None
def SaveEmbeddedWindowSizes(self):
"""
Saves the sizes of the embedded windows.
"""
config = wx.ConfigBase_Get()
if not self.IsMaximized():
config.WriteInt("MDIFrameXLoc", self.GetPositionTuple()[0])
config.WriteInt("MDIFrameYLoc", self.GetPositionTuple()[1])
config.WriteInt("MDIFrameXSize", self.GetSizeTuple()[0])
config.WriteInt("MDIFrameYSize", self.GetSizeTuple()[1])
config.WriteInt("MDIFrameMaximized", self.IsMaximized())
config.WriteInt("ViewToolBar", self._toolBar.IsShown())
config.WriteInt("ViewStatusBar", self.GetStatusBar().IsShown())
if self._leftEmbWindow:
config.WriteInt("MDIEmbedLeftSize", self._leftEmbWindow.GetSize()[0])
config.WriteInt("MDIEmbedLeftVisible", self._leftEmbWindow.IsShown())
if self._topLeftEmbWindow:
if self._topLeftEmbWindow._sizeBeforeHidden:
size = self._topLeftEmbWindow._sizeBeforeHidden[1]
else:
size = self._topLeftEmbWindow.GetSize()[1]
config.WriteInt("MDIEmbedTopLeftSize", size)
config.WriteInt("MDIEmbedTopLeftVisible", self._topLeftEmbWindow.IsShown())
if self._bottomLeftEmbWindow:
if self._bottomLeftEmbWindow._sizeBeforeHidden:
size = self._bottomLeftEmbWindow._sizeBeforeHidden[1]
else:
size = self._bottomLeftEmbWindow.GetSize()[1]
config.WriteInt("MDIEmbedBottomLeftSize", size)
config.WriteInt("MDIEmbedBottomLeftVisible", self._bottomLeftEmbWindow.IsShown())
if self._rightEmbWindow:
config.WriteInt("MDIEmbedRightSize", self._rightEmbWindow.GetSize()[0])
config.WriteInt("MDIEmbedRightVisible", self._rightEmbWindow.IsShown())
if self._topRightEmbWindow:
if self._topRightEmbWindow._sizeBeforeHidden:
size = self._topRightEmbWindow._sizeBeforeHidden[1]
else:
size = self._topRightEmbWindow.GetSize()[1]
config.WriteInt("MDIEmbedTopRightSize", size)
config.WriteInt("MDIEmbedTopRightVisible", self._topRightEmbWindow.IsShown())
if self._bottomRightEmbWindow:
if self._bottomRightEmbWindow._sizeBeforeHidden:
size = self._bottomRightEmbWindow._sizeBeforeHidden[1]
else:
size = self._bottomRightEmbWindow.GetSize()[1]
config.WriteInt("MDIEmbedBottomRightSize", size)
config.WriteInt("MDIEmbedBottomRightVisible", self._bottomRightEmbWindow.IsShown())
if self._topEmbWindow:
config.WriteInt("MDIEmbedTopSize", self._topEmbWindow.GetSize()[1])
config.WriteInt("MDIEmbedTopVisible", self._topEmbWindow.IsShown())
if self._bottomEmbWindow:
config.WriteInt("MDIEmbedBottomSize", self._bottomEmbWindow.GetSize()[1])
config.WriteInt("MDIEmbedBottomVisible", self._bottomEmbWindow.IsShown())
def GetEmbeddedWindow(self, loc):
"""
Returns the instance of the embedded window specified by the embedded window location constant.
"""
if loc == EMBEDDED_WINDOW_TOP:
return self._topEmbWindow
elif loc == EMBEDDED_WINDOW_BOTTOM:
return self._bottomEmbWindow
elif loc == EMBEDDED_WINDOW_LEFT:
return self._leftEmbWindow
elif loc == EMBEDDED_WINDOW_RIGHT:
return self._rightEmbWindow
elif loc == EMBEDDED_WINDOW_TOPLEFT:
return self._topLeftEmbWindow
elif loc == EMBEDDED_WINDOW_BOTTOMLEFT:
return self._bottomLeftEmbWindow
elif loc == EMBEDDED_WINDOW_TOPRIGHT:
return self._topRightEmbWindow
elif loc == EMBEDDED_WINDOW_BOTTOMRIGHT:
return self._bottomRightEmbWindow
return None
def _CreateEmbeddedWindow(self, parent, size, orientation, alignment, visible=True, sash=None):
"""
Creates the embedded window with the specified size, orientation, and alignment. If the
window is not visible it will retain the size with which it was last viewed.
"""
window = wx.SashLayoutWindow(parent, wx.NewId(), style = wx.NO_BORDER | wx.SW_3D)
window.SetDefaultSize(size)
window.SetOrientation(orientation)
window.SetAlignment(alignment)
if sash != None: # wx.SASH_TOP is 0 so check for None instead of just doing "if sash:"
window.SetSashVisible(sash, True)
####
def OnEmbeddedWindowSashDrag(event):
if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
return
sashWindow = event.GetEventObject()
if sashWindow.GetAlignment() == wx.LAYOUT_TOP or sashWindow.GetAlignment() == wx.LAYOUT_BOTTOM:
size = wx.Size(-1, event.GetDragRect().height)
else:
size = wx.Size(event.GetDragRect().width, -1)
event.GetEventObject().SetDefaultSize(size)
self._LayoutFrame()
sashWindow.Refresh()
if isinstance(sashWindow.GetParent(), wx.SashLayoutWindow):
sashWindow.Show()
parentSashWindow = sashWindow.GetParent() # Force a refresh
parentSashWindow.Layout()
parentSashWindow.Refresh()
parentSashWindow.SetSize((parentSashWindow.GetSize().width + 1, parentSashWindow.GetSize().height + 1))
####
wx.EVT_SASH_DRAGGED(window, window.GetId(), OnEmbeddedWindowSashDrag)
window._sizeBeforeHidden = None
if not visible:
window.Show(False)
if isinstance(parent, wx.SashLayoutWindow): # It's a window embedded in another sash window so remember its actual size to show it again
window._sizeBeforeHidden = size
return window
def ShowEmbeddedWindow(self, window, show=True):
"""
Shows or hides the embedded window specified by the embedded window location constant.
"""
window.Show(show)
if isinstance(window.GetParent(), wx.SashLayoutWindow): # It is a parent sashwindow with multiple embedded sashwindows
parentSashWindow = window.GetParent()
if show: # Make sure it is visible in case all of the subwindows were hidden
parentSashWindow.Show()
if show and window._sizeBeforeHidden:
if window._sizeBeforeHidden[1] == parentSashWindow.GetClientSize()[1]:
if window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT) and self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT).IsShown():
window.SetDefaultSize((window._sizeBeforeHidden[0], window._sizeBeforeHidden[0] - self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT).GetSize()[1]))
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT) and self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT).IsShown():
window.SetDefaultSize((window._sizeBeforeHidden[0], window._sizeBeforeHidden[0] - self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT).GetSize()[1]))
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT) and self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT).IsShown():
window.SetDefaultSize((window._sizeBeforeHidden[0], window._sizeBeforeHidden[0] - self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT).GetSize()[1]))
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT) and self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT).IsShown():
window.SetDefaultSize((window._sizeBeforeHidden[0], window._sizeBeforeHidden[0] - self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT).GetSize()[1]))
else:
window.SetDefaultSize(window._sizeBeforeHidden)
# If it is not the size of the full parent sashwindow set the other window's size so that if it gets shown it will have a cooresponding size
if window._sizeBeforeHidden[1] < parentSashWindow.GetClientSize()[1]:
otherWindowSize = (-1, parentSashWindow.GetClientSize()[1] - window._sizeBeforeHidden[1])
if window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT):
self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT).SetDefaultSize(otherWindowSize)
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT):
self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT).SetDefaultSize(otherWindowSize)
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT):
self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT).SetDefaultSize(otherWindowSize)
elif window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT):
self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT).SetDefaultSize(otherWindowSize)
if not show:
if window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT) and not self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT).IsShown() \
or window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT) and not self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT).IsShown() \
or window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT) and not self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT).IsShown() \
or window == self.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT) and not self.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT).IsShown():
parentSashWindow.Hide() # Hide the parent sashwindow if all of the children are hidden
parentSashWindow.Layout() # Force a refresh
parentSashWindow.Refresh()
parentSashWindow.SetSize((parentSashWindow.GetSize().width + 1, parentSashWindow.GetSize().height + 1))
self._LayoutFrame()
def HideEmbeddedWindow(self, window):
"""
Hides the embedded window specified by the embedded window location constant.
"""
self.ShowEmbeddedWindow(window, show=False)
class DocTabbedChildFrame(wx.Panel):
"""
The wxDocMDIChildFrame class provides a default frame for displaying
documents on separate windows. This class can only be used for MDI child
frames.
The class is part of the document/view framework supported by wxWindows,
and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
classes.
"""
def __init__(self, doc, view, frame, id, title, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name="frame"):
"""
Constructor. Note that the event table must be rebuilt for the
frame since the EvtHandler is not virtual.
"""
wx.Panel.__init__(self, frame.GetNotebook(), id)
self._childDocument = doc
self._childView = view
frame.AddNotebookPage(self, doc.GetPrintableName())
if view:
view.SetFrame(self)
def GetIcon(self):
"""
Dummy method since the icon of tabbed frames are managed by the notebook.
"""
return None
def SetIcon(self, icon):
"""
Dummy method since the icon of tabbed frames are managed by the notebook.
"""
pass
def Destroy(self):
"""
Removes the current notebook page.
"""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -