I tried the following, which works fine, except for point 2) which I had to workaround using groups:
var _dragging = false
if event is InputEventMouseMotion:
position += event.relative
func _on_Item_input_event( viewport, event, shape_idx ):
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT:
_dragging = true
_dragging = false
The group usage is a bit hacky, in a more "standard" input approach, we should be able to mark the input event as handled (so it would not propagate to further items), which doesn't seem to be possible at the moment.
Other approaches exist, such as picking stuff from a unique script instead of delegating that task to every item.