Browse Source

Add zoom to GraphEdit

Also fix some responsiveness issues:
-Box selection no longer visible when connecting.
-Allow cancel connection with mouse's right button.
MarianoGNU 9 years ago
parent
commit
c2aaeaaf5a
3 changed files with 74 additions and 11 deletions
  1. 61 8
      scene/gui/graph_edit.cpp
  2. 5 0
      scene/gui/graph_edit.h
  3. 8 3
      scene/gui/graph_node.cpp

+ 61 - 8
scene/gui/graph_edit.cpp

@@ -151,6 +151,7 @@ void GraphEdit::add_child_notify(Node *p_child) {
 	top_layer->call_deferred("raise"); //top layer always on top!
 	top_layer->call_deferred("raise"); //top layer always on top!
 	GraphNode *gn = p_child->cast_to<GraphNode>();
 	GraphNode *gn = p_child->cast_to<GraphNode>();
 	if (gn) {
 	if (gn) {
+		gn->set_scale(Vector2(zoom,zoom));
 		gn->connect("offset_changed",this,"_graph_node_moved",varray(gn));
 		gn->connect("offset_changed",this,"_graph_node_moved",varray(gn));
 		gn->connect("raise_request",this,"_graph_node_raised",varray(gn));
 		gn->connect("raise_request",this,"_graph_node_raised",varray(gn));
 		_graph_node_moved(gn);
 		_graph_node_moved(gn);
@@ -384,8 +385,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) {
 void GraphEdit::_draw_cos_line(const Vector2& p_from, const Vector2& p_to,const Color& p_color) {
@@ -525,7 +524,9 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 			if (!gn)
 			if (!gn)
 				continue;
 				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)
 			if (in_box)
 				gn->set_selected(box_selection_mode_aditive);
 				gn->set_selected(box_selection_mode_aditive);
@@ -554,7 +555,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 				}
 				}
 				top_layer->update();
 				top_layer->update();
 			} else {
 			} 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));
+				}
 			}
 			}
 		}
 		}
 
 
@@ -564,8 +570,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 				for(int i=get_child_count()-1;i>=0;i--) {
 				for(int i=get_child_count()-1;i>=0;i--) {
 					GraphNode *gn=get_child(i)->cast_to<GraphNode>();
 					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);
+					}
 				}
 				}
 			}
 			}
 
 
@@ -594,8 +604,12 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 
 
 				gn=get_child(i)->cast_to<GraphNode>();
 				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) {
 			if (gn) {
@@ -624,6 +638,9 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 				}
 				}
 
 
 			} else {
 			} else {
+				if (_filter_input(Vector2(b.x,b.y)))
+					return;
+
 				box_selecting = true;
 				box_selecting = true;
 				box_selecting_from = get_local_mouse_pos();
 				box_selecting_from = get_local_mouse_pos();
 				if (b.mod.control) {
 				if (b.mod.control) {
@@ -668,6 +685,14 @@ void GraphEdit::_input_event(const InputEvent& p_ev) {
 			previus_selected.clear();
 			previus_selected.clear();
 			top_layer->update();
 			top_layer->update();
 		}
 		}
+
+		if (b.button_index==BUTTON_WHEEL_UP && b.pressed) {
+			set_zoom(zoom/0.9);
+		}
+
+		if (b.button_index==BUTTON_WHEEL_DOWN && b.pressed) {
+			set_zoom(zoom*0.9);
+		}
 	}
 	}
 
 
 	if (p_ev.type==InputEvent::KEY && p_ev.key.scancode==KEY_D && p_ev.key.pressed && p_ev.key.mod.command) {
 	if (p_ev.type==InputEvent::KEY && p_ev.key.scancode==KEY_D && p_ev.key.pressed && p_ev.key.mod.command) {
@@ -688,6 +713,29 @@ void GraphEdit::clear_connections() {
 	update();
 	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) {
 void GraphEdit::set_right_disconnects(bool p_enable) {
 
 
@@ -722,6 +770,9 @@ void GraphEdit::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("get_connection_list"),&GraphEdit::_get_connection_list);
 	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("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("set_right_disconnects","enable"),&GraphEdit::set_right_disconnects);
 	ObjectTypeDB::bind_method(_MD("is_right_disconnects_enabled"),&GraphEdit::is_right_disconnects_enabled);
 	ObjectTypeDB::bind_method(_MD("is_right_disconnects_enabled"),&GraphEdit::is_right_disconnects_enabled);
 
 
@@ -773,4 +824,6 @@ GraphEdit::GraphEdit() {
 
 
 	h_scroll->connect("value_changed", this,"_scroll_moved");
 	h_scroll->connect("value_changed", this,"_scroll_moved");
 	v_scroll->connect("value_changed", this,"_scroll_moved");
 	v_scroll->connect("value_changed", this,"_scroll_moved");
+
+	zoom = 1;
 }
 }

+ 5 - 0
scene/gui/graph_edit.h

@@ -53,6 +53,8 @@ private:
 	bool just_selected;
 	bool just_selected;
 	Vector2 drag_accum;
 	Vector2 drag_accum;
 
 
+	float zoom;
+
 	bool box_selecting;
 	bool box_selecting;
 	bool box_selection_mode_aditive;
 	bool box_selection_mode_aditive;
 	Point2 box_selecting_from;
 	Point2 box_selecting_from;
@@ -96,6 +98,9 @@ public:
 	void disconnect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
 	void disconnect_node(const StringName& p_from, int p_from_port,const StringName& p_to,int p_to_port);
 	void clear_connections();
 	void clear_connections();
 
 
+	void set_zoom(float p_zoom);
+	float get_zoom() const;
+
 	GraphEditFilter *get_top_layer() const { return top_layer; }
 	GraphEditFilter *get_top_layer() const { return top_layer; }
 	void get_connection_list(List<Connection> *r_connections) const;
 	void get_connection_list(List<Connection> *r_connections) const;
 
 

+ 8 - 3
scene/gui/graph_node.cpp

@@ -474,7 +474,10 @@ Vector2 GraphNode::get_connection_input_pos(int p_idx) {
 		_connpos_update();
 		_connpos_update();
 
 
 	ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Vector2());
 	ERR_FAIL_INDEX_V(p_idx,conn_input_cache.size(),Vector2());
-	return conn_input_cache[p_idx].pos;
+	Vector2 pos = conn_input_cache[p_idx].pos;
+	pos.x *= get_scale().x;
+	pos.y *= get_scale().y;
+	return pos;
 }
 }
 
 
 int GraphNode::get_connection_input_type(int p_idx) {
 int GraphNode::get_connection_input_type(int p_idx) {
@@ -501,8 +504,10 @@ Vector2 GraphNode::get_connection_output_pos(int p_idx){
 		_connpos_update();
 		_connpos_update();
 
 
 	ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Vector2());
 	ERR_FAIL_INDEX_V(p_idx,conn_output_cache.size(),Vector2());
-	return conn_output_cache[p_idx].pos;
-
+	Vector2 pos = conn_output_cache[p_idx].pos;
+	pos.x *= get_scale().x;
+	pos.y *= get_scale().y;
+	return pos;
 }
 }
 
 
 int GraphNode::get_connection_output_type(int p_idx) {
 int GraphNode::get_connection_output_type(int p_idx) {