0

我刚刚被介绍到 LUA 语言,我正在着手我的第一个项目。然而,我现在面临的最大挑战是如何实施或进行撤消和重做。

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

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

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

4

1 回答 1

2

撤消/重做非常适合命令模式

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

然后,您将拥有一堆函数来操作您的文档。insertText()setFont()之类的东西insertJpgImage()。诀窍是现在您需要将每个函数包装在一个所谓的命令对象中。每个命令类都必须对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类。

于 2012-06-05T18:57:15.120 回答