mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 19:08:55 -04:00
[wip] undo/redo system
This commit is contained in:
parent
a71b73be18
commit
312944e2f7
61
direct/src/leveleditor/ActionMgr.py
Executable file
61
direct/src/leveleditor/ActionMgr.py
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
class ActionBase(Functor):
|
||||||
|
""" Base class for user actions """
|
||||||
|
|
||||||
|
def __init__(self, function, *args, **kargs):
|
||||||
|
Functor.__init__(self, function, *args, **kargs)
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
print "undo method is not defined for this action"
|
||||||
|
|
||||||
|
class ActionMgr:
|
||||||
|
def __init__(self):
|
||||||
|
self.undoList = []
|
||||||
|
self.redoList = []
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
while len(self.undoList) > 0:
|
||||||
|
action = self.undoList.pop()
|
||||||
|
action.destroy()
|
||||||
|
|
||||||
|
while len(self.redoList) > 0:
|
||||||
|
action = self.redoList.pop()
|
||||||
|
action.destroy()
|
||||||
|
|
||||||
|
def push(self, action):
|
||||||
|
self.undoList.append(action)
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
if len(self.undoList) < 1:
|
||||||
|
print 'No more undo'
|
||||||
|
else:
|
||||||
|
action = self.undoList.pop()
|
||||||
|
self.redoList.append(action)
|
||||||
|
action.undo()
|
||||||
|
|
||||||
|
def redo(self):
|
||||||
|
if len(self.redoList) < 1:
|
||||||
|
print 'No more redo'
|
||||||
|
else:
|
||||||
|
action = self.redoList.pop()
|
||||||
|
self.undoList.append(action)
|
||||||
|
action()
|
||||||
|
|
||||||
|
class ActionAddNewObj(ActionBase):
|
||||||
|
""" Action class for adding new object """
|
||||||
|
|
||||||
|
def __init__(self, function, *args, **kargs):
|
||||||
|
ActionBase.__init__(self, function, *args, **kargs)
|
||||||
|
self.np = None
|
||||||
|
|
||||||
|
def _do__call__(self, *args, **kargs):
|
||||||
|
self.np = ActionBase._do__call__(self, *args, **kargs)
|
||||||
|
return self.np
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
if self.np is None:
|
||||||
|
print "Can't undo this"
|
||||||
|
else:
|
||||||
|
base.direct.removeAllSelected()
|
||||||
|
base.le.objectMgr.deselectAll()
|
||||||
|
base.direct.removeNodePath(self.np)
|
||||||
|
self.np = None
|
@ -14,6 +14,7 @@ base = ShowBase(False)
|
|||||||
|
|
||||||
from ObjectMgr import *
|
from ObjectMgr import *
|
||||||
from FileMgr import *
|
from FileMgr import *
|
||||||
|
from ActionMgr import *
|
||||||
from ProtoPalette import *
|
from ProtoPalette import *
|
||||||
|
|
||||||
class LevelEditorBase(DirectObject):
|
class LevelEditorBase(DirectObject):
|
||||||
@ -24,6 +25,7 @@ class LevelEditorBase(DirectObject):
|
|||||||
self.actionEvents = []
|
self.actionEvents = []
|
||||||
self.objectMgr = ObjectMgr(self)
|
self.objectMgr = ObjectMgr(self)
|
||||||
self.fileMgr = FileMgr(self)
|
self.fileMgr = FileMgr(self)
|
||||||
|
self.actionMgr = ActionMgr()
|
||||||
self.protoPalette = ProtoPalette()
|
self.protoPalette = ProtoPalette()
|
||||||
|
|
||||||
# define your own config file in inherited class
|
# define your own config file in inherited class
|
||||||
@ -81,6 +83,8 @@ class LevelEditorBase(DirectObject):
|
|||||||
('preRemoveNodePath', self.removeNodePathHook),
|
('preRemoveNodePath', self.removeNodePathHook),
|
||||||
('DIRECT_selectedNodePath_fMulti_fTag', self.selectedNodePathHook),
|
('DIRECT_selectedNodePath_fMulti_fTag', self.selectedNodePathHook),
|
||||||
('DIRECT_deselectAll', self.deselectAll),
|
('DIRECT_deselectAll', self.deselectAll),
|
||||||
|
('LE-Undo', self.actionMgr.undo),
|
||||||
|
('LE-Redo', self.actionMgr.redo),
|
||||||
])
|
])
|
||||||
|
|
||||||
# Add all the action events
|
# Add all the action events
|
||||||
@ -137,6 +141,7 @@ class LevelEditorBase(DirectObject):
|
|||||||
def reset(self):
|
def reset(self):
|
||||||
base.direct.deselectAll()
|
base.direct.deselectAll()
|
||||||
self.objectMgr.reset()
|
self.objectMgr.reset()
|
||||||
|
self.actionMgr.reset()
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
if self.currentFile:
|
if self.currentFile:
|
||||||
@ -182,7 +187,7 @@ class LevelEditorBase(DirectObject):
|
|||||||
elif line.startswith('gridSpacing'):
|
elif line.startswith('gridSpacing'):
|
||||||
gridSpacing = float(configLines[i])
|
gridSpacing = float(configLines[i])
|
||||||
elif line.startswith('hotKey'):
|
elif line.startswith('hotKey'):
|
||||||
base.direct.hotKeyMap = eval(configLines[i])
|
base.direct.hotKeyMap.update(eval(configLines[i]))
|
||||||
|
|
||||||
self.ui.updateGrids(gridSize, gridSpacing)
|
self.ui.updateGrids(gridSize, gridSpacing)
|
||||||
except:
|
except:
|
||||||
|
@ -12,6 +12,7 @@ from SceneGraphUI import *
|
|||||||
from LayerEditorUI import *
|
from LayerEditorUI import *
|
||||||
from HotKeyUI import *
|
from HotKeyUI import *
|
||||||
from ProtoPaletteUI import *
|
from ProtoPaletteUI import *
|
||||||
|
from ActionMgr import *
|
||||||
|
|
||||||
class PandaTextDropTarget(wx.TextDropTarget):
|
class PandaTextDropTarget(wx.TextDropTarget):
|
||||||
def __init__(self, editor):
|
def __init__(self, editor):
|
||||||
@ -19,7 +20,9 @@ class PandaTextDropTarget(wx.TextDropTarget):
|
|||||||
self.editor = editor
|
self.editor = editor
|
||||||
|
|
||||||
def OnDropText(self, x, y, text):
|
def OnDropText(self, x, y, text):
|
||||||
self.editor.objectMgr.addNewObject(text)
|
action = ActionAddNewObj(self.editor.objectMgr.addNewObject, text)
|
||||||
|
self.editor.actionMgr.push(action)
|
||||||
|
action()
|
||||||
|
|
||||||
class LevelEditorUI(WxAppShell):
|
class LevelEditorUI(WxAppShell):
|
||||||
""" Class for Panda3D LevelEditor """
|
""" Class for Panda3D LevelEditor """
|
||||||
|
Loading…
x
Reference in New Issue
Block a user