Browse Source

WIP work on graph nodes and editing

Juan Linietsky 10 years ago
parent
commit
cf0a419efa
3 changed files with 245 additions and 0 deletions
  1. 191 0
      scene/gui/graph_node.cpp
  2. 54 0
      scene/gui/graph_node.h
  3. BIN
      scene/resources/default_theme/graph_node.png

+ 191 - 0
scene/gui/graph_node.cpp

@@ -0,0 +1,191 @@
+#include "graph_node.h"
+
+
+void GraphNode::_resort() {
+
+
+
+	int sep=get_constant("separation");
+	Ref<StyleBox> sb=get_stylebox("frame");
+	bool first=true;
+
+	Size2 minsize;
+
+	for(int i=0;i<get_child_count();i++) {
+		Control *c=get_child(i)->cast_to<Control>();
+		if (!c || !c->is_visible())
+			continue;
+		if (c->is_set_as_toplevel())
+			continue;
+
+		Size2i size=c->get_combined_minimum_size();
+
+		minsize.y+=size.y;
+		minsize.x=MAX(minsize.x,size.x);
+
+		if (first)
+			first=false;
+		else
+			minsize.y+=sep;
+
+	}
+
+	int vofs=0;
+	int w = get_size().x - sb->get_minimum_size().x;
+
+
+	for(int i=0;i<get_child_count();i++) {
+		Control *c=get_child(i)->cast_to<Control>();
+		if (!c || !c->is_visible())
+			continue;
+		if (c->is_set_as_toplevel())
+			continue;
+
+		Size2i size=c->get_combined_minimum_size();
+
+		Rect2 r(sb->get_margin(MARGIN_LEFT),sb->get_margin(MARGIN_TOP)+vofs,w,size.y);
+
+		fit_child_in_rect(c,r);
+
+
+		if (vofs>0)
+			vofs+=sep;
+		vofs+=size.y;
+
+	}
+
+}
+
+
+void GraphNode::_notification(int p_what) {
+
+	if (p_what==NOTIFICATION_DRAW) {
+
+		Ref<StyleBox> sb=get_stylebox("frame");
+		draw_style_box(sb,Rect2(Point2(),get_size()));
+	}
+	if (p_what==NOTIFICATION_SORT_CHILDREN) {
+
+		_resort();
+	}
+
+}
+
+void GraphNode::set_title(const String& p_title) {
+
+	title=p_title;
+	update();
+}
+
+String GraphNode::get_title() const {
+
+	return title;
+}
+
+void GraphNode::set_slot(int p_idx,int p_type_left,int p_index_left,const Color& p_color_left, int p_type_right,int p_index_right,const Color& p_color_right) {
+
+	ERR_FAIL_COND(p_idx<0);
+	Slot s;
+	s.type_left=p_type_left;
+	s.color_left=p_color_left;
+	s.index_left=p_index_left;
+	s.type_right=p_type_right;
+	s.color_right=p_color_right;
+	s.index_right=p_index_right;
+	slot_info[p_idx]=s;
+	update();
+}
+
+void GraphNode::clear_slot(int p_idx){
+
+	slot_info.erase(p_idx);
+	update();
+}
+void GraphNode::clear_all_slots(){
+
+	slot_info.clear();
+	update();
+}
+int GraphNode::get_slot_type_left(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return TYPE_DISABLED;
+	return slot_info[p_idx].type_left;
+
+}
+int GraphNode::get_slot_index_left(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return TYPE_DISABLED;
+	return slot_info[p_idx].index_left;
+
+}
+Color GraphNode::get_slot_color_left(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return Color();
+	return slot_info[p_idx].color_left;
+
+}
+
+int GraphNode::get_slot_type_right(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return TYPE_DISABLED;
+	return slot_info[p_idx].type_right;
+
+}
+int GraphNode::get_slot_index_right(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return TYPE_DISABLED;
+	return slot_info[p_idx].index_right;
+
+}
+Color GraphNode::get_slot_color_right(int p_idx) const{
+
+	if (!slot_info.has(p_idx))
+		return Color();
+	return slot_info[p_idx].color_right;
+
+}
+
+Size2 GraphNode::get_minimum_size() const {
+
+	int sep=get_constant("separation");
+	Ref<StyleBox> sb=get_stylebox("frame");
+	bool first=true;
+
+	Size2 minsize;
+
+	for(int i=0;i<get_child_count();i++) {
+
+		Control *c=get_child(i)->cast_to<Control>();
+		if (!c || !c->is_visible())
+			continue;
+		if (c->is_set_as_toplevel())
+			continue;
+
+		Size2i size=c->get_combined_minimum_size();
+
+		minsize.y+=size.y;
+		minsize.x=MAX(minsize.x,size.x);
+
+		if (first)
+			first=false;
+		else
+			minsize.y+=sep;
+	}
+
+	return minsize+sb->get_minimum_size();
+}
+
+
+void GraphNode::_bind_methods() {
+
+
+}
+
+GraphNode::GraphNode()
+{
+}

+ 54 - 0
scene/gui/graph_node.h

@@ -0,0 +1,54 @@
+#ifndef GRAPH_NODE_H
+#define GRAPH_NODE_H
+
+#include "scene/gui/container.h"
+
+class GraphNode : public Container {
+
+	OBJ_TYPE(GraphNode,Container);
+
+
+	String title;
+	struct Slot {
+		int type_left;
+		int index_left;
+		Color color_left;
+		int type_right;
+		int index_right;
+		Color color_right;
+	};
+
+	Map<int,Slot> slot_info;
+
+	void _resort();
+protected:
+
+	void _notification(int p_what);
+	static void _bind_methods();
+public:
+
+	enum {
+		TYPE_DISABLED=-1
+	};
+
+
+	void set_title(const String& p_title);
+	String get_title() const;
+
+	void set_slot(int p_idx,int p_type_left,int p_index_left,const Color& p_color_left, int p_type_right,int p_index_right,const Color& p_color_right);
+	void clear_slot(int p_idx);
+	void clear_all_slots();
+	int get_slot_type_left(int p_idx) const;
+	int get_slot_index_left(int p_idx) const;
+	Color get_slot_color_left(int p_idx) const;
+	int get_slot_type_right(int p_idx) const;
+	int get_slot_index_right(int p_idx) const;
+	Color get_slot_color_right(int p_idx) const;
+
+	virtual Size2 get_minimum_size() const;
+
+	GraphNode();
+};
+
+
+#endif // GRAPH_NODE_H

BIN
scene/resources/default_theme/graph_node.png