How to add drag and drop to a Tree node?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By PLyczkowski
:warning: Old Version Published before Godot 3 was released.

I have a Tree node that I add with an addon to the Godot 3 editor:

enter image description here

How would I go about adding drag and drop to it?

:bust_in_silhouette: Reply From: Xrayez

Figured how to do so myself so posting a snippet:

tool
extends Tree

signal moved(item, to_item, shift)


func get_drag_data(position): # begin drag
	set_drop_mode_flags(DROP_MODE_INBETWEEN | DROP_MODE_ON_ITEM)

	var preview = Label.new()
	preview.text = get_selected().get_text(0)
	set_drag_preview(preview) # not necessary
	
	return get_selected() # TreeItem

	
func can_drop_data(position, data):
	return data is TreeItem # you shall not pass!

	
func drop_data(position, item): # end drag
	var to_item = get_item_at_position(position)
	var shift = get_drop_section_at_position(position)
	# shift == 0 if dropping on item, -1, +1 if in between

	emit_signal('moved', item, to_item, shift)

From there you should update your tree according to requested moved signal from data which must determine the order of items (for this I just clear all items and repopulate them). Note that the extended Tree class should likely operate in tool mode if writing plugins for this to work. You could embed your data in TreeItems with set_metadata per column or set_meta per item for dragging and other purposes.