diff --git a/direct/src/leveleditor/LevelEditorBase.py b/direct/src/leveleditor/LevelEditorBase.py index afac3e1459..6150efcff5 100755 --- a/direct/src/leveleditor/LevelEditorBase.py +++ b/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() diff --git a/direct/src/leveleditor/ObjectMgr.py b/direct/src/leveleditor/ObjectMgr.py index 9ac41f3d8e..90d98ce3e7 100755 --- a/direct/src/leveleditor/ObjectMgr.py +++ b/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() diff --git a/direct/src/leveleditor/ObjectPaletteUI.py b/direct/src/leveleditor/ObjectPaletteUI.py index 2fd5330151..a7ea06f6d2 100755 --- a/direct/src/leveleditor/ObjectPaletteUI.py +++ b/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() diff --git a/direct/src/leveleditor/SceneGraphUI.py b/direct/src/leveleditor/SceneGraphUI.py index f9876568dc..86b019c472 100755 --- a/direct/src/leveleditor/SceneGraphUI.py +++ b/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()