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.