fixed a problem with hierarchy loading from file

This commit is contained in:
Arkady Trestman 2009-11-11 02:37:44 +00:00
parent 3c05002019
commit ca32727cc5

View File

@ -24,6 +24,7 @@ class SceneGraphUI(wx.Panel):
self.editor = editor self.editor = editor
self.tree = wx.TreeCtrl(self) self.tree = wx.TreeCtrl(self)
self.root = self.tree.AddRoot('render') self.root = self.tree.AddRoot('render')
self.tree.SetItemPyData(self.root, "render")
self.shouldShowPandaObjChildren = False self.shouldShowPandaObjChildren = False
@ -40,6 +41,17 @@ class SceneGraphUI(wx.Panel):
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.onSelected) self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.onSelected)
self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onBeginDrag) 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): def traversePandaObjects(self, parent, objNodePath):
itemId = self.tree.GetItemPyData(parent) itemId = self.tree.GetItemPyData(parent)
i = 0 i = 0
@ -56,6 +68,8 @@ class SceneGraphUI(wx.Panel):
def addPandaObjectChildren(self, parent): def addPandaObjectChildren(self, parent):
# first, find Panda Object's NodePath of the item # first, find Panda Object's NodePath of the item
itemId = self.tree.GetItemPyData(parent) itemId = self.tree.GetItemPyData(parent)
if itemId == "render":
return
obj = self.editor.objectMgr.findObjectById(itemId) obj = self.editor.objectMgr.findObjectById(itemId)
if obj is None: if obj is None:
return return
@ -72,6 +86,8 @@ class SceneGraphUI(wx.Panel):
def removePandaObjectChildren(self, parent): def removePandaObjectChildren(self, parent):
# first, find Panda Object's NodePath of the item # first, find Panda Object's NodePath of the item
itemId = self.tree.GetItemPyData(parent) itemId = self.tree.GetItemPyData(parent)
if itemId == "render":
return
obj = self.editor.objectMgr.findObjectById(itemId) obj = self.editor.objectMgr.findObjectById(itemId)
if obj is None: if obj is None:
self.tree.Delete(parent) self.tree.Delete(parent)
@ -84,18 +100,39 @@ class SceneGraphUI(wx.Panel):
item, cookie = self.tree.GetNextChild(parent, cookie) item, cookie = self.tree.GetNextChild(parent, cookie)
self.removePandaObjectChildren(itemToRemove) self.removePandaObjectChildren(itemToRemove)
def add(self, item, parentName = None): def getTreeItem(self, parent, itemId):
# import pdb;pdb.set_trace() 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: if item is None:
return return
obj = self.editor.objectMgr.findObjectByNodePath(NodePath(item)) obj = self.editor.objectMgr.findObjectByNodePath(NodePath(item))
if obj is None: if obj is None:
print "During adding to SceneGraphUI couldn't find obj..."
return 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]) namestr = "%s_%s"%(obj[OG.OBJ_DEF].name, obj[OG.OBJ_UID])
print "Adding as result of a drag'n'drop %s..." % repr(namestr) newItem = self.tree.AppendItem(parent, namestr)
newItem = self.tree.AppendItem(self.root, namestr)
self.tree.SetItemPyData(newItem, obj[OG.OBJ_UID]) self.tree.SetItemPyData(newItem, obj[OG.OBJ_UID])
# adding children of PandaObj # adding children of PandaObj
@ -113,17 +150,12 @@ class SceneGraphUI(wx.Panel):
# main loop - serching for an item with an itemId # main loop - serching for an item with an itemId
item, cookie = self.tree.GetFirstChild(parent) item, cookie = self.tree.GetFirstChild(parent)
while item: while item:
print "in traverse, looping - if %s==%s" %(itemId, self.tree.GetItemPyData(item))
# if the item was found - return it # if the item was found - return it
if itemId == self.tree.GetItemPyData(item): if itemId == self.tree.GetItemPyData(item):
print "traverse found %s..." % repr(self.tree.GetItemText(item))
return item return item
# the tem was not found - checking if it has children # the tem was not found - checking if it has children
if self.tree.ItemHasChildren(item): if self.tree.ItemHasChildren(item):
print "in traverse, item=%s has a child" %repr(self.tree.GetItemPyData(item))
# item has children - delving into it # item has children - delving into it
child = self.traverse(item, itemId) child = self.traverse(item, itemId)
if child is not None: if child is not None:
@ -131,13 +163,10 @@ class SceneGraphUI(wx.Panel):
# continue iteration to the next child # continue iteration to the next child
item, cookie = self.tree.GetNextChild(parent, cookie) item, cookie = self.tree.GetNextChild(parent, cookie)
print "traverse didn't find anything..."
return None return None
def reParent(self, parent, newParent): def reParent(self, parent, newParent):
#import pdb;set_trace() #import pdb;set_trace()
print "in reParent for %s..." %repr(self.tree.GetItemText(parent))
# main loop - iterating over item's children # main loop - iterating over item's children
item, cookie = self.tree.GetFirstChild(parent) item, cookie = self.tree.GetFirstChild(parent)
@ -149,8 +178,6 @@ class SceneGraphUI(wx.Panel):
# if an item had children, we need to re-parent them as well # if an item had children, we need to re-parent them as well
if self.tree.ItemHasChildren(item): if self.tree.ItemHasChildren(item):
print "in reParent item=%s has children..." %repr(self.tree.GetItemText(item))
# recursing... # recursing...
self.reParent(item, newItem) self.reParent(item, newItem)
@ -158,8 +185,6 @@ class SceneGraphUI(wx.Panel):
item, cookie = self.tree.GetNextChild(parent, cookie) item, cookie = self.tree.GetNextChild(parent, cookie)
def changeHierarchy(self, data, x, y): def changeHierarchy(self, data, x, y):
print "Changing hierarchy for %s..." % repr(data)
itemText = data.split('_') itemText = data.split('_')
itemId = itemText[1] itemId = itemText[1]
parent = self.tree.GetRootItem() parent = self.tree.GetRootItem()
@ -168,25 +193,31 @@ class SceneGraphUI(wx.Panel):
return return
dragToItem, flags = self.tree.HitTest(wx.Point(x, y)) dragToItem, flags = self.tree.HitTest(wx.Point(x, y))
print "dragToItem=%s" %repr(dragToItem)
if dragToItem.IsOk(): if dragToItem.IsOk():
# prevent draging into itself # prevent draging into itself
if dragToItem == item: if dragToItem == item:
return return
print "About to AppendItem %s" %data
newItem = self.tree.AppendItem(dragToItem, data) newItem = self.tree.AppendItem(dragToItem, data)
self.tree.SetItemPyData(newItem, itemId) self.tree.SetItemPyData(newItem, itemId)
self.reParent(item, newItem) self.reParent(item, newItem)
oldParent = self.tree.GetItemParent(item)
self.tree.Delete(item) self.tree.Delete(item)
obj = self.editor.objectMgr.findObjectById(itemId) obj = self.editor.objectMgr.findObjectById(itemId)
dragToItemObj = self.editor.objectMgr.findObjectById(self.tree.GetItemPyData(dragToItem)) itemId = self.tree.GetItemPyData(dragToItem)
dragToItemObj = None
if itemId != "render":
dragToItemObj = self.editor.objectMgr.findObjectById(itemId)
objNodePath = obj[OG.OBJ_NP] objNodePath = obj[OG.OBJ_NP]
dragToItemObjNodePath = dragToItemObj[OG.OBJ_NP] if dragToItemObj is None:
objNodePath.wrtReparentTo(dragToItemObjNodePath) objNodePath.wrtReparentTo(render)
else:
objNodePath.wrtReparentTo(dragToItemObj[OG.OBJ_NP])
if self.shouldShowPandaObjChildren: if self.shouldShowPandaObjChildren:
self.removePandaObjectChildren(oldParent)
self.addPandaObjectChildren(oldParent)
self.removePandaObjectChildren(dragToItem) self.removePandaObjectChildren(dragToItem)
self.addPandaObjectChildren(dragToItem) self.addPandaObjectChildren(dragToItem)