EditorUndoRedoManager
继承: Object
管理编辑器中打开场景的撤销历史。
描述
EditorUndoRedoManager 是将 UndoRedo 对象与编辑场景相关联的管理器。每个场景都有自己的撤销历史,EditorUndoRedoManager 能够确保编辑器中执行的每个动作都与正确的场景相关联。与场景无关的动作(对 ProjectSettings、外部资源等对象的编辑)使用单独的全局历史。
用法与 UndoRedo 基本一致。需要创建并提交动作,然后管理器会自动决定这个动作属于哪个场景。场景是根据该动作中第一个操作所使用的对象来推断的。规则如下:
如果该对象为 Node,则使用当前编辑的场景;
如果该对象为内置资源,则使用其路径上的场景;
如果该对象为外部资源或任何其他对象,则使用全局历史。
推断的结果有时并不准确,所以在创建动作时你可以提供自定义的上下文对象。
EditorUndoRedoManager 是为 Godot 编辑器插件使用而设计的。你可以使用 EditorPlugin.get_undo_redo() 获取。对于非编辑器使用场景或者不需要与编辑器撤销历史记录集成的插件,请改用 UndoRedo。
管理器的 API 与 UndoRedo 基本一致,它的文档中有更多示例。主要区别在于 EditorUndoRedoManager 的动作使用对象 + 方法名,而不是 Callable。
方法
void |
add_do_method(object: Object, method: StringName, ...) vararg |
void |
add_do_property(object: Object, property: StringName, value: Variant) |
void |
add_do_reference(object: Object) |
void |
add_undo_method(object: Object, method: StringName, ...) vararg |
void |
add_undo_property(object: Object, property: StringName, value: Variant) |
void |
add_undo_reference(object: Object) |
void |
clear_history(id: int = -99, increase_version: bool = true) |
void |
commit_action(execute: bool = true) |
void |
create_action(name: String, merge_mode: MergeMode = 0, custom_context: Object = null, backward_undo_ops: bool = false, mark_unsaved: bool = true) |
void |
|
get_history_undo_redo(id: int) const |
|
get_object_history_id(object: Object) const |
|
is_committing_action() const |
信号
history_changed() 🔗
当任何历史中的动作列表发生变化时发出,无论是当一个动作被提交或一个历史被清除时。
version_changed() 🔗
当任何历史记录的版本因撤消或重做调用而变化时发出。
枚举
enum SpecialHistory: 🔗
SpecialHistory GLOBAL_HISTORY = 0
全局历史不与任何场景相关联,但与外部资源等相关联。
SpecialHistory REMOTE_HISTORY = -9
与远程检查器相关的历史。在实时编辑正在运行的游戏项目时使用。
SpecialHistory INVALID_HISTORY = -99
无效历史“null”。这是一个特殊值,不与任何对象相关联。
方法说明
void add_do_method(object: Object, method: StringName, ...) vararg 🔗
注册一个方法,当动作被提交(即“做”的动作)时将被调用。
如果这是第一次操作,object 将被用于推断目标撤消历史。
void add_do_property(object: Object, property: StringName, value: Variant) 🔗
为“做”注册一个属性值变更。
如果这是第一次操作,object 将被用于推断目标撤消历史。
void add_do_reference(object: Object) 🔗
为“做”注册一个引用,如果“做”历史丢失,则该引用将被擦除。这主要用于为“做”调用而创建的新节点。请不要用于资源。
void add_undo_method(object: Object, method: StringName, ...) vararg 🔗
注册一个方法,当动作被撤销时(即“撤销”动作)将被调用。
如果这是第一次操作,object 将被用于推断目标撤消历史。
void add_undo_property(object: Object, property: StringName, value: Variant) 🔗
为“撤销”注册一个属性值变更。
如果这是第一次操作,object 将被用于推断目标撤消历史。
void add_undo_reference(object: Object) 🔗
为“撤消”注册一个引用,如果“撤消”历史丢失,则该引用将被擦除。这主要用于通过“做”调用(而不是“撤销”调用!)而移除的节点。
void clear_history(id: int = -99, increase_version: bool = true) 🔗
Clears the given undo history. You can clear history for a specific scene, global history, or for all histories at once (except REMOTE_HISTORY) if id is INVALID_HISTORY.
If increase_version is true, the undo history version will be increased, marking it as unsaved. Useful for operations that modify the scene, but don't support undo.
var scene_root = EditorInterface.get_edited_scene_root()
var undo_redo = EditorInterface.get_editor_undo_redo()
undo_redo.clear_history(undo_redo.get_object_history_id(scene_root))
Note: If you want to mark an edited scene as unsaved without clearing its history, use EditorInterface.mark_scene_as_unsaved() instead.
void commit_action(execute: bool = true) 🔗
提交该动作。如果 execute 为 true(默认值),则该函数被调用时所有“做”方法/属性将被调用/设置。
void create_action(name: String, merge_mode: MergeMode = 0, custom_context: Object = null, backward_undo_ops: bool = false, mark_unsaved: bool = true) 🔗
创建一个新的动作。调用后,请执行所有你需要的 add_do_method()、add_undo_method()、add_do_property() 和 add_undo_property() 调用,然后再用 commit_action() 提交这个动作。
动作的合并方式由 merge_mode 参数决定。
如果提供了 custom_context 对象,则它将被用于推断目标历史(而不是使用第一个操作)。
动作中撤销操作的顺序由 backward_undo_ops 决定。backward_undo_ops 为 false 时,撤销选项的顺序和添加顺序一致。也就是说,先添加的操作会先撤销。
如果 mark_unsaved 为 false,则该动作不会将历史标记为未保存。例如,适用于修改选中项的动作,或自动保存的设置项。否则,如果动作需要用户进行保存或不保存可能导致数据丢失,请将其保持为 true。
void force_fixed_history() 🔗
强制下一个操作(例如 add_do_method())使用操作的历史记录,而不是从对象中猜测。当无法正确确定历史记录时,有时需要这样做,例如对于尚未有路径的嵌套资源。
仅应在绝对必要时使用该方法,否则可能会导致无效的历史记录状态。对于大多数复杂情况,create_action() 的 custom_context 参数就足够了。
UndoRedo get_history_undo_redo(id: int) const 🔗
返回与给定历史 id 关联的 UndoRedo 对象。
0 以上的 id 被映射到打开的场景选项卡(但它与它们的顺序不匹配)。0 或更低的 id 具有特殊含义(参阅 SpecialHistory)。
最好与 get_object_history_id() 一起使用。该方法被提供,只是以防需要 UndoRedo 的一些更高级的方法的情况(但请记住,直接操作 UndoRedo 对象可能会影响编辑器的稳定性)。
int get_object_history_id(object: Object) const 🔗
返回从给定的 object 推导出的历史 ID。它可以与 get_history_undo_redo() 一起使用。
bool is_committing_action() const 🔗
如果 EditorUndoRedoManager 当前正在提交该动作,即运行其“做”方法或属性更改(请参阅 commit_action())时,则返回 true。