|
@@ -1,24 +1,6 @@
|
|
|
|
|
+from pandac.PandaModules import *
|
|
|
import ObjectGlobals as OG
|
|
import ObjectGlobals as OG
|
|
|
|
|
|
|
|
-class ActionBase(Functor):
|
|
|
|
|
- """ Base class for user actions """
|
|
|
|
|
-
|
|
|
|
|
- def __init__(self, function, *args, **kargs):
|
|
|
|
|
- Functor.__init__(self, function, *args, **kargs)
|
|
|
|
|
- self.result = None
|
|
|
|
|
-
|
|
|
|
|
- def _do__call__(self, *args, **kargs):
|
|
|
|
|
- self.saveStatus()
|
|
|
|
|
- self.result = Functor._do__call__(self, *args, **kargs)
|
|
|
|
|
- return self.result
|
|
|
|
|
-
|
|
|
|
|
- def saveStatus(self):
|
|
|
|
|
- # save object status for undo here
|
|
|
|
|
- pass
|
|
|
|
|
-
|
|
|
|
|
- def undo(self):
|
|
|
|
|
- print "undo method is not defined for this action"
|
|
|
|
|
-
|
|
|
|
|
class ActionMgr:
|
|
class ActionMgr:
|
|
|
def __init__(self):
|
|
def __init__(self):
|
|
|
self.undoList = []
|
|
self.undoList = []
|
|
@@ -35,6 +17,7 @@ class ActionMgr:
|
|
|
|
|
|
|
|
def push(self, action):
|
|
def push(self, action):
|
|
|
self.undoList.append(action)
|
|
self.undoList.append(action)
|
|
|
|
|
+ print 'current undoList', self.undoList
|
|
|
|
|
|
|
|
def undo(self):
|
|
def undo(self):
|
|
|
if len(self.undoList) < 1:
|
|
if len(self.undoList) < 1:
|
|
@@ -43,6 +26,7 @@ class ActionMgr:
|
|
|
action = self.undoList.pop()
|
|
action = self.undoList.pop()
|
|
|
self.redoList.append(action)
|
|
self.redoList.append(action)
|
|
|
action.undo()
|
|
action.undo()
|
|
|
|
|
+ print 'current redoList', self.redoList
|
|
|
|
|
|
|
|
def redo(self):
|
|
def redo(self):
|
|
|
if len(self.redoList) < 1:
|
|
if len(self.redoList) < 1:
|
|
@@ -50,7 +34,31 @@ class ActionMgr:
|
|
|
else:
|
|
else:
|
|
|
action = self.redoList.pop()
|
|
action = self.redoList.pop()
|
|
|
self.undoList.append(action)
|
|
self.undoList.append(action)
|
|
|
- action()
|
|
|
|
|
|
|
+ action.redo()
|
|
|
|
|
+ print 'current undoList', self.undoList
|
|
|
|
|
+
|
|
|
|
|
+class ActionBase(Functor):
|
|
|
|
|
+ """ Base class for user actions """
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, function, *args, **kargs):
|
|
|
|
|
+ Functor.__init__(self, function, *args, **kargs)
|
|
|
|
|
+ self.result = None
|
|
|
|
|
+
|
|
|
|
|
+ def _do__call__(self, *args, **kargs):
|
|
|
|
|
+ self.saveStatus()
|
|
|
|
|
+ self.result = Functor._do__call__(self, *args, **kargs)
|
|
|
|
|
+ return self.result
|
|
|
|
|
+
|
|
|
|
|
+ def redo(self):
|
|
|
|
|
+ self.result = self._do__call__()
|
|
|
|
|
+ return self.result
|
|
|
|
|
+
|
|
|
|
|
+ def saveStatus(self):
|
|
|
|
|
+ # save object status for undo here
|
|
|
|
|
+ pass
|
|
|
|
|
+
|
|
|
|
|
+ def undo(self):
|
|
|
|
|
+ print "undo method is not defined for this action"
|
|
|
|
|
|
|
|
class ActionAddNewObj(ActionBase):
|
|
class ActionAddNewObj(ActionBase):
|
|
|
""" Action class for adding new object """
|
|
""" Action class for adding new object """
|
|
@@ -59,11 +67,23 @@ class ActionAddNewObj(ActionBase):
|
|
|
self.editor = editor
|
|
self.editor = editor
|
|
|
function = self.editor.objectMgr.addNewObject
|
|
function = self.editor.objectMgr.addNewObject
|
|
|
ActionBase.__init__(self, function, *args, **kargs)
|
|
ActionBase.__init__(self, function, *args, **kargs)
|
|
|
|
|
+ self.uid = None
|
|
|
|
|
|
|
|
|
|
+ def redo(self):
|
|
|
|
|
+ if self.uid is None:
|
|
|
|
|
+ print "Can't redo this add"
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.result = self._do__call__(uid=self.uid)
|
|
|
|
|
+ return self.result
|
|
|
|
|
+
|
|
|
def undo(self):
|
|
def undo(self):
|
|
|
if self.result is None:
|
|
if self.result is None:
|
|
|
- print "Can't undo this"
|
|
|
|
|
|
|
+ print "Can't undo this add"
|
|
|
else:
|
|
else:
|
|
|
|
|
+ print "Undo: addNewObject"
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectByNodePath(self.result)
|
|
|
|
|
+ self.uid = obj[OG.OBJ_UID]
|
|
|
|
|
+ self.editor.ui.sceneGraphUI.delete(self.uid)
|
|
|
base.direct.deselect(self.result)
|
|
base.direct.deselect(self.result)
|
|
|
base.direct.removeNodePath(self.result)
|
|
base.direct.removeNodePath(self.result)
|
|
|
self.result = None
|
|
self.result = None
|
|
@@ -78,6 +98,7 @@ class ActionDeleteObj(ActionBase):
|
|
|
self.selectedUIDs = []
|
|
self.selectedUIDs = []
|
|
|
self.hierarchy = {}
|
|
self.hierarchy = {}
|
|
|
self.objInfos = {}
|
|
self.objInfos = {}
|
|
|
|
|
+ self.objTransforms = {}
|
|
|
|
|
|
|
|
def saveStatus(self):
|
|
def saveStatus(self):
|
|
|
selectedNPs = base.direct.selected.getSelectedAsList()
|
|
selectedNPs = base.direct.selected.getSelectedAsList()
|
|
@@ -89,6 +110,7 @@ class ActionDeleteObj(ActionBase):
|
|
|
self.selectedUIDs.append(uid)
|
|
self.selectedUIDs.append(uid)
|
|
|
objNP = obj[OG.OBJ_NP]
|
|
objNP = obj[OG.OBJ_NP]
|
|
|
self.objInfos[uid] = obj
|
|
self.objInfos[uid] = obj
|
|
|
|
|
+ self.objTransforms[uid] = objNP.getMat()
|
|
|
parentNP = objNP.getParent()
|
|
parentNP = objNP.getParent()
|
|
|
if parentNP == render:
|
|
if parentNP == render:
|
|
|
self.hierarchy[uid] = None
|
|
self.hierarchy[uid] = None
|
|
@@ -107,10 +129,12 @@ class ActionDeleteObj(ActionBase):
|
|
|
def undo(self):
|
|
def undo(self):
|
|
|
if len(self.hierarchy.keys()) == 0 or\
|
|
if len(self.hierarchy.keys()) == 0 or\
|
|
|
len(self.objInfos.keys()) == 0:
|
|
len(self.objInfos.keys()) == 0:
|
|
|
- print "Can't undo this"
|
|
|
|
|
|
|
+ print "Can't undo this deletion"
|
|
|
else:
|
|
else:
|
|
|
|
|
+ print "Undo: deleteObject"
|
|
|
def restoreObject(uid, parentNP):
|
|
def restoreObject(uid, parentNP):
|
|
|
obj = self.objInfos[uid]
|
|
obj = self.objInfos[uid]
|
|
|
|
|
+ objNP = obj[OG.OBJ_NP]
|
|
|
objDef = obj[OG.OBJ_DEF]
|
|
objDef = obj[OG.OBJ_DEF]
|
|
|
objModel = obj[OG.OBJ_MODEL]
|
|
objModel = obj[OG.OBJ_MODEL]
|
|
|
objProp = obj[OG.OBJ_PROP]
|
|
objProp = obj[OG.OBJ_PROP]
|
|
@@ -121,6 +145,7 @@ class ActionDeleteObj(ActionBase):
|
|
|
parentNP)
|
|
parentNP)
|
|
|
self.editor.objectMgr.updateObjectColor(objRGBA[0], objRGBA[1], objRGBA[2], objRGBA[3], uid)
|
|
self.editor.objectMgr.updateObjectColor(objRGBA[0], objRGBA[1], objRGBA[2], objRGBA[3], uid)
|
|
|
self.editor.objectMgr.updateObjectProperties(uid, objProp)
|
|
self.editor.objectMgr.updateObjectProperties(uid, objProp)
|
|
|
|
|
+ objNP.setMat(self.objTransforms[uid])
|
|
|
|
|
|
|
|
while (len(self.hierarchy.keys()) > 0):
|
|
while (len(self.hierarchy.keys()) > 0):
|
|
|
for uid in self.hierarchy.keys():
|
|
for uid in self.hierarchy.keys():
|
|
@@ -135,12 +160,98 @@ class ActionDeleteObj(ActionBase):
|
|
|
restoreObject(uid, parentNP)
|
|
restoreObject(uid, parentNP)
|
|
|
del self.hierarchy[uid]
|
|
del self.hierarchy[uid]
|
|
|
|
|
|
|
|
- base.direct.deselectAll()
|
|
|
|
|
|
|
+ base.direct.deselectAllCB()
|
|
|
for uid in self.selectedUIDs:
|
|
for uid in self.selectedUIDs:
|
|
|
obj = self.editor.objectMgr.findObjectById(uid)
|
|
obj = self.editor.objectMgr.findObjectById(uid)
|
|
|
if obj:
|
|
if obj:
|
|
|
- base.direct.select(obj[OG.OBJ_NP], fMultiSelect=1)
|
|
|
|
|
|
|
+ self.editor.select(obj[OG.OBJ_NP], fMultiSelect=1, fUndo=0)
|
|
|
|
|
|
|
|
self.selecteUIDs = []
|
|
self.selecteUIDs = []
|
|
|
self.hierarchy = {}
|
|
self.hierarchy = {}
|
|
|
self.objInfos = {}
|
|
self.objInfos = {}
|
|
|
|
|
+
|
|
|
|
|
+class ActionSelectObj(ActionBase):
|
|
|
|
|
+ """ Action class for adding new object """
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, editor, *args, **kargs):
|
|
|
|
|
+ self.editor = editor
|
|
|
|
|
+ function = base.direct.selectCB
|
|
|
|
|
+ ActionBase.__init__(self, function, *args, **kargs)
|
|
|
|
|
+ self.selectedUIDs = []
|
|
|
|
|
+
|
|
|
|
|
+ def saveStatus(self):
|
|
|
|
|
+ selectedNPs = base.direct.selected.getSelectedAsList()
|
|
|
|
|
+ for np in selectedNPs:
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectByNodePath(np)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ uid = obj[OG.OBJ_UID]
|
|
|
|
|
+ self.selectedUIDs.append(uid)
|
|
|
|
|
+
|
|
|
|
|
+ def undo(self):
|
|
|
|
|
+ print "Undo : selectObject"
|
|
|
|
|
+ base.direct.deselectAllCB()
|
|
|
|
|
+ for uid in self.selectedUIDs:
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectById(uid)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ self.editor.select(obj[OG.OBJ_NP], fMultiSelect=1, fUndo=0)
|
|
|
|
|
+ self.selectedUIDs = []
|
|
|
|
|
+
|
|
|
|
|
+class ActionTransformObj(ActionBase):
|
|
|
|
|
+ """ Action class for object transformation """
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, editor, *args, **kargs):
|
|
|
|
|
+ self.editor = editor
|
|
|
|
|
+ function = self.editor.objectMgr.setObjectTransform
|
|
|
|
|
+ ActionBase.__init__(self, function, *args, **kargs)
|
|
|
|
|
+ self.uid = args[0]
|
|
|
|
|
+ #self.xformMat = Mat4(args[1])
|
|
|
|
|
+ self.origMat = None
|
|
|
|
|
+
|
|
|
|
|
+ def saveStatus(self):
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectById(self.uid)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ self.origMat = Mat4(obj[OG.OBJ_NP].getMat())
|
|
|
|
|
+
|
|
|
|
|
+ def redo(self):
|
|
|
|
|
+ if self.uid is None:
|
|
|
|
|
+ print "Can't redo this add"
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.result = self._do__call__()#uid=self.uid, xformMat=self.xformMat)
|
|
|
|
|
+ return self.result
|
|
|
|
|
+
|
|
|
|
|
+ def undo(self):
|
|
|
|
|
+ if self.origMat is None:
|
|
|
|
|
+ print "Can't undo this transform"
|
|
|
|
|
+ else:
|
|
|
|
|
+ print "Undo: transformObject"
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectById(self.uid)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ obj[OG.OBJ_NP].setMat(self.origMat)
|
|
|
|
|
+ del self.origMat
|
|
|
|
|
+ self.origMat = None
|
|
|
|
|
+
|
|
|
|
|
+class ActionDeselectAll(ActionBase):
|
|
|
|
|
+ """ Action class for adding new object """
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, editor, *args, **kargs):
|
|
|
|
|
+ self.editor = editor
|
|
|
|
|
+ function = base.direct.deselectAllCB
|
|
|
|
|
+ ActionBase.__init__(self, function, *args, **kargs)
|
|
|
|
|
+ self.selectedUIDs = []
|
|
|
|
|
+
|
|
|
|
|
+ def saveStatus(self):
|
|
|
|
|
+ selectedNPs = base.direct.selected.getSelectedAsList()
|
|
|
|
|
+ for np in selectedNPs:
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectByNodePath(np)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ uid = obj[OG.OBJ_UID]
|
|
|
|
|
+ self.selectedUIDs.append(uid)
|
|
|
|
|
+
|
|
|
|
|
+ def undo(self):
|
|
|
|
|
+ print "Undo : deselectAll"
|
|
|
|
|
+ base.direct.deselectAllCB()
|
|
|
|
|
+ for uid in self.selectedUIDs:
|
|
|
|
|
+ obj = self.editor.objectMgr.findObjectById(uid)
|
|
|
|
|
+ if obj:
|
|
|
|
|
+ self.editor.select(obj[OG.OBJ_NP], fMultiSelect=1, fUndo=0)
|
|
|
|
|
+ self.selectedUIDs = []
|