Browse Source

a better way to select

Arkady Trestman 16 years ago
parent
commit
15cc76a5fc
1 changed files with 258 additions and 258 deletions
  1. 258 258
      direct/src/leveleditor/SceneGraphUI.py

+ 258 - 258
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)