#undo-redo #undo #redo #auto-generate #data-control

nightly rundo

Rundo 是一个用于 Rust 的 redo/undo 库,可以自动生成撤销操作。以下是如何使用 Rundo 的示例。

4 个版本 (破坏性)

使用旧 Rust 2015

0.4.0 2018年4月6日
0.3.2 2018年2月23日
0.2.0 2018年2月7日
0.1.1 2018年2月5日

10#redo

MIT 许可证

9.5MB
55K SLoC

C++ 48K SLoC // 0.0% comments JavaScript 3K SLoC // 0.0% comments C 2K SLoC // 0.1% comments Python 1K SLoC // 0.0% comments Rust 851 SLoC // 0.0% comments Shell 179 SLoC // 0.2% comments GNU Style Assembly 13 SLoC

包含 (ELF exe/lib, 8.5MB) kcov-master/build/src/kcov, (ELF exe/lib, 4MB) configuration.cc.o, (ELF exe/lib, 4MB) configuration.cc.o, (ELF exe/lib, 3MB) kcov-master/build/src/kcov-system-daemon, (ELF exe/lib, 1.5MB) bash-engine.cc.o, (ELF exe/lib, 1MB) merge-file-parser.cc.o 和 63 个更多.

Rundo

Build Status Coverage Status

Rundo 是一个用于 Rust 的 redo/undo 库,可以自动生成撤销操作。以下是如何使用 Rundo 的示例。

#![feature(proc_macro)]
#![feature(decl_macro)]

extern crate rundo;
use rundo::prelude::*;

#[rundo]
struct Point {
    x: f32,
    y: f32,
}

fn main(){

  let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});
  *space.get_mut().x = 3.0;

  // x was changed to 3.0
  assert_eq!(*space.data.x, 3.0);

  // x will undo to 2.0
  space.undo();
  assert_eq!(*space.data.x, 2.0);

  // x will redo to 3.0
  space.redo();
  assert_eq!(*space.data.x, 3.0);
}

文档

库 API

快速入门 2 分钟学会如何使用 Rundo。


lib.rs:

Rundo 是一个用于 Rust 的 redo/undo 库,它可以自动生成操作。

感谢 Rust Procedural Macros,Rundo 将设计和实现以零成本支持 Rust 中的撤销/重做。Rundo 致力于支持对用户代码透明的撤销/重做,它应该易于使用。在大多数情况下,只需为您的数据结构使用 rundo 属性 #[rundo] 即可。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
rundo = "0.1"

示例

以下代码将展示如何使用 Rundo。

#![feature(proc_macro)]
#![feature(decl_macro)]

extern crate rundo;
use rundo::prelude::*;

#[rundo]
struct Point {
    x: f32,
    y: f32,
}

// Note here the macro `Point`, Rundo redefine your origin Point type
// with the same shape, but support undo redo.
// You can use it as same as before, but to literal construct
// must use a same name macro replace.

fn main(){
  let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});
  {
    // access data across get_mut will auto collect change action during its life time.
    *space.get_mut().x = 3.0;
  }

 // x was changed to 3.0
 assert_eq!(*space.data.x, 3.0);

 // x will undo to 2.0
 space.undo();
 assert_eq!(*space.data.x, 2.0);

 // x will redo to 3.0
 space.redo();
 assert_eq!(*space.data.x, 3.0);
}

您也可以手动控制生成的更改操作;

#
#
#
let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});
space.begin_op();       // form here all chage will be
                          // merge to one op until `end_op` called

*space.get_mut().x = 5.0;
*space.get_mut().y = 6.0;
*space.get_mut().x = 3.0;

space.end_op();        // generate op

// only a user op will be generate
space.undo();

assert_eq!(*space.data.x, 2.0);
assert_eq!(*space.data.y, 2.0);

#[rundo(skip)] 跳过此字段

如果您的结构体中有一些字段您不想撤销/重做,在其前添加 #[rundo(skip)]。

#
#
#
let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});

space.get_mut().x = 5.0;
*space.get_mut().y = 6.0;

space.undo();

// x change will be not capture, undo will not occur on it.
assert_eq!(space.data.x, 5.0);
// but y is undo to 2.0
assert_eq!(*space.data.y, 2.0);

您也可以参考 [README]: https://github.com/M-Adoo/rundo#rundo

依赖

~9.5MB
~161K SLoC