Generalized _find_canvas_items_at_pos to remove _select_canvas_items_at_pos

Removed some useless parameters
Removed old comments
This commit is contained in:
Gilles Roudiere 2017-07-17 23:28:19 +02:00
parent 2a0c0db028
commit 0d4b0ecb57
2 changed files with 18 additions and 71 deletions

View File

@ -241,7 +241,6 @@ void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
} else if (!Input::get_singleton()->is_mouse_button_pressed(0)) { } else if (!Input::get_singleton()->is_mouse_button_pressed(0)) {
List<Node *> &selection = editor_selection->get_selected_node_list(); List<Node *> &selection = editor_selection->get_selected_node_list();
Vector2 mouse_pos = viewport->get_local_mouse_pos(); Vector2 mouse_pos = viewport->get_local_mouse_pos();
if (selection.size() && viewport->get_rect().has_point(mouse_pos)) { if (selection.size() && viewport->get_rect().has_point(mouse_pos)) {
//just in case, make it work if over viewport //just in case, make it work if over viewport
@ -449,44 +448,7 @@ bool CanvasItemEditor::_is_part_of_subscene(CanvasItem *p_item) {
return item_owner && item_owner != scene_node && p_item != scene_node && item_owner->get_filename() != ""; return item_owner && item_owner != scene_node && p_item != scene_node && item_owner->get_filename() != "";
} }
// slow but modern computers should have no problem void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, Vector<_SelectResult> &r_items, unsigned int limit) {
CanvasItem *CanvasItemEditor::_select_canvas_item_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform) {
if (!p_node)
return NULL;
if (p_node->cast_to<Viewport>())
return NULL;
CanvasItem *c = p_node->cast_to<CanvasItem>();
for (int i = p_node->get_child_count() - 1; i >= 0; i--) {
CanvasItem *r = NULL;
if (c && !c->is_set_as_toplevel())
r = _select_canvas_item_at_pos(p_pos, p_node->get_child(i), p_parent_xform * c->get_transform(), p_canvas_xform);
else {
CanvasLayer *cl = p_node->cast_to<CanvasLayer>();
r = _select_canvas_item_at_pos(p_pos, p_node->get_child(i), transform, cl ? cl->get_transform() : p_canvas_xform); //use base transform
}
if (r)
return r;
}
if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !_is_part_of_subscene(c) && !c->cast_to<CanvasLayer>()) {
Rect2 rect = c->get_item_rect();
Point2 local_pos = (p_parent_xform * p_canvas_xform * c->get_transform()).affine_inverse().xform(p_pos);
if (rect.has_point(local_pos))
return c;
}
return NULL;
}
void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, Vector<_SelectResult> &r_items) {
if (!p_node) if (!p_node)
return; return;
if (p_node->cast_to<Viewport>()) if (p_node->cast_to<Viewport>())
@ -502,6 +464,9 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
CanvasLayer *cl = p_node->cast_to<CanvasLayer>(); CanvasLayer *cl = p_node->cast_to<CanvasLayer>();
_find_canvas_items_at_pos(p_pos, p_node->get_child(i), transform, cl ? cl->get_transform() : p_canvas_xform, r_items); //use base transform _find_canvas_items_at_pos(p_pos, p_node->get_child(i), transform, cl ? cl->get_transform() : p_canvas_xform, r_items); //use base transform
} }
if (limit != 0 && r_items.size() >= limit)
return;
} }
if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !c->cast_to<CanvasLayer>()) { if (c && c->is_visible_in_tree() && !c->has_meta("_edit_lock_") && !c->cast_to<CanvasLayer>()) {
@ -766,7 +731,7 @@ CanvasItem *CanvasItemEditor::get_single_item() {
return single_item; return single_item;
} }
CanvasItemEditor::DragType CanvasItemEditor::_find_drag_type(const Transform2D &p_xform, const Rect2 &p_local_rect, const Point2 &p_click, Vector2 &r_point) { CanvasItemEditor::DragType CanvasItemEditor::_find_drag_type(const Point2 &p_click, Vector2 &r_point) {
CanvasItem *canvas_item = get_single_item(); CanvasItem *canvas_item = get_single_item();
@ -805,8 +770,6 @@ CanvasItemEditor::DragType CanvasItemEditor::_find_drag_type(const Transform2D &
float radius = (select_handle->get_size().width / 2) * 1.5; float radius = (select_handle->get_size().width / 2) * 1.5;
//try draggers
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
int prev = (i + 3) % 4; int prev = (i + 3) % 4;
@ -831,14 +794,6 @@ CanvasItemEditor::DragType CanvasItemEditor::_find_drag_type(const Transform2D &
return dragger[i * 2 + 1]; return dragger[i * 2 + 1];
} }
/*
if (rect.has_point(xform.affine_inverse().xform(p_click))) {
r_point=_find_topleftmost_point();
return DRAG_ALL;
}*/
//try draggers
return DRAG_NONE; return DRAG_NONE;
} }
@ -1390,19 +1345,16 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
} }
} }
CanvasItem *single_item = get_single_item(); // Single seleted item
CanvasItem *canvas_item = get_single_item();
if (single_item) { if (canvas_item) {
//try single canvas_item edit
CanvasItem *canvas_item = single_item;
CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
ERR_FAIL_COND(!se); ERR_FAIL_COND(!se);
Point2 click = b->get_position(); Point2 click = b->get_position();
// Rotation
if ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { if ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) {
drag = DRAG_ROTATE; drag = DRAG_ROTATE;
drag_from = transform.affine_inverse().xform(click); drag_from = transform.affine_inverse().xform(click);
se->undo_state = canvas_item->edit_get_state(); se->undo_state = canvas_item->edit_get_state();
@ -1413,22 +1365,17 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
return; return;
} }
Transform2D xform = transform * canvas_item->get_global_transform_with_canvas();
Rect2 rect = canvas_item->get_item_rect();
//float handle_radius = handle_len * 1.4144; //magic number, guess what it means!
if (tool == TOOL_SELECT) { if (tool == TOOL_SELECT) {
drag = _find_drag_type(xform, rect, click, drag_point_from); // Open a sub-scene on double-click
if (b->is_doubleclick()) { if (b->is_doubleclick()) {
if (canvas_item->get_filename() != "" && canvas_item != editor->get_edited_scene()) { if (canvas_item->get_filename() != "" && canvas_item != editor->get_edited_scene()) {
editor->open_request(canvas_item->get_filename()); editor->open_request(canvas_item->get_filename());
return; return;
} }
} }
// Drag
drag = _find_drag_type(click, drag_point_from);
if (drag != DRAG_NONE && (!Cbone || drag != DRAG_ALL)) { if (drag != DRAG_NONE && (!Cbone || drag != DRAG_ALL)) {
drag_from = transform.affine_inverse().xform(click); drag_from = transform.affine_inverse().xform(click);
se->undo_state = canvas_item->edit_get_state(); se->undo_state = canvas_item->edit_get_state();
@ -1436,11 +1383,9 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
se->undo_pivot = canvas_item->cast_to<Node2D>()->edit_get_pivot(); se->undo_pivot = canvas_item->cast_to<Node2D>()->edit_get_pivot();
if (canvas_item->cast_to<Control>()) if (canvas_item->cast_to<Control>())
se->undo_pivot = canvas_item->cast_to<Control>()->get_pivot_offset(); se->undo_pivot = canvas_item->cast_to<Control>()->get_pivot_offset();
return; return;
} }
} else { } else {
drag = DRAG_NONE; drag = DRAG_NONE;
} }
} }
@ -1475,7 +1420,10 @@ void CanvasItemEditor::_viewport_gui_input(const Ref<InputEvent> &p_event) {
c = c->get_parent_item(); c = c->get_parent_item();
} }
if (!c) { if (!c) {
c = _select_canvas_item_at_pos(click, scene, transform, Transform2D()); Vector<_SelectResult> selection;
_find_canvas_items_at_pos(click, scene, transform, Transform2D(), selection, 1);
if (!selection.empty())
c = selection[0].item;
CanvasItem *cn = c; CanvasItem *cn = c;

View File

@ -303,8 +303,7 @@ class CanvasItemEditor : public VBoxContainer {
int handle_len; int handle_len;
bool _is_part_of_subscene(CanvasItem *p_item); bool _is_part_of_subscene(CanvasItem *p_item);
CanvasItem *_select_canvas_item_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform); void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, Vector<_SelectResult> &r_items, unsigned int limit = 0);
void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, Vector<_SelectResult> &r_items);
void _find_canvas_items_at_rect(const Rect2 &p_rect, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, List<CanvasItem *> *r_items); void _find_canvas_items_at_rect(const Rect2 &p_rect, Node *p_node, const Transform2D &p_parent_xform, const Transform2D &p_canvas_xform, List<CanvasItem *> *r_items);
bool _select(CanvasItem *item, Point2 p_click_pos, bool p_append, bool p_drag = true); bool _select(CanvasItem *item, Point2 p_click_pos, bool p_append, bool p_drag = true);
@ -325,7 +324,7 @@ class CanvasItemEditor : public VBoxContainer {
void _key_move(const Vector2 &p_dir, bool p_snap, KeyMoveMODE p_move_mode); void _key_move(const Vector2 &p_dir, bool p_snap, KeyMoveMODE p_move_mode);
void _list_select(const Ref<InputEventMouseButton> &b); void _list_select(const Ref<InputEventMouseButton> &b);
DragType _find_drag_type(const Transform2D &p_xform, const Rect2 &p_local_rect, const Point2 &p_click, Vector2 &r_point); DragType _find_drag_type(const Point2 &p_click, Vector2 &r_point);
void _prepare_drag(const Point2 &p_click_pos); void _prepare_drag(const Point2 &p_click_pos);
void _popup_callback(int p_op); void _popup_callback(int p_op);