如何在 Lua 中实现重做

我刚接触LUA语言,正在开始我的第一个项目。然而,我现在面临的最大挑战是如何实现或制作撤销和重做。

然而,为了明确问题,该项目是自定义文本编辑器,因此在此需要进行撤销/重做以编辑任何输入文本。我已经成功处理了一些问题,如剪切、复制、清除、查找单词、更改字体、文本颜色、插入表格和图像等,所有这些都使用LUA语言处理。显然,有几个自定义文本编辑器,我相信为许多人提供服务的努力将为未来的进步或改进铺平道路。但撤销/重做操作正在让我感到痛苦,这甚至是现有大多数自定义文本编辑器缺乏的功能。

我在几个论坛上搜索,它们似乎都给出了使用关联类型的表来加载信息并从中检索的提示。令人难以置信的是,我认为一些这些网站只是在分享他们从其他网站获得的知识而没有任何技术观点或其他。这是因为,我看到的大多数建议在所有方面看起来都是相同的。对于我访问的大约十个站点,没有一个用户尝试发布示例,但我看到的都是同样的抱怨,即大多数LUA用户的问题。毫无疑问,这对于这个论坛中一些受尊敬的大师来说可能会很容易。

我似乎没有得到建议的真实图片。 有人能给我一个例子吗?

点赞
用户122460
用户122460

撤销/重做是命令模式的完美应用。

首先,你需要单独编写一些文本操作功能,只考虑 "做",而不必考虑 "撤销" 或 "重做"。 这本身就是一项很大的工作。

然后你会有一堆用于操作文档的函数,如 insertText()setFont()insertJpgImage() 等。技巧在于现在你需要将每个这些函数包装在所谓的命令 对象中。每个命令类必须有一个 do() 方法和一个 undo() 方法。

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

boldCommand = setTextPropertyCommand:new(document, selectedArea, textProperties.bold)
boldCommand:do() --实际修改文本
table.insert(commandUndoStack, boldCommand) --保存命令以备可能的撤销

当您要撤消某些文本加粗时,可以调用:

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

注意,如果您正在使用 Lua 中的某些 GUI 框架绑定,则可能会出现这个框架具有自己的撤消/重做功能的情况。例如 Qt(带有 qtlua 绑定)提供QUndoStack 类。

2012-06-05 18:57:15