#undo-redo #stack #state #history #user #user-defined #value

no-std undo_stack

用户定义类型的最小化撤销栈

15 个版本

0.2.4 2024 年 8 月 11 日
0.2.3 2024 年 8 月 6 日
0.2.1 2024 年 7 月 28 日
0.1.9 2024 年 7 月 28 日

#405Rust 模式

Download history 191/week @ 2024-07-08 235/week @ 2024-07-15 251/week @ 2024-07-22 388/week @ 2024-07-29 247/week @ 2024-08-05 78/week @ 2024-08-12

964 每月下载量

MIT 许可证

18KB
220

工作正在进行中。不安全使用,仍需大量测试。

为个人项目创建的最简主义撤销/重做库。自行承担风险!

每次您的应用程序数据更改为新值时,您都可以使用 UndoStack::push 方法将旧值推入 UndoStack。调用 UndoStack::undo 将遍历栈返回 past_stack 值,但通过 UndoStack::redo 方法仍然可以通过当前位置的上方值,这将使栈回到现在。

调用撤销然后推入新值会清除重做栈,因为历史被重写,现在未来栈的状态将不同。

调用撤销和重做时,通过 [Undoable] 特性将恢复的值自动恢复到关联的 Project 类型(包含数据的结构体),该特性仅包含一个 "restore" 方法,您必须提供一种方式,将恢复的值重新应用于 Project 类型。

动机。

我创建了这个 crate 用于个人使用,以满足我的一些要求

  • 尽可能最小化,同时仍然有用。
  • 不依赖标准 "alloc" crate 使用 Vec。
  • 如果需要,撤销值可以存储在多个栈中。这种用例可以在现代 3D 动画软件中看到,场景撤销通常与视口撤销分开。
  • 提供了一个简单的特性(Undoable)和一个单一的 "restore" 方法,允许自动将恢复的值重新应用于应用程序数据。

创建连续更改的撤销值。

在具有 GUI 的应用程序中,一个常见的用例是需要持续在屏幕上更新值,同时用户与之交互(例如,拖动滑块),但只有其初始状态和最终状态才会用于撤销目的。

您可以通过使用 UndoStack::start_bufferUndoStack::finish_buffer 方法在用户交互的开始和结束时轻松实现这一点,而不是使用 "push"。最终的州只用于与初始状态进行比较,如果它们相同,实际上并不会存储任何内容。

创建撤销组

另一种常见情况是将多个单独跟踪的撤销值分组到单个撤销或重做操作中。为此,使用 UndoStack::start_group 打开一个组,执行所有撤销推送,然后使用 UndoStack::finish_group 关闭它。这一步非常重要,不使用它可能会导致不可预测的结果和整个撤销栈内容丢失(但希望不会崩溃!)。

示例

请下载仓库并在项目根目录下运行 "cargo run -p example_single_values" 以进行简单演示。您还可以尝试 "cargo run -p example_group" 以使用撤销组,即一次性撤销多个值。

特性

默认情况下禁用了 "std" 功能。要查看警告消息,您需要启用此功能("verbose" 字段默认为 true)。以 "Warning:" 为前缀的消息很有帮助,因为它们表明您在本地端做了错误的事情 - 例如在打开一个组之前关闭它 - 并且理想情况下您永远不应该看到任何这样的消息。

无运行时依赖

特性