diff options
Diffstat (limited to 'scene/gui/graph_edit.cpp')
-rw-r--r-- | scene/gui/graph_edit.cpp | 101 |
1 files changed, 91 insertions, 10 deletions
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index deb3151798..9472c589ca 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -1,6 +1,9 @@ #include "graph_edit.h" #include "os/input.h" #include "os/keyboard.h" +#include "scene/gui/box_container.h" + + bool GraphEditFilter::has_point(const Point2& p_point) const { return ge->_filter_input(p_point); @@ -42,7 +45,6 @@ bool GraphEdit::is_node_connected(const StringName& p_from, int p_from_port,cons void GraphEdit::disconnect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port){ - for(List<Connection>::Element *E=connections.front();E;E=E->next()) { if (E->get().from==p_from && E->get().from_port==p_from_port && E->get().to==p_to && E->get().to_port==p_to_port) { @@ -54,14 +56,22 @@ void GraphEdit::disconnect_node(const StringName& p_from, int p_from_port,const } } +bool GraphEdit::clips_input() const { + + return true; +} + void GraphEdit::get_connection_list(List<Connection> *r_connections) const { *r_connections=connections; } +Vector2 GraphEdit::get_scroll_ofs() const{ -void GraphEdit::_scroll_moved(double) { + return Vector2(h_scroll->get_val(),v_scroll->get_val()); +} +void GraphEdit::_scroll_moved(double) { _update_scroll_offset(); top_layer->update(); @@ -149,6 +159,7 @@ void GraphEdit::add_child_notify(Node *p_child) { top_layer->call_deferred("raise"); //top layer always on top! GraphNode *gn = p_child->cast_to<GraphNode>(); if (gn) { + gn->set_scale(Vector2(zoom,zoom)); gn->connect("offset_changed",this,"_graph_node_moved",varray(gn)); gn->connect("raise_request",this,"_graph_node_raised",varray(gn)); _graph_node_moved(gn); @@ -182,6 +193,8 @@ void GraphEdit::_notification(int p_what) { h_scroll->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,hmin.height); h_scroll->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,0); + zoom_icon->set_texture( get_icon("Zoom", "EditorIcons")); + } if (p_what==NOTIFICATION_DRAW) { VS::get_singleton()->canvas_item_set_clip(get_canvas_item(),true); @@ -382,8 +395,6 @@ void GraphEdit::_top_layer_input(const InputEvent& p_ev) { } - - } void GraphEdit::_draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color) { @@ -523,7 +534,9 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { if (!gn) continue; - bool in_box = gn->get_rect().intersects(box_selecting_rect); + Rect2 r = gn->get_rect(); + r.size*=zoom; + bool in_box = r.intersects(box_selecting_rect); if (in_box) gn->set_selected(box_selection_mode_aditive); @@ -552,7 +565,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { } top_layer->update(); } else { - emit_signal("popup_request", Vector2(b.global_x, b.global_y)); + if (connecting) { + connecting = false; + top_layer->update(); + } else { + emit_signal("popup_request", Vector2(b.global_x, b.global_y)); + } } } @@ -562,8 +580,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { for(int i=get_child_count()-1;i>=0;i--) { GraphNode *gn=get_child(i)->cast_to<GraphNode>(); - if (gn && gn->get_rect().has_point(get_local_mouse_pos())) - gn->set_selected(false); + if (gn) { + Rect2 r = gn->get_rect(); + r.size*=zoom; + if (r.has_point(get_local_mouse_pos())) + gn->set_selected(false); + } } } @@ -592,8 +614,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { gn=get_child(i)->cast_to<GraphNode>(); - if (gn && gn->get_rect().has_point(get_local_mouse_pos())) - break; + if (gn) { + Rect2 r = gn->get_rect(); + r.size*=zoom; + if (r.has_point(get_local_mouse_pos())) + break; + } } if (gn) { @@ -622,6 +648,9 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { } } else { + if (_filter_input(Vector2(b.x,b.y))) + return; + box_selecting = true; box_selecting_from = get_local_mouse_pos(); if (b.mod.control) { @@ -666,6 +695,14 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { previus_selected.clear(); top_layer->update(); } + + if (b.button_index==BUTTON_WHEEL_UP && b.pressed) { + sl_zoom->set_val(zoom/0.9); + } + + if (b.button_index==BUTTON_WHEEL_DOWN && b.pressed) { + sl_zoom->set_val(zoom*0.9); + } } if (p_ev.type==InputEvent::KEY && p_ev.key.scancode==KEY_D && p_ev.key.pressed && p_ev.key.mod.command) { @@ -686,6 +723,29 @@ void GraphEdit::clear_connections() { update(); } +void GraphEdit::set_zoom(float p_zoom) { + + if (p_zoom<0.01) p_zoom=0.01; + if (p_zoom>4) p_zoom=4; + if (zoom == p_zoom) + return; + + float prev_zoom = zoom; + zoom = p_zoom; + for (int i = 0; i < get_child_count(); i++) { + GraphNode *child = get_child(i)->cast_to<GraphNode>(); + if (!child) + continue; + Point2 ofs = child->get_offset() / prev_zoom * zoom; + child->set_scale(Vector2(zoom,zoom)); + child->set_offset(ofs); + } + update(); +} + +float GraphEdit::get_zoom() const { + return zoom; +} void GraphEdit::set_right_disconnects(bool p_enable) { @@ -718,6 +778,10 @@ void GraphEdit::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_node_connected","from","from_port","to","to_port"),&GraphEdit::is_node_connected); ObjectTypeDB::bind_method(_MD("disconnect_node","from","from_port","to","to_port"),&GraphEdit::disconnect_node); ObjectTypeDB::bind_method(_MD("get_connection_list"),&GraphEdit::_get_connection_list); + ObjectTypeDB::bind_method(_MD("get_scroll_ofs"),&GraphEdit::get_scroll_ofs); + + ObjectTypeDB::bind_method(_MD("set_zoom","p_zoom"),&GraphEdit::set_zoom); + ObjectTypeDB::bind_method(_MD("get_zoom"),&GraphEdit::get_zoom); ObjectTypeDB::bind_method(_MD("set_right_disconnects","enable"),&GraphEdit::set_right_disconnects); ObjectTypeDB::bind_method(_MD("is_right_disconnects_enabled"),&GraphEdit::is_right_disconnects_enabled); @@ -770,4 +834,21 @@ GraphEdit::GraphEdit() { h_scroll->connect("value_changed", this,"_scroll_moved"); v_scroll->connect("value_changed", this,"_scroll_moved"); + + zoom = 1; + + HBoxContainer* tools = memnew( HBoxContainer ); + add_child(tools); + + zoom_icon = memnew( TextureFrame ); + tools->add_child(zoom_icon); + + sl_zoom = memnew( HSlider ); + sl_zoom->set_min(0.01); + sl_zoom->set_max(4); + sl_zoom->set_val(1); + sl_zoom->set_step(0.01); + sl_zoom->connect("value_changed", this, "set_zoom"); + tools->add_child(sl_zoom); + sl_zoom->set_custom_minimum_size(Size2(200,0)); } |