Improved drag&drop to work as n-piggeon wants to use, closes #5342
This commit is contained in:
parent
a41a70ea3e
commit
db9335f4c1
1 changed files with 40 additions and 15 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue