如何在lua中实现重做

时间:2012-05-28 13:24:23

标签: lua undo-redo

我刚刚介绍了LUA语言,我正在开始我的第一个项目。但是,我现在面临的最大挑战是如何实现或进行撤销和重做。

但是,为了使问题清楚,项目是自定义文本编辑器,因此,编辑任何输入文本都需要撤消/重做。我已经设法处理诸如剪切,复制,清除,查找单词,以及更改字体,文本颜色,插入表格和图像等问题,所有这些都是用lua语言处理的。显然,有几个自定义文本编辑器,我相信为许多人提供的努力将为未来的进步或改进铺平道路。但撤销/重做行动正在撕裂我,我的研究甚至是大多数现有的自定义文本编辑所缺乏的。

我搜索了几个论坛,他们似乎都在使用关联类表来加载信息,并从那里检索它们。令人难以置信的是,我认为其中一些网站只是在没有任何技术观点或任何内容的情况下分享从其他网站获取的知识。这是因为,我遇到的大多数建议看起来都很相似,并且在所有方面都是相同的。对于大约数十个访问过的网站,有一个用户试图发布示例的非网站,但我看到的只是对大多数lua用户的抱怨。毫无疑问,对于这个论坛中一些受人尊敬的大师来说,这似乎有点容易。

我似乎没有得到建议的真实情况。 有人可以给我一个例子吗?

1 个答案:

答案 0 :(得分:2)

撤消/重做非常适合command pattern

首先,您需要编写一些文本操作功能。只是部分,而不用担心没有或重新。这本身就是很多工作。

然后,您将拥有一系列操作文档的功能。 insertText()setFont()insertJpgImage()之类的内容。诀窍是,现在你需要将所有这些函数包装在一个所谓的command对象中。每个命令类都必须有do()本身的方法,以及undo()本身的方法。

现在所有文本操作操作都由命令对象表示,您可以通过以下方式执行每个操作(例如粗体一些文本):

boldCommand = setTextPropertyCommand:new(document, selectedArea, textProperties.bold)
boldCommand:do() --actually modify text
table.insert(commandUndoStack, boldCommand) --keep the command for possible undoing later.

如果要撤消某些文字的粗体,可以调用:

command = table.remove(commandUndoStack)
command:undo()

注意,如果你在Lua中使用一些GUI框架绑定,那么可能就是这个框架有自己的现成的撤销/重做功能。例如Qt(使用qtlua绑定)提供QUndoStack类。