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()

在调用任何 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()

属性

方法

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

end_force_keep_in_merge_ends()

String

get_action_name(id: int)

int

get_current_action()

String

get_current_action_name() const

int

get_history_count()

int

get_version() const

bool

has_redo() const

bool

has_undo() const

bool

is_committing_action() const

bool

redo()

void

start_force_keep_in_merge_ends()

bool

undo()


信号

version_changed() 🔗

在调用undo()redo()时调用。


枚举

enum MergeMode: 🔗

MergeMode MERGE_DISABLE = 0

使“做”/“撤消”操作保持在单独的操作中。

MergeMode MERGE_ENDS = 1

如果名称相同,则将此操作与前一个操作合并。仅保留第一个操作的“撤消”操作和最后一个操作的“执行”操作。对于对单个值的顺序更改很有用。

MergeMode MERGE_ALL = 2

如果名称相同,则将此操作与前一个操作合并。


属性说明

int max_steps = 0 🔗

  • void set_max_steps(value: int)

  • int get_max_steps()

撤消/重做历史记录中可以存储的最大步骤数。如果存储的步骤数超过此限制,则旧步骤将从历史记录中删除,并且无法再通过调用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) 🔗

提交操作。如果executetrue(默认情况下),则在调用此函数时调用/设置所有“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_opsfalse撤消选项时,它们的排序顺序与添加的顺序相同。这意味着要添加的第一个操作将是第一个撤消的操作。


void end_force_keep_in_merge_ends() 🔗

即使操作在MERGE_ENDS模式下与另一个操作合并,也停止将操作标记为要处理。请参阅start_force_keep_in_merge_ends()


String get_action_name(id: int) 🔗

从其索引中获取操作名称。


int get_current_action() 🔗

获取当前操作的索引。


String get_current_action_name() const 🔗

获取当前操作的名称,相当于get_action_name(get_current_action())


int get_history_count() 🔗

返回历史记录中的元素数量。


int get_version() const 🔗

获取版本。每次提交新操作时,UndoRedo的版本号都会自动增加。

这主要用于检查某些内容是否从保存的版本更改。


bool has_redo() const 🔗

如果“重做”操作可用,则返回true


bool has_undo() const 🔗

如果“撤消”操作可用,则返回true


bool is_committing_action() const 🔗

如果UndoRedo当前正在提交操作,即运行其“do”方法或属性更改(参见commit_action()),则返回true


bool redo() 🔗

重做最后一个动作。


void start_force_keep_in_merge_ends() 🔗

标记下一个要处理的“做”和“撤消”操作,即使该操作在MERGE_ENDS模式下与另一个操作合并。使用end_force_keep_in_merge_ends()返回正常操作。


bool undo() 🔗

撤消最后一个动作。