📄 xrced.py
字号:
# Reduce width
self.SetDimensions(pos.x, pos.y,
max(size.width - sizePanel.width, self.minWidth), size.height)
def OnShowTools(self, evt):
conf.showTools = evt.IsChecked()
g.tools.Show(conf.showTools)
if conf.showTools:
self.toolsSizer.Prepend(g.tools, 0, wx.EXPAND)
else:
self.toolsSizer.Remove(g.tools)
self.toolsSizer.Layout()
def OnTest(self, evt):
if not tree.selection: return # key pressed event
tree.ShowTestWindow(tree.selection)
def OnTestHide(self, evt):
tree.CloseTestWindow()
# Find object by relative position
def FindObject(self, item, obj):
# We simply perform depth-first traversal, sinse it's too much
# hassle to deal with all sizer/window combinations
w = tree.FindNodeObject(item)
if w == obj or isinstance(w, wx.GBSizerItem) and w.GetWindow() == obj:
return item
if tree.ItemHasChildren(item):
child = tree.GetFirstChild(item)[0]
while child:
found = self.FindObject(child, obj)
if found: return found
child = tree.GetNextSibling(child)
return None
def OnTestWinLeftDown(self, evt):
pos = evt.GetPosition()
self.SetHandler(g.testWin)
g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN)
item = self.FindObject(g.testWin.item, evt.GetEventObject())
if item:
tree.EnsureVisible(item)
tree.SelectItem(item)
self.tb.ToggleTool(self.ID_TOOL_LOCATE, False)
if item:
self.SetStatusText('Selected %s' % tree.GetItemText(item))
else:
self.SetStatusText('Locate failed!')
def SetHandler(self, w, h=None):
if h:
w.SetEventHandler(h)
w.SetCursor(wx.CROSS_CURSOR)
else:
w.SetEventHandler(w)
w.SetCursor(wx.NullCursor)
for ch in w.GetChildren():
self.SetHandler(ch, h)
def OnLocate(self, evt):
if g.testWin:
if evt.GetId() == self.ID_LOCATE or \
evt.GetId() == self.ID_TOOL_LOCATE and evt.IsChecked():
self.SetHandler(g.testWin, g.testWin)
g.testWin.Connect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN, self.OnTestWinLeftDown)
if evt.GetId() == self.ID_LOCATE:
self.tb.ToggleTool(self.ID_TOOL_LOCATE, True)
elif evt.GetId() == self.ID_TOOL_LOCATE and not evt.IsChecked():
self.SetHandler(g.testWin, None)
g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN)
self.SetStatusText('Click somewhere in your test window now')
def OnRefresh(self, evt):
# If modified, apply first
selection = tree.selection
if selection:
xxx = tree.GetPyData(selection)
if xxx and panel.IsModified():
tree.Apply(xxx, selection)
if g.testWin:
# (re)create
tree.CreateTestWin(g.testWin.item)
panel.modified = False
tree.needUpdate = False
def OnAutoRefresh(self, evt):
conf.autoRefresh = evt.IsChecked()
self.menuBar.Check(self.ID_AUTO_REFRESH, conf.autoRefresh)
self.tb.ToggleTool(self.ID_AUTO_REFRESH, conf.autoRefresh)
def OnAbout(self, evt):
str = '''\
XRCed version %s
(c) Roman Rolinsky <rollrom@users.sourceforge.net>
Homepage: http://xrced.sourceforge.net\
''' % version
dlg = wx.MessageDialog(self, str, 'About XRCed', wx.OK | wx.CENTRE)
dlg.ShowModal()
dlg.Destroy()
def OnReadme(self, evt):
text = open(os.path.join(basePath, 'README.txt'), 'r').read()
dlg = ScrolledMessageDialog(self, text, "XRCed README")
dlg.ShowModal()
dlg.Destroy()
# Simple emulation of python command line
def OnDebugCMD(self, evt):
while 1:
try:
exec raw_input('C:\> ')
except EOFError:
print '^D'
break
except:
(etype, value, tb) =sys.exc_info()
tblist =traceback.extract_tb(tb)[1:]
msg =' '.join(traceback.format_exception_only(etype, value)
+traceback.format_list(tblist))
print msg
def OnCreate(self, evt):
selected = tree.selection
if tree.ctrl: appendChild = False
else: appendChild = not tree.NeedInsert(selected)
xxx = tree.GetPyData(selected)
if not appendChild:
# If insert before
if tree.shift:
# If has previous item, insert after it, else append to parent
nextItem = selected
parentLeaf = tree.GetItemParent(selected)
else:
# If has next item, insert, else append to parent
nextItem = tree.GetNextSibling(selected)
parentLeaf = tree.GetItemParent(selected)
# Expanded container (must have children)
elif tree.shift and tree.IsExpanded(selected) \
and tree.GetChildrenCount(selected, False):
nextItem = tree.GetFirstChild(selected)[0]
parentLeaf = selected
else:
nextItem = wx.TreeItemId()
parentLeaf = selected
parent = tree.GetPyData(parentLeaf)
if parent.hasChild: parent = parent.child
# Create object_ref?
if evt.GetId() == ID_NEW.REF:
ref = wx.GetTextFromUser('Create reference to:', 'Create reference')
if not ref: return
xxx = MakeEmptyRefXXX(parent, ref)
else:
# Create empty element
className = pullDownMenu.createMap[evt.GetId()]
xxx = MakeEmptyXXX(parent, className)
# Set default name for top-level windows
if parent.__class__ == xxxMainNode:
cl = xxx.treeObject().__class__
frame.maxIDs[cl] += 1
xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl]))
# And for some other standard controls
elif parent.__class__ == xxxStdDialogButtonSizer:
xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0])
# We can even set label
obj = xxx.treeObject()
elem = g.tree.dom.createElement('label')
elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[evt.GetId()][1]))
obj.params['label'] = xxxParam(elem)
xxx.treeObject().element.appendChild(elem)
# Insert new node, register undo
elem = xxx.element
newItem = tree.InsertNode(parentLeaf, parent, elem, nextItem)
undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
tree.EnsureVisible(newItem)
tree.SelectItem(newItem)
if not tree.IsVisible(newItem):
tree.ScrollTo(newItem)
tree.Refresh()
# Update view?
if g.testWin and tree.IsHighlatable(newItem):
if conf.autoRefresh:
tree.needUpdate = True
tree.pendingHighLight = newItem
else:
tree.pendingHighLight = None
tree.SetFocus()
self.SetModified()
# Replace one object with another
def OnReplace(self, evt):
selected = tree.selection
xxx = tree.GetPyData(selected).treeObject()
elem = xxx.element
parent = elem.parentNode
undoMan.RegisterUndo(UndoReplace(selected))
# New class
className = pullDownMenu.createMap[evt.GetId() - 1000]
# Create temporary empty node (with default values)
dummy = MakeEmptyDOM(className)
if className == 'spacer' and xxx.className != 'spacer':
klass = xxxSpacer
elif xxx.className == 'spacer' and className != 'spacer':
klass = xxxSizerItem
else:
klass = xxxDict[className]
# Remove non-compatible children
if tree.ItemHasChildren(selected) and not klass.hasChildren:
tree.DeleteChildren(selected)
nodes = elem.childNodes[:]
tags = []
for node in nodes:
if node.nodeType != minidom.Node.ELEMENT_NODE: continue
remove = False
tag = node.tagName
if tag == 'object':
if not klass.hasChildren: remove = True
elif tag not in klass.allParams and \
(not klass.hasStyle or tag not in klass.styles):
remove = True
else:
tags.append(tag)
if remove:
elem.removeChild(node)
node.unlink()
# Remove sizeritem child if spacer
if className == 'spacer' and xxx.className != 'spacer':
sizeritem = elem.parentNode
assert sizeritem.getAttribute('class') == 'sizeritem'
sizeritem.removeChild(elem)
elem.unlink()
elem = sizeritem
tree.GetPyData(selected).hasChild = false
elif xxx.className == 'spacer' and className != 'spacer':
# Create sizeritem element
assert xxx.parent.isSizer
elem.setAttribute('class', 'sizeritem')
node = MakeEmptyDOM(className)
elem.appendChild(node)
# Replace to point to new object
xxx = xxxSizerItem(xxx.parent, elem)
elem = node
tree.SetPyData(selected, xxx)
xxx = xxx.child
else:
# Copy parameters present in dummy but not in elem
for node in dummy.childNodes:
if node.tagName not in tags: elem.appendChild(node.cloneNode(True))
dummy.unlink()
# Change class name
elem.setAttribute('class', className)
if elem.hasAttribute('subclass'):
elem.removeAttribute('subclass') # clear subclassing
# Re-create xxx element
xxx = MakeXXXFromDOM(xxx.parent, elem)
# Update parent in child objects
if tree.ItemHasChildren(selected):
i, cookie = tree.GetFirstChild(selected)
while i.IsOk():
x = tree.GetPyData(i)
x.parent = xxx
if x.hasChild: x.child.parent = xxx
i, cookie = tree.GetNextChild(selected, cookie)
# Update tree
if tree.GetPyData(selected).hasChild: # child container
container = tree.GetPyData(selected)
container.child = xxx
container.hasChildren = xxx.hasChildren
container.isSizer = xxx.isSizer
xxx = container
else:
tree.SetPyData(selected, xxx)
tree.SetItemText(selected, xxx.treeName())
tree.SetItemImage(selected, xxx.treeImage())
# Set default name for top-level windows
if parent.__class__ == xxxMainNode:
cl = xxx.treeObject().__class__
frame.maxIDs[cl] += 1
xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl]))
# Update panel
g.panel.SetData(xxx)
# Update tools
g.tools.UpdateUI()
#undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
# Update view?
if g.testWin and tree.IsHighlatable(selected):
if conf.autoRefresh:
tree.needUpdate = True
tree.pendingHighLight = selected
else:
tree.pendingHighLight = None
tree.SetFocus()
self.SetModified()
# Expand/collapse subtree
def OnExpand(self, evt):
if tree.selection: tree.ExpandAll(tree.selection)
else: tree.ExpandAll(tree.root)
def OnCollapse(self, evt):
if tree.selection: tree.CollapseAll(tree.selection)
else: tree.CollapseAll(tree.root)
def OnPullDownHighlight(self, evt):
menuId = evt.GetMenuId()
if menuId != -1:
menu = evt.GetEventObject()
help = menu.GetHelpString(menuId)
self.SetStatusText(help)
else:
self.SetStatusText('')
def OnUpdateUI(self, evt):
if evt.GetId() in [wx.ID_CUT, wx.ID_COPY, self.ID_DELETE]:
evt.Enable(tree.selection is not None and tree.selection != tree.root)
elif evt.GetId() == wx.ID_SAVE:
evt.Enable(self.modified)
elif evt.GetId() in [wx.ID_PASTE, self.ID_TOOL_PASTE]:
evt.Enable(tree.selection is not None)
elif evt.GetId() == self.ID_TEST:
evt.Enable(tree.selection is not None and tree.selection != tree.root)
elif evt.GetId() in [self.ID_LOCATE, self.ID_TOOL_LOCATE]:
evt.Enable(g.testWin is not None)
elif evt.GetId() == wx.ID_UNDO: evt.Enable(undoMan.CanUndo())
elif evt.GetId() == wx.ID_REDO: evt.Enable(undoMan.CanRedo())
def OnIdle(self, evt):
if self.inIdle: return # Recursive call protection
self.inIdle = True
try:
if tree.needUpdate:
if conf.autoRefresh:
if g.testWin:
self.SetStatusText('Refreshing test window...')
# (re)create
tree.CreateTestWin(g.testWin.item)
self.SetStatusText('')
tree.needUpdate = False
elif tree.pendingHighLight:
try:
tree.HighLight(tree.pendingHighLight)
except:
# Remove highlight if any problem
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -