diff --git a/direct/src/leveleditor/ActionMgr.py b/direct/src/leveleditor/ActionMgr.py index a890b94965..48db2a127a 100755 --- a/direct/src/leveleditor/ActionMgr.py +++ b/direct/src/leveleditor/ActionMgr.py @@ -170,6 +170,21 @@ class ActionDeleteObj(ActionBase): self.hierarchy = {} self.objInfos = {} +class ActionChangeHierarchy(ActionBase): + """ Action class for changing Scene Graph Hierarchy """ + + def __init__(self, editor, oldGrandParentId, oldParentId, newParentId, childName, *args, **kargs): + self.editor = editor + self.oldGrandParentId = oldGrandParentId + self.oldParentId = oldParentId + self.newParentId = newParentId + self.childName = childName + function = self.editor.ui.sceneGraphUI.parent + ActionBase.__init__(self, function, self.oldParentId, self.newParentId, self.childName, **kargs) + + def undo(self): + self.editor.ui.sceneGraphUI.parent(self.oldParentId, self.oldGrandParentId, self.childName) + class ActionSelectObj(ActionBase): """ Action class for adding new object """ diff --git a/direct/src/leveleditor/ObjectMgr.py b/direct/src/leveleditor/ObjectMgr.py index 08919438b8..e86967e948 100755 --- a/direct/src/leveleditor/ObjectMgr.py +++ b/direct/src/leveleditor/ObjectMgr.py @@ -26,7 +26,7 @@ class ObjectMgr: self.currNodePath = None def reset(self): - self.deselectAllCB() + base.direct.deselectAllCB() for id in self.objects.keys(): self.objects[id][OG.OBJ_NP].removeNode() diff --git a/direct/src/leveleditor/SceneGraphUI.py b/direct/src/leveleditor/SceneGraphUI.py index 86b019c472..c3a9f0a3ec 100755 --- a/direct/src/leveleditor/SceneGraphUI.py +++ b/direct/src/leveleditor/SceneGraphUI.py @@ -4,6 +4,7 @@ Defines Scene Graph tree UI import wx import cPickle as pickle from pandac.PandaModules import * +from ActionMgr import * import ObjectGlobals as OG @@ -102,20 +103,6 @@ class SceneGraphUI(wx.Panel): 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: @@ -131,7 +118,7 @@ class SceneGraphUI(wx.Panel): if parentObj is None: parent = self.root else: - parent = self.getTreeItem(self.root, parentObj[OG.OBJ_UID]) + parent = self.traverse(self.root, parentObj[OG.OBJ_UID]) namestr = "%s_%s"%(obj[OG.OBJ_DEF].name, obj[OG.OBJ_UID]) newItem = self.tree.AppendItem(parent, namestr) @@ -143,8 +130,6 @@ class SceneGraphUI(wx.Panel): 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 @@ -167,9 +152,7 @@ class SceneGraphUI(wx.Panel): item, cookie = self.tree.GetNextChild(parent, cookie) return None - def reParent(self, parent, newParent): - #import pdb;set_trace() - + def reParentTree(self, parent, newParent): # main loop - iterating over item's children item, cookie = self.tree.GetFirstChild(parent) while item: @@ -181,48 +164,65 @@ class SceneGraphUI(wx.Panel): # if an item had children, we need to re-parent them as well if self.tree.ItemHasChildren(item): # recursing... - self.reParent(item, newItem) + self.reParentTree(item, newItem) # continue iteration to the next child item, cookie = self.tree.GetNextChild(parent, cookie) + def reParentData(self, parent, child): + child.wrtReparentTo(parent) + + def reParent(self, oldParent, newParent, child): + if newParent is None: + newParent = self.root + itemId = self.tree.GetItemPyData(oldParent) + newItem = self.tree.AppendItem(newParent, child) + self.tree.SetItemPyData(newItem, itemId) + self.reParentTree(oldParent, newItem) + + obj = self.editor.objectMgr.findObjectById(itemId) + itemId = self.tree.GetItemPyData(newParent) + if itemId != "render": + newParentObj = self.editor.objectMgr.findObjectById(itemId) + self.reParentData(newParentObj[OG.OBJ_NP], obj[OG.OBJ_NP]) + else: + self.reParentData(render, obj[OG.OBJ_NP]) + + self.tree.Delete(oldParent) + if self.shouldShowPandaObjChildren: + self.removePandaObjectChildren(oldParent) + self.addPandaObjectChildren(oldParent) + self.removePandaObjectChildren(newParent) + self.addPandaObjectChildren(newpParent) + + def isChildOrGrandChild(self, parent, child): + childId = self.tree.GetItemPyData(child) + return self.traverse(parent, childId) + def changeHierarchy(self, data, x, y): itemText = data.split('_') itemId = itemText[-1] # uid is the last token - parent = self.tree.GetRootItem() - item = self.traverse(parent, itemId) + item = self.traverse(self.tree.GetRootItem(), 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) + if dragToItem == item: + return + if self.isChildOrGrandChild(item, dragToItem): + return - 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) + # undo function setup... + action = ActionChangeHierarchy(self.editor, self.tree.GetItemPyData(self.tree.GetItemParent(item)), self.tree.GetItemPyData(item), self.tree.GetItemPyData(dragToItem), data) + self.editor.actionMgr.push(action) + action() + def parent(self, oldParentId, newParentId, childName): + oldParent = self.traverse(self.tree.GetRootItem(), oldParentId) + newParent = self.traverse(self.tree.GetRootItem(), newParentId) + self.reParent(oldParent, newParent, childName) def showPandaObjectChildren(self): itemList = list()