Browse Source

added suport for multi selections, and object deletions in the sceneGraphUI

Arkady Trestman 16 years ago
parent
commit
a8e0db164a

+ 15 - 3
direct/src/leveleditor/LevelEditorBase.py

@@ -110,7 +110,7 @@ class LevelEditorBase(DirectObject):
             # Node path events
             ('DIRECT-delete', self.handleDelete),
             ('preRemoveNodePath', self.removeNodePathHook),
-            ('DIRECT_selectedNodePath_fMulti_fTag', self.selectedNodePathHook),
+            ('DIRECT_selectedNodePath_fMulti_fTag_fLEPane', self.selectedNodePathHook),
             ('DIRECT_deselectedNodePath', self.deselectAll),
             ('DIRECT_deselectAll', self.deselectAll),
             ('LE-Undo', self.actionMgr.undo),
@@ -142,9 +142,15 @@ class LevelEditorBase(DirectObject):
             base.direct.selected.last = None
 
     def handleDelete(self):
+        oldSelectedNPs = base.direct.selected.getSelectedAsList()
+        for oldNP in oldSelectedNPs:
+            obj = self.objectMgr.findObjectByNodePath(oldNP)
+            if obj:
+               self.ui.sceneGraphUI.delete(obj[OG.OBJ_UID])
         action = ActionDeleteObj(self)
         self.actionMgr.push(action)
         action()
+
 ##         reply = wx.MessageBox("Do you want to delete selected?", "Delete?",
 ##                               wx.YES_NO | wx.ICON_QUESTION)
 ##         if reply == wx.YES:
@@ -159,13 +165,19 @@ class LevelEditorBase(DirectObject):
 ##             coa = Vec3(row[0], row[1], row[2])
 ##             base.direct.cameraControl.updateCoa(coa)
 
-    def selectedNodePathHook(self, nodePath, fMultiSelect = 0, fSelectTag = 1):
+    def selectedNodePathHook(self, nodePath, fMultiSelect = 0, fSelectTag = 1, fLEPane = 0):
         # handle unpickable nodepath
         if nodePath.getName() in base.direct.iRay.unpickable:
             base.direct.deselect(nodePath)
             return
 
-        self.objectMgr.selectObject(nodePath)
+        if fMultiSelect == 0 and fLEPane == 0:
+           oldSelectedNPs = base.direct.selected.getSelectedAsList()
+           for oldNP in oldSelectedNPs:
+              obj = self.objectMgr.findObjectByNodePath(oldNP)
+              if obj:
+                 self.ui.sceneGraphUI.deSelect(obj[OG.OBJ_UID])
+        self.objectMgr.selectObject(nodePath, fLEPane)
 
     def deselectAll(self, np=None):
         self.objectMgr.deselectAll()

+ 6 - 2
direct/src/leveleditor/ObjectMgr.py

@@ -174,8 +174,9 @@ class ObjectMgr:
         self.currNodePath = None
         taskMgr.remove('_le_updateObjectUITask')
         self.editor.ui.objectPropertyUI.clearPropUI()
+        self.editor.ui.sceneGraphUI.tree.UnselectAll()
 
-    def selectObject(self, nodePath):
+    def selectObject(self, nodePath, fLEPane=0):
         obj = self.findObjectByNodePath(nodePath)
         if obj is None:
             return
@@ -184,6 +185,9 @@ class ObjectMgr:
         # [gjeon] to connect transform UI with nodepath's transform
         self.spawnUpdateObjectUITask()
         self.updateObjectPropertyUI(obj)
+        #import pdb;pdb.set_trace()
+        if fLEPane == 0:
+           self.editor.ui.sceneGraphUI.select(obj[OG.OBJ_UID])
 
     def updateObjectPropertyUI(self, obj):
         objDef = obj[OG.OBJ_DEF]
@@ -192,7 +196,7 @@ class ObjectMgr:
 
     def onEnterObjectPropUI(self, event):
         taskMgr.remove('_le_updateObjectUITask')        
-        
+
     def onLeaveObjectPropUI(self, event):
         self.spawnUpdateObjectUITask()
         

+ 2 - 4
direct/src/leveleditor/ObjectPaletteUI.py

@@ -71,10 +71,8 @@ class ObjectPaletteUI(wx.Panel):
                newItem = self.addTreeNode(key, parentItem, items)
 
     def onSelected(self, event):
-        data = self.tree.GetItemPyData(event.GetItem())
-        if data:
-            print data.properties
-
+        pass
+        
     def onBeginDrag(self, event):
         item = event.GetItem()
 

+ 26 - 3
direct/src/leveleditor/SceneGraphUI.py

@@ -22,7 +22,9 @@ class SceneGraphUI(wx.Panel):
         wx.Panel.__init__(self, parent)
 
         self.editor = editor
-        self.tree = wx.TreeCtrl(self)
+        self.tree = wx.TreeCtrl(self, id=-1, pos=wx.DefaultPosition,
+                  size=wx.DefaultSize, style=wx.TR_MULTIPLE|wx.TR_DEFAULT_STYLE,
+                  validator=wx.DefaultValidator, name="treeCtrl")
         self.root = self.tree.AddRoot('render')
         self.tree.SetItemPyData(self.root, "render")
 
@@ -175,7 +177,7 @@ class SceneGraphUI(wx.Panel):
            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...
@@ -239,12 +241,33 @@ class SceneGraphUI(wx.Panel):
                 self.removePandaObjectChildren(item)
              # continue iteration to the next child
 
+    def delete(self, itemId):
+        item = self.traverse(self.root, itemId)
+        if item:
+           self.tree.UnselectItem(item)
+           self.tree.Delete(item)
+
+    def select(self, itemId):
+        item = self.traverse(self.root, itemId)
+        if item:
+           if not self.tree.IsSelected(item):
+              self.tree.SelectItem(item)
+
+    def deSelect(self, itemId):
+        item =  self.traverse(self.root, itemId)
+        if item is not None:
+           self.tree.UnselectItem(item)
+
     def onSelected(self, event):
         itemId = self.tree.GetItemPyData(event.GetItem())
         if itemId:
             obj = self.editor.objectMgr.findObjectById(itemId);
             if obj:
-                base.direct.select(obj[OG.OBJ_NP])
+                selections = self.tree.GetSelections()
+                if len(selections) > 1:
+                   base.direct.select(obj[OG.OBJ_NP], fMultiSelect = 1, fLEPane = 0)
+                else:
+                   base.direct.select(obj[OG.OBJ_NP], fMultiSelect = 0, fLEPane = 0)
 
     def onBeginDrag(self, event):
         item = event.GetItem()