📄 tree.py
字号:
try:
if xxx.__class__ == xxxFrame:
# Frame can't have many children,
# but it's first child possibly can...
# child = self.GetFirstChild(item)[0]
# if child.IsOk() and self.GetPyData(child).__class__ == xxxPanel:
# # Clean-up before recursive call or error
# wx.MemoryFSHandler.RemoveFile('xxx.xrc')
# wx.EndBusyCursor()
# self.CreateTestWin(child)
# return
# This currently works under GTK, but not under MSW
testWin = g.testWin = wx.PreFrame()
res.LoadOnFrame(testWin, g.frame, STD_NAME)
# Create status bar
testWin.panel = testWin
#testWin.CreateStatusBar()
testWin.SetClientSize(testWin.GetBestSize())
testWin.SetPosition(pos)
testWin.Show(True)
elif xxx.__class__ == xxxPanel:
# Create new frame
if not testWin:
testWin = g.testWin = wx.Frame(g.frame, -1, 'Panel: ' + name,
pos=pos, name=STD_NAME)
testWin.panel = res.LoadPanel(testWin, STD_NAME)
testWin.SetClientSize(testWin.GetBestSize())
testWin.Show(True)
elif xxx.__class__ == xxxDialog:
testWin = g.testWin = res.LoadDialog(None, STD_NAME)
testWin.panel = testWin
testWin.Layout()
testWin.SetPosition(pos)
testWin.Show(True)
# Dialog's default code does not produce wx.EVT_CLOSE
wx.EVT_BUTTON(testWin, wx.ID_OK, self.OnCloseTestWin)
wx.EVT_BUTTON(testWin, wx.ID_CANCEL, self.OnCloseTestWin)
elif xxx.__class__ == xxxWizard:
wiz = wx.wizard.PreWizard()
res.LoadOnObject(wiz, None, STD_NAME, 'wxWizard')
# Find first page (don't know better way)
firstPage = None
for w in wiz.GetChildren():
if isinstance(w, wx.wizard.WizardPage):
firstPage = w
break
if not firstPage:
wx.LogError('Wizard is empty')
else:
# Wizard should be modal
self.SetItemBold(item)
wiz.RunWizard(w)
self.SetItemBold(item, False)
wiz.Destroy()
elif xxx.__class__ in [xxxWizardPage, xxxWizardPageSimple]:
# Create new frame
if not testWin:
testWin = g.testWin = wx.Frame(g.frame, -1, 'Wizard page: ' + name,
pos=pos, name=STD_NAME)
testWin.panel = wx.PrePanel()
res.LoadOnObject(testWin.panel, testWin, STD_NAME, 'wxPanel')
testWin.SetClientSize(testWin.GetBestSize())
testWin.Show(True)
elif xxx.__class__ == xxxMenuBar:
testWin = g.testWin = wx.Frame(g.frame, -1, 'MenuBar: ' + name,
pos=pos, name=STD_NAME)
testWin.panel = None
# Set status bar to display help
testWin.CreateStatusBar()
testWin.menuBar = res.LoadMenuBar(STD_NAME)
testWin.SetMenuBar(testWin.menuBar)
testWin.Show(True)
elif xxx.__class__ == xxxToolBar:
testWin = g.testWin = wx.Frame(g.frame, -1, 'ToolBar: ' + name,
pos=pos, name=STD_NAME)
testWin.panel = None
# Set status bar to display help
testWin.CreateStatusBar()
testWin.toolBar = res.LoadToolBar(testWin, STD_NAME)
testWin.SetToolBar(testWin.toolBar)
testWin.Show(True)
if testWin:
testWin.item = item
wx.EVT_CLOSE(testWin, self.OnCloseTestWin)
testWin.highLight = None
if highLight and not self.pendingHighLight:
self.HighLight(highLight)
except:
if g.testWin:
self.SetItemBold(item, False)
g.testWinPos = g.testWin.GetPosition()
g.testWin.Destroy()
g.testWin = None
inf = sys.exc_info()
wx.LogError(traceback.format_exception(inf[0], inf[1], None)[-1])
wx.LogError('Error loading resource')
wx.MemoryFSHandler.RemoveFile('xxx.xrc')
def CloseTestWindow(self):
if not g.testWin: return
self.SetItemBold(g.testWin.item, False)
g.frame.tb.ToggleTool(g.frame.ID_TOOL_LOCATE, False)
g.testWinPos = g.testWin.GetPosition()
g.testWin.Destroy()
g.testWin = None
def OnCloseTestWin(self, evt):
self.CloseTestWindow()
# Return index in parent, for real window children
def WindowIndex(self, item):
n = 0 # index of sibling
prev = self.GetPrevSibling(item)
while prev.IsOk():
# MenuBar is not a child
if not isinstance(self.GetPyData(prev), xxxMenuBar):
n += 1
prev = self.GetPrevSibling(prev)
return n
# Return item index in parent
def ItemIndex(self, item):
n = 0 # index of sibling
prev = self.GetPrevSibling(item)
while prev.IsOk():
prev = self.GetPrevSibling(prev)
n += 1
return n
# Full tree index of an item - list of positions
def ItemFullIndex(self, item):
if not item.IsOk(): return None
l = []
while item != self.root:
l.insert(0, self.ItemIndex(item))
item = self.GetItemParent(item)
return l
# Get item position from full index
def ItemAtFullIndex(self, index):
if index is None: return wx.TreeItemId()
item = self.root
for i in index:
item = self.GetFirstChild(item)[0]
for k in range(i): item = self.GetNextSibling(item)
return item
# True if next item should be inserted after current (vs. appended to it)
def NeedInsert(self, item):
xxx = self.GetPyData(item)
if item == self.root: return False # root item
if xxx.hasChildren and not self.GetChildrenCount(item, False):
return False
return not (self.IsExpanded(item) and self.GetChildrenCount(item, False))
# Override to use like single-selection tree
def GetSelection(self):
return self.selection
def SelectItem(self, item):
self.UnselectAll()
self.ChangeSelection(item)
wx.TreeCtrl.SelectItem(self, item)
# Pull-down
def OnRightDown(self, evt):
pullDownMenu = g.pullDownMenu
# select this item
pt = evt.GetPosition();
item, flags = self.HitTest(pt)
if item.Ok() and flags & wx.TREE_HITTEST_ONITEM:
self.SelectItem(item)
# Setup menu
menu = wx.Menu()
item = self.selection
if not item:
menu.Append(g.pullDownMenu.ID_EXPAND, 'Expand', 'Expand tree')
menu.Append(g.pullDownMenu.ID_COLLAPSE, 'Collapse', 'Collapse tree')
else:
# self.ctrl = evt.ControlDown() # save Ctrl state
# self.shift = evt.ShiftDown() # and Shift too
m = wx.Menu() # create menu
if self.ctrl:
needInsert = True
else:
needInsert = self.NeedInsert(item)
if item == self.root or needInsert and self.GetItemParent(item) == self.root:
SetMenu(m, pullDownMenu.topLevel)
m.AppendSeparator()
m.Append(ID_NEW.REF, 'reference...', 'Create object_ref node')
else:
xxx = self.GetPyData(item).treeObject()
# Check parent for possible child nodes if inserting sibling
if needInsert: xxx = xxx.parent
if xxx.__class__ == xxxMenuBar:
m.Append(ID_NEW.MENU, 'Menu', 'Create menu')
elif xxx.__class__ in [xxxToolBar, xxxTool] or \
xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar:
SetMenu(m, pullDownMenu.toolBarControls)
elif xxx.__class__ in [xxxMenu, xxxMenuItem]:
SetMenu(m, pullDownMenu.menuControls)
elif xxx.__class__ == xxxStdDialogButtonSizer:
SetMenu(m, pullDownMenu.stdButtons)
else:
SetMenu(m, pullDownMenu.controls)
if xxx.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]:
m.Enable(m.FindItem('sizer'), False)
elif not (xxx.isSizer or xxx.parent and xxx.parent.isSizer):
m.Enable(ID_NEW.SPACER, False)
if xxx.__class__ is not xxxFrame:
m.Enable(ID_NEW.MENU_BAR, False)
m.AppendSeparator()
m.Append(ID_NEW.REF, 'reference...', 'Create object_ref node')
# Select correct label for create menu
if not needInsert:
if self.shift:
menu.AppendMenu(wx.NewId(), 'Insert Child', m,
'Create child object as the first child')
else:
menu.AppendMenu(wx.NewId(), 'Append Child', m,
'Create child object as the last child')
else:
if self.shift:
menu.AppendMenu(wx.NewId(), 'Create Sibling', m,
'Create sibling before selected object')
else:
menu.AppendMenu(wx.NewId(), 'Create Sibling', m,
'Create sibling after selected object')
# Build replace menu
if item != self.root:
xxx = self.GetPyData(item).treeObject()
m = wx.Menu() # create replace menu
if xxx.__class__ == xxxMenuBar:
m.Append(1000 + ID_NEW.MENU, 'Menu', 'Create menu')
elif xxx.__class__ in [xxxMenu, xxxMenuItem]:
SetMenu(m, pullDownMenu.menuControls, shift=True)
elif xxx.__class__ == xxxToolBar and \
self.GetItemParent(item) == self.root:
SetMenu(m, [], shift=True)
elif xxx.__class__ in [xxxFrame, xxxDialog, xxxPanel]:
SetMenu(m, [
(ID_NEW.PANEL, 'Panel', 'Create panel'),
(ID_NEW.DIALOG, 'Dialog', 'Create dialog'),
(ID_NEW.FRAME, 'Frame', 'Create frame')], shift=True)
elif xxx.isSizer:
SetMenu(m, pullDownMenu.sizers, shift=True)
else:
SetMenu(m, pullDownMenu.controls, shift=True)
id = wx.NewId()
menu.AppendMenu(id, 'Replace With', m)
if not m.GetMenuItemCount(): menu.Enable(id, False)
menu.Append(pullDownMenu.ID_SUBCLASS, 'Subclass...',
'Set "subclass" property')
menu.AppendSeparator()
# Not using standart IDs because we don't want to show shortcuts
menu.Append(wx.ID_CUT, 'Cut', 'Cut to the clipboard')
menu.Append(wx.ID_COPY, 'Copy', 'Copy to the clipboard')
if self.ctrl and item != self.root:
menu.Append(pullDownMenu.ID_PASTE_SIBLING, 'Paste Sibling',
'Paste from the clipboard as a sibling')
else:
menu.Append(wx.ID_PASTE, 'Paste', 'Paste from the clipboard')
menu.Append(pullDownMenu.ID_DELETE,
'Delete', 'Delete object')
if self.ItemHasChildren(item):
menu.AppendSeparator()
menu.Append(pullDownMenu.ID_EXPAND, 'Expand', 'Expand subtree')
menu.Append(pullDownMenu.ID_COLLAPSE, 'Collapse', 'Collapse subtree')
self.PopupMenu(menu, evt.GetPosition())
menu.Destroy()
# Apply changes
def Apply(self, xxx, item):
g.panel.Apply()
# Update tree view
xxx = xxx.treeObject()
if xxx.hasName and self.GetItemText(item) != xxx.name:
self.SetItemText(item, xxx.treeName())
# Item width may have changed
# !!! Tric to update tree width (wxGTK, ??)
self.SetIndent(self.GetIndent())
# Change tree icon for sizers
if isinstance(xxx, xxxBoxSizer):
self.SetItemImage(item, xxx.treeImage())
# Set global modified state
g.frame.SetModified()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -