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

This commit is contained in:
Arkady Trestman 2010-02-06 02:13:33 +00:00
parent 055af9db0b
commit a8e0db164a
4 changed files with 49 additions and 12 deletions

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()