Change set_drag_forwarding() to use callables.

* This solution is much cleaner than the one in 3.x thanks to the use of callables.
* Works without issues in any language (no need to worry about camel or snake case).
* Editor code uses a compatibility function (too much work to redo).

Fixes #59899
This commit is contained in:
Juan Linietsky
2023-01-09 19:24:36 +01:00
parent f5f7d11ac4
commit e6a4debede
30 changed files with 86 additions and 113 deletions

View File

@@ -780,67 +780,13 @@
</method>
<method name="set_drag_forwarding">
<return type="void" />
<param index="0" name="target" type="Object" />
<param index="0" name="drag_func" type="Callable" />
<param index="1" name="can_drop_func" type="Callable" />
<param index="2" name="drop_func" type="Callable" />
<description>
Forwards the handling of this control's drag and drop to [param target] object.
Forwarding can be implemented in the target object similar to the methods [method _get_drag_data], [method _can_drop_data], and [method _drop_data] but with two differences:
1. The function name must be suffixed with [b]_fw[/b]
2. The function must take an extra argument that is the control doing the forwarding
[codeblocks]
[gdscript]
# ThisControl.gd
extends Control
export(Control) var target_control
func _ready():
set_drag_forwarding(target_control)
# TargetControl.gd
extends Control
func _can_drop_data_fw(position, data, from_control):
return true
func _drop_data_fw(position, data, from_control):
my_handle_data(data) # Your handler method.
func _get_drag_data_fw(position, from_control):
set_drag_preview(my_preview)
return my_data()
[/gdscript]
[csharp]
// ThisControl.cs
public class ThisControl : Control
{
[Export]
public Control TargetControl { get; set; }
public override void _Ready()
{
SetDragForwarding(TargetControl);
}
}
// TargetControl.cs
public class TargetControl : Control
{
public void CanDropDataFw(Vector2 position, object data, Control fromControl)
{
return true;
}
public void DropDataFw(Vector2 position, object data, Control fromControl)
{
MyHandleData(data); // Your handler method.
}
public void GetDragDataFw(Vector2 position, Control fromControl)
{
SetDragPreview(MyPreview);
return MyData();
}
}
[/csharp]
[/codeblocks]
Forwards the handling of this control's [method _get_drag_data], [method _can_drop_data] and [method _drop_data] virtual functions to delegate callables.
For each argument, if not empty, the delegate callable is used, otherwise the local (virtual) function is used.
The function format for each callable should be exactly the same as the virtual functions described above.
</description>
</method>
<method name="set_drag_preview">