Merge pull request #23748 from groud/fix_drag_and_drop_canvas_items

Fixes drag and drog of image files on scaled nodes
This commit is contained in:
Rémi Verschelde 2018-11-17 17:20:50 +01:00 committed by GitHub
commit 9eb4b6d91a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 19 deletions

View file

@ -5070,19 +5070,13 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String &
editor_data->get_undo_redo().add_do_property(child, "polygon", list); editor_data->get_undo_redo().add_do_property(child, "polygon", list);
} }
// locate at preview position // Compute the global position
Point2 pos = Point2(0, 0); Transform2D xform = canvas_item_editor->get_canvas_transform();
if (parent && parent->has_method("get_global_position")) { Point2 target_position = xform.affine_inverse().xform(p_point);
pos = parent->call("get_global_position");
}
Transform2D trans = canvas->get_canvas_transform();
Point2 target_position = (p_point - trans.get_origin()) / trans.get_scale().x - pos;
if (default_type == "Polygon2D" || default_type == "TouchScreenButton" || default_type == "TextureRect" || default_type == "NinePatchRect") {
target_position -= texture_size / 2;
}
// there's nothing to be used as source position so snapping will work as absolute if enabled // there's nothing to be used as source position so snapping will work as absolute if enabled
target_position = canvas->snap_point(target_position); target_position = canvas_item_editor->snap_point(target_position);
editor_data->get_undo_redo().add_do_method(child, "set_position", target_position); editor_data->get_undo_redo().add_do_method(child, "set_global_position", target_position);
} }
bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, const Point2 &p_point) { bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, const Point2 &p_point) {
@ -5117,8 +5111,8 @@ bool CanvasItemEditorViewport::_create_instance(Node *parent, String &path, cons
CanvasItem *parent_ci = Object::cast_to<CanvasItem>(parent); CanvasItem *parent_ci = Object::cast_to<CanvasItem>(parent);
if (parent_ci) { if (parent_ci) {
Vector2 target_pos = canvas->get_canvas_transform().affine_inverse().xform(p_point); Vector2 target_pos = canvas_item_editor->get_canvas_transform().affine_inverse().xform(p_point);
target_pos = canvas->snap_point(target_pos); target_pos = canvas_item_editor->snap_point(target_pos);
target_pos = parent_ci->get_global_transform_with_canvas().affine_inverse().xform(target_pos); target_pos = parent_ci->get_global_transform_with_canvas().affine_inverse().xform(target_pos);
editor_data->get_undo_redo().add_do_method(instanced_scene, "set_position", target_pos); editor_data->get_undo_redo().add_do_method(instanced_scene, "set_position", target_pos);
} }
@ -5238,7 +5232,7 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian
if (!preview_node->get_parent()) { // create preview only once if (!preview_node->get_parent()) { // create preview only once
_create_preview(files); _create_preview(files);
} }
Transform2D trans = canvas->get_canvas_transform(); Transform2D trans = canvas_item_editor->get_canvas_transform();
preview_node->set_position((p_point - trans.get_origin()) / trans.get_scale().x); preview_node->set_position((p_point - trans.get_origin()) / trans.get_scale().x);
label->set_text(vformat(TTR("Adding %s..."), default_type)); label->set_text(vformat(TTR("Adding %s..."), default_type));
} }
@ -5333,7 +5327,7 @@ void CanvasItemEditorViewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("_on_mouse_exit"), &CanvasItemEditorViewport::_on_mouse_exit); ClassDB::bind_method(D_METHOD("_on_mouse_exit"), &CanvasItemEditorViewport::_on_mouse_exit);
} }
CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas) { CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor) {
default_type = "Sprite"; default_type = "Sprite";
// Node2D // Node2D
types.push_back("Sprite"); types.push_back("Sprite");
@ -5348,7 +5342,7 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte
target_node = NULL; target_node = NULL;
editor = p_node; editor = p_node;
editor_data = editor->get_scene_tree_dock()->get_editor_data(); editor_data = editor->get_scene_tree_dock()->get_editor_data();
canvas = p_canvas; canvas_item_editor = p_canvas_item_editor;
preview_node = memnew(Node2D); preview_node = memnew(Node2D);
accept = memnew(AcceptDialog); accept = memnew(AcceptDialog);

View file

@ -608,7 +608,7 @@ class CanvasItemEditorViewport : public Control {
EditorNode *editor; EditorNode *editor;
EditorData *editor_data; EditorData *editor_data;
CanvasItemEditor *canvas; CanvasItemEditor *canvas_item_editor;
Node2D *preview_node; Node2D *preview_node;
AcceptDialog *accept; AcceptDialog *accept;
WindowDialog *selector; WindowDialog *selector;
@ -642,7 +642,7 @@ public:
virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const; virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
virtual void drop_data(const Point2 &p_point, const Variant &p_data); virtual void drop_data(const Point2 &p_point, const Variant &p_data);
CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas); CanvasItemEditorViewport(EditorNode *p_node, CanvasItemEditor *p_canvas_item_editor);
~CanvasItemEditorViewport(); ~CanvasItemEditorViewport();
}; };