UndoRedo¶
继承: Object
提供用于实现撤消和重做操作的高级接口。
描述¶
撤销重做的工作原理是在 "actions" 内部注册方法和属性更改。你可以创建一个操作,然后使用函数调用和属性更改来提供执行和撤销此操作的方法,接着提交该操作。
当提交一个操作时,所有的 do_ 方法将会运行。如果使用了 undo() 方法,undo_ 方法将会运行。如果使用了 redo() 方法,那么所有的 do_* 方法将再次运行。
以下是一个关于如何添加一个操作的示例:
var undo_redo = UndoRedo.new()
func do_something():
pass # 将您的代码放在这里。
func undo_something():
pass # 在此处编写一段代码,用于撤销 "do_something()" 所执行的操作。
func _on_my_button_pressed():
var node = get_node("MyNode2D")
undo_redo.create_action("Move the node")
undo_redo.add_do_method(do_something)
undo_redo.add_undo_method(undo_something)
undo_redo.add_do_property(node, "position", Vector2(100,100))
undo_redo.add_undo_property(node, "position", node.position)
undo_redo.commit_action()
private UndoRedo _undoRedo;
public override void _Ready()
{
_undoRedo = new UndoRedo();
}
public void DoSomething()
{
// 将您的代码放在这里。
}
public void UndoSomething()
{
// 在此处编写一段代码,用于撤销 "do_something()" 所执行的操作。
}
private void OnMyButtonPressed()
{
var node = GetNode<Node2D>("MyNode2D");
_undoRedo.CreateAction("Move the node");
_undoRedo.AddDoMethod(new Callable(this, MethodName.DoSomething));
_undoRedo.AddUndoMethod(new Callable(this, MethodName.UndoSomething));
_undoRedo.AddDoProperty(node, "position", new Vector2(100, 100));
_undoRedo.AddUndoProperty(node, "position", node.Position);
_undoRedo.CommitAction();
}
在调用任何 add_(un)do_* 方法之前,你需要先调用 create_action()。之后,你需要调用 commit_action()。n 如果你不需要注册方法,可以省略 add_do_method() 和 add_undo_method();属性也是如此。你也可以注册多个方法/属性。n 如果你正在制作一个 EditorPlugin 并希望集成到编辑器的撤销历史中,请改用 EditorUndoRedoManager。n 如果你要注册多个相互依赖的属性/方法,请注意,默认情况下,撤销操作将按照添加的顺序调用。因此,与其将执行操作与其撤销操作分组,不如像下面所示的那样,将执行操作放在一侧,撤销操作放在另一侧。
undo_redo.create_action("Add object")
# DO
undo_redo.add_do_method(_create_object)
undo_redo.add_do_method(_add_object_to_singleton)
# UNDO
undo_redo.add_undo_method(_remove_object_from_singleton)
undo_redo.add_undo_method(_destroy_that_object)
undo_redo.commit_action()
_undo_redo.CreateAction("Add object");
// DO
_undo_redo.AddDoMethod(new Callable(this, MethodName.CreateObject));
_undo_redo.AddDoMethod(new Callable(this, MethodName.AddObjectToSingleton));
// UNDO
_undo_redo.AddUndoMethod(new Callable(this, MethodName.RemoveObjectFromSingleton));
_undo_redo.AddUndoMethod(new Callable(this, MethodName.DestroyThatObject));
_undo_redo.CommitAction();
属性¶
方法¶
void |
add_do_method(callable: Callable) |
void |
add_do_property(object: Object, property: StringName, value: Variant) |
void |
add_do_reference(object: Object) |
void |
add_undo_method(callable: Callable) |
void |
add_undo_property(object: Object, property: StringName, value: Variant) |
void |
add_undo_reference(object: Object) |
void |
clear_history(increase_version: bool = true) |
void |
commit_action(execute: bool = true) |
void |
create_action(name: String, merge_mode: MergeMode = 0, backward_undo_ops: bool = false) |
void |
|
get_action_name(id: int) |
|
get_current_action_name() const |
|
get_version() const |
|
has_redo() const |
|
has_undo() const |
|
is_committing_action() const |
|
redo() |
|
void |
|
undo() |
信号¶
version_changed() 🔗
枚举¶
enum MergeMode: 🔗
MergeMode MERGE_DISABLE = 0
使“做”/“撤消”操作保持在单独的操作中。
MergeMode MERGE_ENDS = 1
如果名称相同,则将此操作与前一个操作合并。仅保留第一个操作的“撤消”操作和最后一个操作的“执行”操作。对于对单个值的顺序更改很有用。
MergeMode MERGE_ALL = 2
如果名称相同,则将此操作与前一个操作合并。
属性说明¶
撤消/重做历史记录中可以存储的最大步骤数。如果存储的步骤数超过此限制,则旧步骤将从历史记录中删除,并且无法再通过调用undo()来达到。0或更低的值表示没有限制。
方法说明¶
void add_do_method(callable: Callable) 🔗
注册一个将在提交操作时调用的Callable。
void add_do_property(object: Object, property: StringName, value: Variant) 🔗
注册一个property,该属性将在提交操作时将其值更改为value。
void add_do_reference(object: Object) 🔗
注册一个对某个对象的引用,如果 "do" 历史记录被删除,该对象也将被删除。这对于由“do”操作添加并由“undo”操作移除的对象很有用。
\当“do”历史记录被删除时,如果该对象是一个RefCounted,它将被取消引用。否则,它将被释放。请勿用于资源。
var node = Node2D.new()
undo_redo.create_action("Add node")
undo_redo.add_do_method(add_child.bind(node))
undo_redo.add_do_reference(node)
undo_redo.add_undo_method(remove_child.bind(node))
undo_redo.commit_action()
void add_undo_method(callable: Callable) 🔗
注册一个Callable,该Callable将在操作撤消时调用。
void add_undo_property(object: Object, property: StringName, value: Variant) 🔗
注册一个property,该属性将在撤消操作时将其值更改为value。
void add_undo_reference(object: Object) 🔗
注册一个对某个对象的引用,如果"undo"历史记录被删除,该对象也将被删除。这对于由"undo"操作添加并由"undo"操作移除的对象很有用。
当"undo"历史记录被删除时,如果该对象是一个RefCounted,它的引用将被移除。否则,它将被释放。请勿用于资源。 .
var node = $Node2D
undo_redo.create_action("Remove node")
undo_redo.add_do_method(remove_child.bind(node))
undo_redo.add_undo_method(add_child.bind(node))
undo_redo.add_undo_reference(node)
undo_redo.commit_action()
void clear_history(increase_version: bool = true) 🔗
清除撤消/重做历史记录和相关引用。
将false传递给increase_version将防止在清除历史记录时增加版本号。
void commit_action(execute: bool = true) 🔗
提交操作。如果execute是true(默认情况下),则在调用此函数时调用/设置所有“do”方法/属性。
void create_action(name: String, merge_mode: MergeMode = 0, backward_undo_ops: bool = false) 🔗
创建一个新操作。调用后,对add_do_method()、add_undo_method()、add_do_property()和add_undo_property()进行所有调用,然后使用commit_action()提交操作。
合并动作的方式由merge_mode决定。有关详细信息,请参阅MergeMode。
撤消操作在操作中的排序方式由backward_undo_ops决定。当backward_undo_ops为false撤消选项时,它们的排序顺序与添加的顺序相同。这意味着要添加的第一个操作将是第一个撤消的操作。
void end_force_keep_in_merge_ends() 🔗
即使操作在MERGE_ENDS模式下与另一个操作合并,也停止将操作标记为要处理。请参阅start_force_keep_in_merge_ends()。
String get_action_name(id: int) 🔗
从其索引中获取操作名称。
获取当前操作的索引。
String get_current_action_name() const 🔗
获取当前操作的名称,相当于get_action_name(get_current_action())。
返回历史记录中的元素数量。
获取版本。每次提交新操作时,UndoRedo的版本号都会自动增加。
这主要用于检查某些内容是否从保存的版本更改。
如果“重做”操作可用,则返回true。
如果“撤消”操作可用,则返回true。
bool is_committing_action() const 🔗
如果UndoRedo当前正在提交操作,即运行其“do”方法或属性更改(参见commit_action()),则返回true。
重做最后一个动作。
void start_force_keep_in_merge_ends() 🔗
标记下一个要处理的“做”和“撤消”操作,即使该操作在MERGE_ENDS模式下与另一个操作合并。使用end_force_keep_in_merge_ends()返回正常操作。
撤消最后一个动作。