mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
added suport for multi selections, and object deletions in the sceneGraphUI
This commit is contained in:
parent
055af9db0b
commit
a8e0db164a
@ -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()
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user