summaryrefslogtreecommitdiff
path: root/scene/gui/graph_edit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/graph_edit.cpp')
-rw-r--r--scene/gui/graph_edit.cpp101
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));
}