跳转到主要内容

一个通用的库,用于帮助实现撤销功能。

项目描述

jundo

一个通用的库,用于帮助实现现有对象的撤销功能。

主要思想是,如果将自己限制为可以视为类似JSON的数据结构(即由字符串、数字、列表和字典组成)的对象,就可以以完全通用的方式记录更改,并使用这些记录来重建对象或撤销更改,例如实现撤销功能。

一个关键要求是模型对象必须完全与记录机制解耦,并且不需要对其有任何了解。

在这里实现的方式是通过代理对象:不是直接修改原始模型对象,而是使用模仿模型对象的代理对象,允许代理将更改信息(增量)传递给撤销管理器。

撤销管理器收集更改增量(及其逆增量),并在请求撤销或重做时将它们应用到原始模型对象。

通过undoManager.setModel(model)将模型对象传递给撤销管理器,该函数返回模型的代理。客户端代码必须使用代理对象而不是模型来修改模型。以下是一个示例

>>> model = [1, 2, 3, {"a": 123}]
>>> um = UndoManager()
>>> proxy = um.setModel(model)
>>> # Modifications must be done within a change set context:
>>> with um.changeSet(title="replace list item"):
...     proxy[1] = 2000
...
>>> model[1]
2000
>>> um.undo()
>>> model[1]
2
>>> um.redo()
>>> model[1]
2000
>>> with um.changeSet(title="replace nested dict item"):
...     proxy[3]["a"] = 456
...
>>> model[3]["a"]
456
>>> um.undo()
>>> model[3]["a"]
123

在这个示例中,仅使用Python列表和字典对象作为容器,但任何类型的Mapping或Sequence(在collections.abc-sense中)都可以使用,或者任何使用属性访问来修改其模型数据的对象类型。请参阅示例文件夹以获取更详细的示例。

也支持集合。

为了支持非JSON样式的模型对象,可以通过registerUndoProxy()函数注册自定义代理类。

致谢

此处实现的方法受到了Raph Levien想法的启发,正如他在这里所写的那样。它也受到了jsonpatch的启发。

项目详情


下载文件

下载适用于您平台的应用文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

jundo-0.1.2.tar.gz (15.4 kB 查看哈希值)

上传时间 源代码

构建分发

jundo-0.1.2-py3-none-any.whl (10.2 kB 查看哈希值)

上传时间 Python 3

支持者

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面