Improved drag&drop to work as n-piggeon wants to use, closes #5342

This commit is contained in:
Juan Linietsky 2016-07-01 10:34:38 -03:00
parent a41a70ea3e
commit db9335f4c1

View file

@ -1788,15 +1788,12 @@ void Viewport::_gui_input_event(InputEvent p_event) {
if (p_event.mouse_button.button_index==BUTTON_LEFT) { if (p_event.mouse_button.button_index==BUTTON_LEFT) {
gui.drag_accum=Vector2(); gui.drag_accum=Vector2();
gui.drag_attempted=false; gui.drag_attempted=false;
if (gui.drag_data.get_type()!=Variant::NIL) {
_propagate_viewport_notification(this,NOTIFICATION_DRAG_END);
}
gui.drag_data=Variant();
} }
} }
p_event.mouse_button.global_x = pos.x; p_event.mouse_button.global_x = pos.x;
p_event.mouse_button.global_y = pos.y; p_event.mouse_button.global_y = pos.y;
@ -1832,30 +1829,55 @@ void Viewport::_gui_input_event(InputEvent p_event) {
get_tree()->call_group(SceneTree::GROUP_CALL_REALTIME,"windows","_cancel_input_ID",p_event.ID); get_tree()->call_group(SceneTree::GROUP_CALL_REALTIME,"windows","_cancel_input_ID",p_event.ID);
get_tree()->set_input_as_handled(); get_tree()->set_input_as_handled();
if (gui.drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) {
//alternate drop use (when using force_drag(), as proposed by #5342
if (gui.mouse_focus && gui.mouse_focus->can_drop_data(pos,gui.drag_data)) {
gui.mouse_focus->drop_data(pos,gui.drag_data);
}
gui.drag_data=Variant();
if (gui.drag_preview) {
memdelete( gui.drag_preview );
gui.drag_preview=NULL;
}
_propagate_viewport_notification(this,NOTIFICATION_DRAG_END);
//change mouse accordingly
}
_gui_cancel_tooltip(); _gui_cancel_tooltip();
//gui.tooltip_popup->hide(); //gui.tooltip_popup->hide();
} else { } else {
if (gui.drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) {
if (gui.mouse_over) {
Size2 pos = mpos;
pos = gui.focus_inv_xform.xform(pos);
if (gui.mouse_over->can_drop_data(pos,gui.drag_data)) {
gui.mouse_over->drop_data(pos,gui.drag_data);
}
}
if (gui.drag_preview && p_event.mouse_button.button_index==BUTTON_LEFT) { if (gui.drag_preview && p_event.mouse_button.button_index==BUTTON_LEFT) {
memdelete( gui.drag_preview ); memdelete( gui.drag_preview );
gui.drag_preview=NULL; gui.drag_preview=NULL;
} }
if (!gui.mouse_focus) {
if (gui.mouse_over && gui.drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) {
Size2 pos = mpos;
pos = gui.focus_inv_xform.xform(pos);
if (gui.mouse_over->can_drop_data(pos,gui.drag_data)) {
gui.mouse_over->drop_data(pos,gui.drag_data);
}
gui.drag_data=Variant(); gui.drag_data=Variant();
_propagate_viewport_notification(this,NOTIFICATION_DRAG_END); _propagate_viewport_notification(this,NOTIFICATION_DRAG_END);
//change mouse accordingly //change mouse accordingly
} }
if (!gui.mouse_focus) {
//release event is only sent if a mouse focus (previously pressed button) exists
break; break;
} }
@ -1875,10 +1897,10 @@ void Viewport::_gui_input_event(InputEvent p_event) {
gui.mouse_focus_button=-1; gui.mouse_focus_button=-1;
} }
if (gui.drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) { /*if (gui.drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) {
_propagate_viewport_notification(this,NOTIFICATION_DRAG_END); _propagate_viewport_notification(this,NOTIFICATION_DRAG_END);
gui.drag_data=Variant(); //always clear gui.drag_data=Variant(); //always clear
} }*/
get_tree()->call_group(SceneTree::GROUP_CALL_REALTIME,"windows","_cancel_input_ID",p_event.ID); get_tree()->call_group(SceneTree::GROUP_CALL_REALTIME,"windows","_cancel_input_ID",p_event.ID);
@ -2176,6 +2198,9 @@ void Viewport::_gui_remove_from_modal_stack(List<Control*>::Element *MI,ObjectID
void Viewport::_gui_force_drag(Control *p_base, const Variant& p_data, Control *p_control) { void Viewport::_gui_force_drag(Control *p_base, const Variant& p_data, Control *p_control) {
ERR_EXPLAIN("Drag data must be a value");
ERR_FAIL_COND(p_data.get_type()==Variant::NIL);
gui.drag_data=p_data; gui.drag_data=p_data;
gui.mouse_focus=NULL; gui.mouse_focus=NULL;