From e120e2265b87e27ed61d6c65c39ca5053f842721 Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Thu, 7 Apr 2016 12:59:50 +0200 Subject: [PATCH] CanvasItemEditorPlugin: Avoid selecting items from instanced scenes - This behaviour is only applied to click selection. Rect selection and List selection can still select these items (cherry picked from commit fab57f2fbc3d6ccd497bbde0174b05e5f52e260c) --- tools/editor/plugins/canvas_item_editor_plugin.cpp | 12 ++++++++++-- tools/editor/plugins/canvas_item_editor_plugin.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/editor/plugins/canvas_item_editor_plugin.cpp b/tools/editor/plugins/canvas_item_editor_plugin.cpp index 376ddd02693..2556a6a01a6 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.cpp +++ b/tools/editor/plugins/canvas_item_editor_plugin.cpp @@ -39,6 +39,7 @@ #include "scene/gui/grid_container.h" #include "tools/editor/animation_editor.h" #include "tools/editor/plugins/animation_player_editor_plugin.h" +#include "scene/resources/packed_scene.h" class SnapDialog : public ConfirmationDialog { @@ -415,6 +416,14 @@ void CanvasItemEditor::_keying_changed() { animation_hb->hide(); } +bool CanvasItemEditor::_is_part_of_subscene(CanvasItem *p_item) { + + Node* scene_node = get_tree()->get_edited_scene_root(); + Node* item_owner = p_item->get_owner(); + + return item_owner && item_owner!=scene_node && p_item!=scene_node && item_owner->get_filename()!=""; +} + // slow but modern computers should have no problem CanvasItem* CanvasItemEditor::_select_canvas_item_at_pos(const Point2& p_pos,Node* p_node,const Matrix32& p_parent_xform,const Matrix32& p_canvas_xform) { @@ -441,8 +450,7 @@ CanvasItem* CanvasItemEditor::_select_canvas_item_at_pos(const Point2& p_pos,Nod return r; } - - if (c && c->is_visible() && !c->has_meta("_edit_lock_") && !c->cast_to()) { + if (c && c->is_visible() && !c->has_meta("_edit_lock_") && !_is_part_of_subscene(c) && !c->cast_to()) { Rect2 rect = c->get_item_rect(); Point2 local_pos = (p_parent_xform * p_canvas_xform * c->get_transform()).affine_inverse().xform(p_pos); diff --git a/tools/editor/plugins/canvas_item_editor_plugin.h b/tools/editor/plugins/canvas_item_editor_plugin.h index 301c67756c6..22acfceed08 100644 --- a/tools/editor/plugins/canvas_item_editor_plugin.h +++ b/tools/editor/plugins/canvas_item_editor_plugin.h @@ -295,6 +295,7 @@ class CanvasItemEditor : public VBoxContainer { int handle_len; + bool _is_part_of_subscene(CanvasItem *p_item); CanvasItem* _select_canvas_item_at_pos(const Point2 &p_pos,Node* p_node,const Matrix32& p_parent_xform,const Matrix32& p_canvas_xform); void _find_canvas_items_at_pos(const Point2 &p_pos,Node* p_node,const Matrix32& p_parent_xform,const Matrix32& p_canvas_xform, Vector<_SelectResult> &r_items); void _find_canvas_items_at_rect(const Rect2& p_rect,Node* p_node,const Matrix32& p_parent_xform,const Matrix32& p_canvas_xform,List *r_items);