from bike import log
from bike.transformer.save import queueFileToSave
_undoStack = None
def getUndoStack(forceNewStack = 0):
global _undoStack
if _undoStack is None or forceNewStack:
_undoStack = UndoStack()
return _undoStack
class UndoStackEmptyException: pass
class UndoStack(object):
def __init__(self):
self.stack = []
self.stack.append({})
self.frame = self.stack[-1]
self.setUndoBufferSize(10)
def setUndoBufferSize(self, undoBufferSize):
self.undoBufferSize = undoBufferSize
def addSource(self, filename, src):
if filename not in self.frame:
self.frame[filename] = src
def commitUndoFrame(self):
#restrict size of buffer
while len(self.stack) > self.undoBufferSize:
#print "clipping undo stack"
del self.stack[0]
if len(self.frame) != 0:
#print "commitUndoFrame"
self.stack.append({})
self.frame = self.stack[-1]
def undo(self, **opts):
#print "undo called",self.stack
if len(self.stack) < 2:
raise UndoStackEmptyException()
undoframe = self.stack[-2]
#print "undoframe is",undoframe
for filename,src in undoframe.iteritems():
print >>log.progress, "Undoing:",filename
queueFileToSave(filename,src)
self.stack = self.stack[:-2]
self.stack.append({})
self.frame = self.stack[-1]
|