diff --git a/direct/src/leveleditor/SceneGraphUI.py b/direct/src/leveleditor/SceneGraphUI.py index 7aebe416e8..d1e823b8d3 100755 --- a/direct/src/leveleditor/SceneGraphUI.py +++ b/direct/src/leveleditor/SceneGraphUI.py @@ -1,258 +1,258 @@ -""" -Defines Scene Graph tree UI -""" -import wx -import cPickle as pickle -from pandac.PandaModules import * - -import ObjectGlobals as OG - -class SceneGraphUIDropTarget(wx.TextDropTarget): - def __init__(self, editor): - print "in SceneGraphUIDropTarget::init..." - wx.TextDropTarget.__init__(self) - self.editor = editor - - def OnDropText(self, x, y, text): - print "in SceneGraphUIDropTarget::OnDropText..." - self.editor.ui.sceneGraphUI.changeHierarchy(text, x, y) - -class SceneGraphUI(wx.Panel): - def __init__(self, parent, editor): - wx.Panel.__init__(self, parent) - - self.editor = editor - self.tree = wx.TreeCtrl(self) - self.root = self.tree.AddRoot('render') - self.tree.SetItemPyData(self.root, "render") - - self.shouldShowPandaObjChildren = False - - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(self.tree, 1, wx.EXPAND, 0) - self.SetSizer(sizer); self.Layout() - - parentSizer = wx.BoxSizer(wx.VERTICAL) - parentSizer.Add(self, 1, wx.EXPAND, 0) - parent.SetSizer(parentSizer); parent.Layout() - - parent.SetDropTarget(SceneGraphUIDropTarget(self.editor)) - - self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.onSelected) - self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onBeginDrag) - - def reset(self): - #import pdb;set_trace() - itemList = list() - item, cookie = self.tree.GetFirstChild(self.root) - while item: - itemList.append(item) - item, cookie = self.tree.GetNextChild(self.root, cookie) - - for item in itemList: - self.tree.Delete(item) - - def traversePandaObjects(self, parent, objNodePath): - itemId = self.tree.GetItemPyData(parent) - i = 0 - for child in objNodePath.getChildren(): - namestr = "%s.%s"%(child.node().getType(), child.node().getName()) - newItem = self.tree.PrependItem(parent, namestr) - newItemId = "%s.%s"%(itemId, i) - self.tree.SetItemPyData(newItem, newItemId) - - # recursing... - self.traversePandaObjects(newItem, child) - i = i + 1 - - def addPandaObjectChildren(self, parent): - # first, find Panda Object's NodePath of the item - itemId = self.tree.GetItemPyData(parent) - if itemId == "render": - return - obj = self.editor.objectMgr.findObjectById(itemId) - if obj is None: - return - - objNodePath = obj[OG.OBJ_NP] - self.traversePandaObjects(parent, objNodePath) - - item, cookie = self.tree.GetFirstChild(parent) - while item: - # recursing... - self.addPandaObjectChildren(item) - item, cookie = self.tree.GetNextChild(parent, cookie) - - def removePandaObjectChildren(self, parent): - # first, find Panda Object's NodePath of the item - itemId = self.tree.GetItemPyData(parent) - if itemId == "render": - return - obj = self.editor.objectMgr.findObjectById(itemId) - if obj is None: - self.tree.Delete(parent) - return - item, cookie = self.tree.GetFirstChild(parent) - while item: - # recurse... - itemToRemove = item - # continue iteration to the next child - item, cookie = self.tree.GetNextChild(parent, cookie) - self.removePandaObjectChildren(itemToRemove) - - def getTreeItem(self, parent, itemId): - item, cookie = self.tree.GetFirstChild(parent) - while item: - if itemId == self.tree.GetItemPyData(item): - return item - child = None - if self.tree.ItemHasChildren(item): - child = self.getTreeItem(item, itemId) - if child is not None: - return child - # continue iteration to the next child - item, cookie = self.tree.GetNextChild(parent, cookie) - return None - - def add(self, item): - #import pdb;pdb.set_trace() - if item is None: - return - obj = self.editor.objectMgr.findObjectByNodePath(NodePath(item)) - if obj is None: - return - - parentNodePath = obj[OG.OBJ_NP].getParent() - parentObj = self.editor.objectMgr.findObjectByNodePath(parentNodePath) - - #import pdb;pdb.set_trace() - if parentObj is None: - parent = self.root - else: - parent = self.getTreeItem(self.root, parentObj[OG.OBJ_UID]) - - namestr = "%s_%s"%(obj[OG.OBJ_DEF].name, obj[OG.OBJ_UID]) - newItem = self.tree.AppendItem(parent, namestr) - self.tree.SetItemPyData(newItem, obj[OG.OBJ_UID]) - - # adding children of PandaObj - if self.shouldShowPandaObjChildren: - self.addPandaObjectChildren(newItem) - self.tree.Expand(self.root) - - def traverse(self, parent, itemId): - print "in traverse for itemId=%s..." %repr(itemId) - - # prevent from traversing into self - if itemId == self.tree.GetItemPyData(parent): - return None - - # main loop - serching for an item with an itemId - item, cookie = self.tree.GetFirstChild(parent) - while item: - # if the item was found - return it - if itemId == self.tree.GetItemPyData(item): - return item - - # the tem was not found - checking if it has children - if self.tree.ItemHasChildren(item): - # item has children - delving into it - child = self.traverse(item, itemId) - if child is not None: - return child - - # continue iteration to the next child - item, cookie = self.tree.GetNextChild(parent, cookie) - return None - - def reParent(self, parent, newParent): - #import pdb;set_trace() - - # main loop - iterating over item's children - item, cookie = self.tree.GetFirstChild(parent) - while item: - data = self.tree.GetItemText(item) - itemId = self.tree.GetItemPyData(item) - newItem = self.tree.AppendItem(newParent, data) - self.tree.SetItemPyData(newItem, itemId) - - # if an item had children, we need to re-parent them as well - if self.tree.ItemHasChildren(item): - # recursing... - self.reParent(item, newItem) - - # continue iteration to the next child - item, cookie = self.tree.GetNextChild(parent, cookie) - - def changeHierarchy(self, data, x, y): - itemText = data.split('_') - itemId = itemText[1] - parent = self.tree.GetRootItem() - item = self.traverse(parent, itemId) - if item is None: - return - - dragToItem, flags = self.tree.HitTest(wx.Point(x, y)) - if dragToItem.IsOk(): - # prevent draging into itself - if dragToItem == item: - return - newItem = self.tree.AppendItem(dragToItem, data) - self.tree.SetItemPyData(newItem, itemId) - self.reParent(item, newItem) - oldParent = self.tree.GetItemParent(item) - self.tree.Delete(item) - - obj = self.editor.objectMgr.findObjectById(itemId) - itemId = self.tree.GetItemPyData(dragToItem) - dragToItemObj = None - if itemId != "render": - dragToItemObj = self.editor.objectMgr.findObjectById(itemId) - - objNodePath = obj[OG.OBJ_NP] - if dragToItemObj is None: - objNodePath.wrtReparentTo(render) - else: - objNodePath.wrtReparentTo(dragToItemObj[OG.OBJ_NP]) - - if self.shouldShowPandaObjChildren: - self.removePandaObjectChildren(oldParent) - self.addPandaObjectChildren(oldParent) - self.removePandaObjectChildren(dragToItem) - self.addPandaObjectChildren(dragToItem) - - - def showPandaObjectChildren(self): - itemList = list() - self.shouldShowPandaObjChildren = not self.shouldShowPandaObjChildren - - item, cookie = self.tree.GetFirstChild(self.root) - while item: - itemList.append(item) - item, cookie = self.tree.GetNextChild(self.root, cookie) - - #import pdb;set_trace() - for item in itemList: - if self.shouldShowPandaObjChildren: - self.addPandaObjectChildren(item) - else: - self.removePandaObjectChildren(item) - # continue iteration to the next child - - def onSelected(self, event): - itemId = self.tree.GetItemPyData(event.GetItem()) - if itemId: - obj = self.editor.objectMgr.findObjectById(itemId); - self.editor.objectMgr.selectObject(obj[OG.OBJ_NP]) - - def onBeginDrag(self, event): - item = event.GetItem() - - if item != self.tree.GetRootItem(): # prevent dragging root item - text = self.tree.GetItemText(item) - print "Starting SceneGraphUI drag'n'drop with %s..." % repr(text) - - tdo = wx.TextDataObject(text) - tds = wx.DropSource(self.tree) - tds.SetData(tdo) - tds.DoDragDrop(True) +""" +Defines Scene Graph tree UI +""" +import wx +import cPickle as pickle +from pandac.PandaModules import * + +import ObjectGlobals as OG + +class SceneGraphUIDropTarget(wx.TextDropTarget): + def __init__(self, editor): + print "in SceneGraphUIDropTarget::init..." + wx.TextDropTarget.__init__(self) + self.editor = editor + + def OnDropText(self, x, y, text): + print "in SceneGraphUIDropTarget::OnDropText..." + self.editor.ui.sceneGraphUI.changeHierarchy(text, x, y) + +class SceneGraphUI(wx.Panel): + def __init__(self, parent, editor): + wx.Panel.__init__(self, parent) + + self.editor = editor + self.tree = wx.TreeCtrl(self) + self.root = self.tree.AddRoot('render') + self.tree.SetItemPyData(self.root, "render") + + self.shouldShowPandaObjChildren = False + + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.tree, 1, wx.EXPAND, 0) + self.SetSizer(sizer); self.Layout() + + parentSizer = wx.BoxSizer(wx.VERTICAL) + parentSizer.Add(self, 1, wx.EXPAND, 0) + parent.SetSizer(parentSizer); parent.Layout() + + parent.SetDropTarget(SceneGraphUIDropTarget(self.editor)) + + self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.onSelected) + self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onBeginDrag) + + def reset(self): + #import pdb;set_trace() + itemList = list() + item, cookie = self.tree.GetFirstChild(self.root) + while item: + itemList.append(item) + item, cookie = self.tree.GetNextChild(self.root, cookie) + + for item in itemList: + self.tree.Delete(item) + + def traversePandaObjects(self, parent, objNodePath): + itemId = self.tree.GetItemPyData(parent) + i = 0 + for child in objNodePath.getChildren(): + namestr = "%s.%s"%(child.node().getType(), child.node().getName()) + newItem = self.tree.PrependItem(parent, namestr) + newItemId = "%s.%s"%(itemId, i) + self.tree.SetItemPyData(newItem, newItemId) + + # recursing... + self.traversePandaObjects(newItem, child) + i = i + 1 + + def addPandaObjectChildren(self, parent): + # first, find Panda Object's NodePath of the item + itemId = self.tree.GetItemPyData(parent) + if itemId == "render": + return + obj = self.editor.objectMgr.findObjectById(itemId) + if obj is None: + return + + objNodePath = obj[OG.OBJ_NP] + self.traversePandaObjects(parent, objNodePath) + + item, cookie = self.tree.GetFirstChild(parent) + while item: + # recursing... + self.addPandaObjectChildren(item) + item, cookie = self.tree.GetNextChild(parent, cookie) + + def removePandaObjectChildren(self, parent): + # first, find Panda Object's NodePath of the item + itemId = self.tree.GetItemPyData(parent) + if itemId == "render": + return + obj = self.editor.objectMgr.findObjectById(itemId) + if obj is None: + self.tree.Delete(parent) + return + item, cookie = self.tree.GetFirstChild(parent) + while item: + # recurse... + itemToRemove = item + # continue iteration to the next child + item, cookie = self.tree.GetNextChild(parent, cookie) + self.removePandaObjectChildren(itemToRemove) + + def getTreeItem(self, parent, itemId): + item, cookie = self.tree.GetFirstChild(parent) + while item: + if itemId == self.tree.GetItemPyData(item): + return item + child = None + if self.tree.ItemHasChildren(item): + child = self.getTreeItem(item, itemId) + if child is not None: + return child + # continue iteration to the next child + item, cookie = self.tree.GetNextChild(parent, cookie) + return None + + def add(self, item): + #import pdb;pdb.set_trace() + if item is None: + return + obj = self.editor.objectMgr.findObjectByNodePath(NodePath(item)) + if obj is None: + return + + parentNodePath = obj[OG.OBJ_NP].getParent() + parentObj = self.editor.objectMgr.findObjectByNodePath(parentNodePath) + + #import pdb;pdb.set_trace() + if parentObj is None: + parent = self.root + else: + parent = self.getTreeItem(self.root, parentObj[OG.OBJ_UID]) + + namestr = "%s_%s"%(obj[OG.OBJ_DEF].name, obj[OG.OBJ_UID]) + newItem = self.tree.AppendItem(parent, namestr) + self.tree.SetItemPyData(newItem, obj[OG.OBJ_UID]) + + # adding children of PandaObj + if self.shouldShowPandaObjChildren: + self.addPandaObjectChildren(newItem) + self.tree.Expand(self.root) + + def traverse(self, parent, itemId): + print "in traverse for itemId=%s..." %repr(itemId) + + # prevent from traversing into self + if itemId == self.tree.GetItemPyData(parent): + return None + + # main loop - serching for an item with an itemId + item, cookie = self.tree.GetFirstChild(parent) + while item: + # if the item was found - return it + if itemId == self.tree.GetItemPyData(item): + return item + + # the tem was not found - checking if it has children + if self.tree.ItemHasChildren(item): + # item has children - delving into it + child = self.traverse(item, itemId) + if child is not None: + return child + + # continue iteration to the next child + item, cookie = self.tree.GetNextChild(parent, cookie) + return None + + def reParent(self, parent, newParent): + #import pdb;set_trace() + + # main loop - iterating over item's children + item, cookie = self.tree.GetFirstChild(parent) + while item: + data = self.tree.GetItemText(item) + itemId = self.tree.GetItemPyData(item) + newItem = self.tree.AppendItem(newParent, data) + self.tree.SetItemPyData(newItem, itemId) + + # if an item had children, we need to re-parent them as well + if self.tree.ItemHasChildren(item): + # recursing... + self.reParent(item, newItem) + + # continue iteration to the next child + item, cookie = self.tree.GetNextChild(parent, cookie) + + def changeHierarchy(self, data, x, y): + itemText = data.split('_') + itemId = itemText[1] + parent = self.tree.GetRootItem() + item = self.traverse(parent, itemId) + if item is None: + return + + dragToItem, flags = self.tree.HitTest(wx.Point(x, y)) + if dragToItem.IsOk(): + # prevent draging into itself + if dragToItem == item: + return + newItem = self.tree.AppendItem(dragToItem, data) + self.tree.SetItemPyData(newItem, itemId) + self.reParent(item, newItem) + oldParent = self.tree.GetItemParent(item) + self.tree.Delete(item) + + obj = self.editor.objectMgr.findObjectById(itemId) + itemId = self.tree.GetItemPyData(dragToItem) + dragToItemObj = None + if itemId != "render": + dragToItemObj = self.editor.objectMgr.findObjectById(itemId) + + objNodePath = obj[OG.OBJ_NP] + if dragToItemObj is None: + objNodePath.wrtReparentTo(render) + else: + objNodePath.wrtReparentTo(dragToItemObj[OG.OBJ_NP]) + + if self.shouldShowPandaObjChildren: + self.removePandaObjectChildren(oldParent) + self.addPandaObjectChildren(oldParent) + self.removePandaObjectChildren(dragToItem) + self.addPandaObjectChildren(dragToItem) + + + def showPandaObjectChildren(self): + itemList = list() + self.shouldShowPandaObjChildren = not self.shouldShowPandaObjChildren + + item, cookie = self.tree.GetFirstChild(self.root) + while item: + itemList.append(item) + item, cookie = self.tree.GetNextChild(self.root, cookie) + + #import pdb;set_trace() + for item in itemList: + if self.shouldShowPandaObjChildren: + self.addPandaObjectChildren(item) + else: + self.removePandaObjectChildren(item) + # continue iteration to the next child + + def onSelected(self, event): + itemId = self.tree.GetItemPyData(event.GetItem()) + if itemId: + obj = self.editor.objectMgr.findObjectById(itemId); + base.direct.select(obj[OG.OBJ_NP]) + + def onBeginDrag(self, event): + item = event.GetItem() + + if item != self.tree.GetRootItem(): # prevent dragging root item + text = self.tree.GetItemText(item) + print "Starting SceneGraphUI drag'n'drop with %s..." % repr(text) + + tdo = wx.TextDataObject(text) + tds = wx.DropSource(self.tree) + tds.SetData(tdo) + tds.DoDragDrop(True)