Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
UndoRedo
Hereda: Object
Proporciona una interfaz de alto nivel para implementar operaciones de deshacer y rehacer.
Descripción
UndoRedo funciona registrando métodos y cambios de propiedades dentro de "acciones". Puedes crear una acción, luego proporcionar formas de realizar y deshacer esta acción usando llamadas a funciones y cambios de propiedades, y finalmente ejecutar la acción.
Cuando una acción es ejecutada, todos los métodos do_* se ejecutarán. Si se usa el método undo(), se ejecutarán los métodos undo_*. Si se usa el método redo(), nuevamente se ejecutarán todos los métodos do_*.
A continuación se muestra un ejemplo de cómo agregar una acción:
var undo_redo = UndoRedo.new()
func do_something():
pass # Pon tu código aquí.
func undo_something():
pass # Pon aquí el código que revierte lo hecho por "do_something()".
func _on_my_button_pressed():
var node = get_node("MyNode2D")
undo_redo.create_action("Mover el nodo")
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()
{
// Pon tu código aquí.
}
public void UndoSomething()
{
// Pon aquí el código que revierte lo hecho por "DoSomething()".
}
private void OnMyButtonPressed()
{
var node = GetNode<Node2D>("MyNode2D");
_undoRedo.CreateAction("Mover el nodo");
_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();
}
Antes de llamar a cualquiera de los métodos add_(un)do_*, primero debes llamar a create_action(). Después, necesitas llamar a commit_action().
Si no necesitas registrar un método, puedes omitir add_do_method() y add_undo_method(); lo mismo ocurre con las propiedades. También puedes registrar más de un método o propiedad.
Si estás creando un EditorPlugin y deseas integrarte en el historial de deshacer del editor, usa EditorUndoRedoManager en su lugar.
Si estás registrando múltiples propiedades/métodos que dependen unos de otros, ten en cuenta que, por defecto, las operaciones de deshacer se llaman en el mismo orden en que fueron añadidas. Por lo tanto, en lugar de agrupar las operaciones "do" con sus operaciones "undo", es mejor agrupar las "do" por un lado y las "undo" por otro, como se muestra a continuación:
undo_redo.create_action("Agregar objeto")
# 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("Agregar objeto");
// 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();
Propiedades
|
Métodos
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() |
Señales
version_changed() 🔗
Enumeraciones
enum MergeMode: 🔗
MergeMode MERGE_DISABLE = 0
Hace que las operaciones de "hacer"/"deshacer" se mantengan en acciones separadas.
MergeMode MERGE_ENDS = 1
Fusiona esta acción con la anterior si tienen el mismo nombre. Mantiene solo las operaciones "deshacer" de la primera acción y las operaciones "rehacer" de la última acción. Útil para cambios secuenciales a un único valor.
MergeMode MERGE_ALL = 2
Fusiona esta acción con la anterior si tienen el mismo nombre.
Descripciones de Propiedades
El número máximo de pasos que se pueden almacenar en el historial de deshacer/rehacer. Si el número de pasos almacenados excede este límite, los pasos más antiguos se eliminan del historial y ya no se pueden alcanzar llamando a undo(). Un valor de 0 o inferior significa que no hay límite.
Descripciones de Métodos
void add_do_method(callable: Callable) 🔗
Registra una Callable que se llamará cuando se confirme la acción.
void add_do_property(object: Object, property: StringName, value: Variant) 🔗
Registra una property que cambiará su valor a value cuando se confirme la acción.
void add_do_reference(object: Object) 🔗
Registra una referencia a un objeto que se borrará si se elimina el historial de "hacer". Esto es útil para los objetos añadidos por la acción "hacer" y eliminados por la acción "deshacer".
Cuando se elimina el historial de "hacer", si el objeto es un RefCounted, se liberará la referencia. De lo contrario, se liberará. No lo utilices para los recursos.
var node = Node2D.new()
undo_redo.create_action("Añadir nodo")
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) 🔗
Registra un Callable que se llamará cuando se deshaga la acción.
void add_undo_property(object: Object, property: StringName, value: Variant) 🔗
Registra una property que cambiaría su valor a value cuando se deshaga la acción.
void add_undo_reference(object: Object) 🔗
Registra una referencia a un objeto que se borrará si se elimina el historial de "deshacer". Esto es útil para los objetos añadidos por la acción "deshacer" y eliminados por la acción "hacer".
Cuando se elimina el historial de "deshacer", si el objeto es un RefCounted, se liberará la referencia. De lo contrario, se liberará. No lo utilices para los recursos.
var node = $Node2D
undo_redo.create_action("Eliminar nodo")
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) 🔗
Borra el historial de deshacer/rehacer y las referencias asociadas.
Pasar false a increase_version evitará que el número de versión se incremente cuando se borre el historial.
void commit_action(execute: bool = true) 🔗
Confirma la acción. Si execute es true (que lo es por defecto), todos los métodos/propiedades "hacer" son llamados/establecidos cuando se llama a esta función.
void create_action(name: String, merge_mode: MergeMode = 0, backward_undo_ops: bool = false) 🔗
Create a new action. After this is called, do all your calls to add_do_method(), add_undo_method(), add_do_property(), and add_undo_property(), then commit the action with commit_action().
The way actions are merged is dictated by merge_mode.
The way undo operation are ordered in actions is dictated by backward_undo_ops. When backward_undo_ops is false undo option are ordered in the same order they were added. Which means the first operation to be added will be the first to be undone.
void end_force_keep_in_merge_ends() 🔗
Stops marking operations as to be processed even if the action gets merged with another in the MERGE_ENDS mode. See start_force_keep_in_merge_ends().
String get_action_name(id: int) 🔗
Obtiene el nombre de la acción de su índice.
Obtiene el índice de la acción actual.
String get_current_action_name() const 🔗
Gets the name of the current action, equivalent to get_action_name(get_current_action()).
Devuelve cuántos elementos hay en el historial.
Consigue la versión. Cada vez que se comete una nueva acción, el número de versión de UndoRedos se incrementa automáticamente.
Esto es útil sobre todo para comprobar si algo cambió de una versión guardada.
Devuelve true si una acción de "redo" está disponible.
Devuelve true si se dispone de una acción de "deshacer".
bool is_committing_action() const 🔗
Devuelve true si el UndoRedo está actualmente cometiendo la acción, es decir, ejecutando su método "hacer" o cambio de propiedad (ver commit_action()).
Redo the last action. Returns false if there was no action to redo.
void start_force_keep_in_merge_ends() 🔗
Marks the next "do" and "undo" operations to be processed even if the action gets merged with another in the MERGE_ENDS mode. Return to normal operation using end_force_keep_in_merge_ends().
Undo the last action. Returns false if there was no action to undo.