You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.4 KiB
54 lines
1.4 KiB
6 months ago
|
@tool
|
||
|
extends Tree
|
||
|
|
||
|
## Script that handles drag and drop on the layer tree.
|
||
|
|
||
|
|
||
|
signal layer_moved(from:int, to:int)
|
||
|
|
||
|
#region DRAG AND DROP
|
||
|
################################################################################
|
||
|
|
||
|
func _get_drag_data(position:Vector2) -> Variant:
|
||
|
if get_selected() == null or get_selected() == get_root():
|
||
|
return
|
||
|
|
||
|
if find_parent('StyleEditor').current_style.inherits != null:
|
||
|
return
|
||
|
|
||
|
drop_mode_flags = DROP_MODE_INBETWEEN
|
||
|
var preview := Label.new()
|
||
|
preview.text = " "+get_selected().get_text(0)
|
||
|
preview.add_theme_stylebox_override('normal', get_theme_stylebox("Background", "EditorStyles"))
|
||
|
set_drag_preview(preview)
|
||
|
|
||
|
return get_selected()
|
||
|
|
||
|
|
||
|
func _can_drop_data(position:Vector2, data:Variant) -> bool:
|
||
|
return data is TreeItem
|
||
|
|
||
|
|
||
|
func _drop_data(position:Vector2, item:Variant) -> void:
|
||
|
var to_item := get_item_at_position(position)
|
||
|
var drop_section := get_drop_section_at_position(position)
|
||
|
|
||
|
if to_item == get_root():
|
||
|
if item.get_index() != 0:
|
||
|
layer_moved.emit(item.get_index(), 0)
|
||
|
return
|
||
|
|
||
|
if to_item == null:
|
||
|
if item.get_index() != get_root().get_child_count()-1:
|
||
|
layer_moved.emit(item.get_index(), get_root().get_child_count()-1)
|
||
|
return
|
||
|
|
||
|
var to_idx: int = to_item.get_index()+max(0, drop_section)
|
||
|
if to_idx > item.get_index():
|
||
|
to_idx -= 1
|
||
|
|
||
|
if to_idx != item.get_index():
|
||
|
layer_moved.emit(item.get_index(), to_idx)
|
||
|
|
||
|
#endregion
|