示例#1
0
void PopupMenu::_activate_submenu(int over) {

	Node* n = get_node(items[over].submenu);
	ERR_EXPLAIN("item subnode does not exist: "+items[over].submenu);
	ERR_FAIL_COND(!n);
	Popup *pm = n->cast_to<Popup>();
	ERR_EXPLAIN("item subnode is not a Popup: "+items[over].submenu);
	ERR_FAIL_COND(!pm);
	if (pm->is_visible())
		return; //already visible!


	Point2 p = get_global_pos();
	Rect2 pr(p,get_size());
	Ref<StyleBox> style = get_stylebox("panel");
	pm->set_pos(p+Point2(get_size().width,items[over]._ofs_cache-style->get_offset().y));
	pm->popup();

	PopupMenu *pum = pm->cast_to<PopupMenu>();
	if (pum) {

		pr.pos-=pum->get_global_pos();
		pum->clear_autohide_areas();
		pum->add_autohide_area(Rect2(pr.pos.x,pr.pos.y,pr.size.x,items[over]._ofs_cache));
		if (over<items.size()-1) {
			int from = items[over+1]._ofs_cache;
			pum->add_autohide_area(Rect2(pr.pos.x,pr.pos.y+from,pr.size.x,pr.size.y-from));
		}

	}

}
示例#2
0
void ColorPickerButton::pressed() {

	Size2 ms = Size2(350, picker->get_combined_minimum_size().height+10);
	popup->set_pos(get_global_pos()-Size2(0,ms.height));
	popup->set_size(ms);
	popup->popup();
}
void EnvelopePointEditor::move_mouse_to_selected_node() {

//	int cur_width=size.width;
	int cur_height=size.height-get_font_h_spacing();
//	int real_height=size.height;

	if (cur_height<=0)
		return;

        float env_normalize=-envelope->get_min();
	float env_total=envelope->get_max()-envelope->get_min();
	if (env_total==0)
		return; //canut be draw, broken envelope
	int center=int(env_normalize*(float)cur_height/env_total);
	center=cur_height-center;


	float node_x=(float)envelope->get_node(grab.node).tick_offset;
	float node_y=(float)envelope->get_node(grab.node).value;

	node_x/=zoom;
	node_y+=env_normalize;
	node_y=node_y*(float)cur_height/env_total;
	node_y=cur_height-node_y;

	get_painter()->set_cursor_pos(get_global_pos()+Point((int)node_x,(int)node_y));
	//QCursor::setPos(mapToGlobal(QPoint((int)node_x,(int)node_y)));
}
示例#4
0
void OptionBox::pressed() {
	
	pre_show_signal.call();
	
	popup->set_size( Size( size.width, 0 ) );
	popup->popup( get_global_pos()+Point( 0, size.height) );
}
示例#5
0
void OptionButton::pressed() {

	Size2 size = get_size();
	popup->set_global_pos(get_global_pos() + Size2(0, size.height));
	popup->set_size(Size2(size.width, 0));

	popup->popup();
}
示例#6
0
void ColorRampEdit::_show_color_picker() {
	if (grabbed==-1)
		return;
	Size2 ms = Size2(350, picker->get_combined_minimum_size().height+10);
	picker->set_color(points[grabbed].color);
	popup->set_pos(get_global_pos()-Vector2(ms.width-get_size().width,ms.height));
	popup->set_size(ms);
	popup->popup();
}
示例#7
0
void MenuButton::pressed() {
	
	emit_signal("about_to_show");
	Size2 size=get_size();

	Point2 gp = get_global_pos();
	popup->set_global_pos( gp + Size2( 0, size.height ) );
	popup->set_size( Size2( size.width, 0) );	
	popup->set_parent_rect( Rect2(Point2(gp-popup->get_global_pos()),get_size()));
	popup->popup();
	popup->call_deferred("grab_click_focus");
	
}
示例#8
0
void ComboBox::button_clicked() {
	
	if (list->get_size()==0)
		return;
	
	Point global=get_global_pos();
	popup->set_pos( Point( global.x , global.y+size.height) );
	int mins=list->get_min_total_height()+get_window()->get_painter()->get_stylebox_min_size(hbc->stylebox(SB_COMBO_POPUP)).height;
	if (mins>constant( C_COMBOBOX_POPUP_MAX_HEIGHT ) )
		mins=constant( C_COMBOBOX_POPUP_MAX_HEIGHT );
	popup->set_size( Size( size.width, mins) ); 
	popup->show();
	list->get_focus();
}
void LoopColumn::mouse_button(const Point& p_pos, int p_button,bool p_press,int p_modifier_mask) {

	if (!p_press || p_button!=BUTTON_LEFT)
		return;
	
	beat_at_click=global_view->get_beat_at_pixel(p_pos.y+global_view->get_beat_pixel_size()/2);

	menu->clear();
	menu->add_item("Set Loop Begin",OPTION_SET_LOOP_BEGIN);
	menu->add_item("Set Loop End",OPTION_SET_LOOP_END);
	menu->add_separator();
	menu->add_item("Change Bar Length",OPTION_CHANGE_BAR_LENGTH);
	menu->add_item("Remove Bar Length",OPTION_REMOVE_BAR_LENGTH);
		
	menu->popup( get_global_pos() + p_pos );
	
}
示例#10
0
void EditorPath::_gui_input(const InputEvent& p_event) {

	if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && p_event.mouse_button.pressed) {


		Object *obj = ObjectDB::get_instance(history->get_path_object( history->get_path_size()-1));
		if (!obj)
			return;



		objects.clear();
		popup->clear();
		_add_children_to_popup(obj);
		popup->set_pos( get_global_pos() + Vector2(0,get_size().height));
		popup->set_size( Size2(get_size().width,1));
		popup->popup();
	}
}
示例#11
0
bool KinematicBody2D::can_move_to(const Vector2& p_position, bool p_discrete) {

	ERR_FAIL_COND_V(!is_inside_scene(),false);
	Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space());
	ERR_FAIL_COND_V(!dss,false);

	uint32_t mask=0;
	if (collide_static)
		mask|=Physics2DDirectSpaceState::TYPE_MASK_STATIC_BODY;
	if (collide_kinematic)
		mask|=Physics2DDirectSpaceState::TYPE_MASK_KINEMATIC_BODY;
	if (collide_rigid)
		mask|=Physics2DDirectSpaceState::TYPE_MASK_RIGID_BODY;
	if (collide_character)
		mask|=Physics2DDirectSpaceState::TYPE_MASK_CHARACTER_BODY;

	Vector2 motion = p_position-get_global_pos();
	Matrix32 xform=get_global_transform();

	if (p_discrete) {

		xform.elements[2]+=motion;
		motion=Vector2();
	}

	Set<RID> exclude;
	exclude.insert(get_rid());

	//fill exclude list..
	for(int i=0;i<get_shape_count();i++) {


		bool col = dss->intersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),motion,0,NULL,0,exclude,0,mask);
		if (col)
			return false;
	}

	return true;
}
void ShaderEditor::_node_edit_property(int p_node) {

	Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
	Size2 size = get_node_size(p_node);
	Point2 pos = Point2( shader_graph.node_get_pos_x(p_node), shader_graph.node_get_pos_y(p_node) )-offset;

	VisualServer::ShaderNodeType type=shader_graph.node_get_type(p_node);

	PropertyInfo ph = VisualServer::get_singleton()->shader_node_get_type_info(type);
	if (ph.type==Variant::NIL)
		return;
	if (ph.type==Variant::_RID)
		ph.type=Variant::OBJECT;

	property_editor->edit(NULL,ph.name,ph.type,shader_graph.node_get_param(p_node),ph.hint,ph.hint_string);

	Point2 popup_pos=Point2( pos.x+(size.width-property_editor->get_size().width)/2.0,pos.y+(size.y-style->get_margin(MARGIN_BOTTOM))).floor();
	popup_pos+=get_global_pos();
	property_editor->set_pos(popup_pos);

	property_editor->popup();

}
void AnimationTreeEditor::_node_edit_property(const StringName& p_node) {

	Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
	Size2 size = get_node_size(p_node);
	Point2 pos = Point2( anim_tree->node_get_pos_x(p_node), anim_tree->node_get_pos_y(p_node) )-offset;

	VisualServer::AnimationTreeNodeType type=anim_tree->node_get_type(p_node);

	PropertyInfo ph = VisualServer::get_singleton()->anim_tree_node_get_type_info(type);
	if (ph.type==Variant::NIL)
		return;
	if (ph.type==Variant::_RID)
		ph.type=Variant::RESOURCE;

	property_editor->edit(NULL,ph.name,ph.type,anim_tree->node_get_param(p_node),ph.hint,ph.hint_string);

	Point2 popup_pos=Point2( pos.x+(size.width-property_editor->get_size().width)/2.0,pos.y+(size.y-style->get_margin(MARGIN_BOTTOM))).floor();
	popup_pos+=get_global_pos();
	property_editor->set_pos(popup_pos);

	property_editor->popup();

}
void PatternEditorTop::mouse_button(const Point& p_pos, int p_button,bool p_press,int p_modifier_mask) {


	if (!p_press)
		return;

	if (mouse_over_which==-1)
		return;

	popup_track=-1;
	int track=mouse_over_which+editor->get_column_offset();
	if (track<0 || track>=Pattern::WIDTH)
		return;
	
	Size win_size=Size( get_column_width()*2, 0);
	Point win_ofs=Point(-get_column_width()/2,0);
	win_ofs+=get_global_pos()+Point(get_column_width()*mouse_over_which,get_painter()->get_font_height(font( FONT_PATTERN_EDITOR )) );
	
	if (win_ofs.x<0)
		win_ofs.x=0;
	if ((win_ofs.x+win_size.width)>get_window()->get_size().width)
		win_ofs.x=get_window()->get_size().width-win_size.width;
		
	
	popup->set_pos( win_ofs );
	popup->set_size( win_size );

	mute_button->set_checked( editor->get_song()->is_channel_mute( track ) );
	surround_button->set_checked( editor->get_song()->is_channel_surround( track ) );
	default_vol_slider->get_range()->set((double)editor->get_song()->get_channel_volume( track ) );
	default_pan_slider->get_range()->set((double)editor->get_song()->get_channel_pan( track )-32 );
	default_chorus_slider->get_range()->set((double)editor->get_song()->get_channel_chorus( track ) );
	default_reverb_slider->get_range()->set((double)editor->get_song()->get_channel_reverb( track ) );
	popup_track=track;
	popup->show();
}
示例#15
0
void Node2D::global_translate(const Vector2& p_amount) {

	set_global_pos( get_global_pos() + p_amount );
}
示例#16
0
Vector2 KinematicBody2D::move_to(const Vector2& p_position) {

	return move(p_position-get_global_pos());
}
示例#17
0
void TabContainer::_input_event(const InputEvent& p_event) {

    if (p_event.type==InputEvent::MOUSE_BUTTON &&
            p_event.mouse_button.pressed &&
            p_event.mouse_button.button_index==BUTTON_LEFT) {

        // clicks
        Point2 pos( p_event.mouse_button.x, p_event.mouse_button.y );

        int top_margin = _get_top_margin();
        if (pos.y>top_margin)
            return; // no click (too far down)

        if (pos.x<tabs_ofs_cache)
            return; // no click (too far left)

        Ref<StyleBox> tab_bg = get_stylebox("tab_bg");
        Ref<StyleBox> tab_fg = get_stylebox("tab_fg");
        Ref<Font> font = get_font("font");
        Ref<Texture> incr = get_icon("increment");
        Ref<Texture> decr = get_icon("decrement");
        Ref<Texture> menu = get_icon("menu");
        Ref<Texture> menu_hl = get_icon("menu_hl");

        if (popup && pos.x>get_size().width-menu->get_width()) {


            emit_signal("pre_popup_pressed");
            Vector2 pp_pos = get_global_pos();
            pp_pos.x+=get_size().width;
            pp_pos.x-=popup->get_size().width;
            pp_pos.y+=menu->get_height();

            popup->set_global_pos( pp_pos );
            popup->popup();;
            return;
        }
        pos.x-=tabs_ofs_cache;

        int idx=0;
        int found=-1;
        bool rightroom=false;

        for(int i=0; i<get_child_count(); i++) {

            Control *c = get_child(i)->cast_to<Control>();
            if (!c)
                continue;
            if (c->is_set_as_toplevel())
                continue;

            if (idx<tab_display_ofs) {
                idx++;
                continue;
            }

            if (idx>last_tab_cache) {
                rightroom=true;
                break;
            }

            String s = c->has_meta("_tab_name")?String(XL_MESSAGE(String(c->get_meta("_tab_name")))):String(c->get_name());
            int tab_width=font->get_string_size(s).width;

            if (c->has_meta("_tab_icon")) {
                Ref<Texture> icon = c->get_meta("_tab_icon");
                if (icon.is_valid()) {
                    tab_width+=icon->get_width();
                    if (s!="")
                        tab_width+=get_constant("hseparation");

                }
            }

            if (idx==current) {

                tab_width+=tab_fg->get_minimum_size().width;
            } else {
                tab_width+=tab_bg->get_minimum_size().width;
            }

            if (pos.x < tab_width) {

                found=idx;
                break;
            }

            pos.x-=tab_width;
            idx++;
        }

        if (buttons_visible_cache) {

            if (p_event.mouse_button.x>get_size().width-incr->get_width()) {
                if (rightroom) {
                    tab_display_ofs+=1;
                    update();
                }
            } else if (p_event.mouse_button.x>get_size().width-incr->get_width()-decr->get_width()) {

                if (tab_display_ofs>0) {
                    tab_display_ofs-=1;
                    update();
                }

            }
        }


        if (found!=-1) {

            set_current_tab(found);
        }
    }

}
示例#18
0
void PopupMenu::_input_event(const InputEvent &p_event) {

	switch( p_event.type) {

		case InputEvent::KEY: {


			if (!p_event.key.pressed)
				break;

			switch(p_event.key.scancode) {


				case KEY_DOWN: {


					for(int i=mouse_over+1;i<items.size();i++) {

						if (i<0 || i>=items.size())
							continue;

						if (!items[i].separator && !items[i].disabled) {


							mouse_over=i;
							update();
							break;
						}
					}
				} break;
				case KEY_UP: {


					for(int i=mouse_over-1;i>=0;i--) {

						if (i<0 || i>=items.size())
							continue;


						if (!items[i].separator && !items[i].disabled) {


						   mouse_over=i;
						   update();
						   break;
						}
					}
				} break;
				case KEY_RETURN:
				case KEY_ENTER: {

					if (mouse_over>=0 && mouse_over<items.size() && !items[mouse_over].separator) {


						activate_item(mouse_over);

					}
				} break;
			}





		} break;

		case InputEvent::MOUSE_BUTTON: {
	
			
			const InputEventMouseButton &b=p_event.mouse_button;
			if (b.pressed)
				break;			

			switch(b.button_index) {


				case BUTTON_WHEEL_DOWN: {

					if (get_global_pos().y + get_size().y > get_viewport_rect().size.y) {

						int vseparation = get_constant("vseparation");
						Ref<Font> font = get_font("font");

						Point2 pos = get_pos();
						int s = (vseparation+font->get_height())*3;
						pos.y-=s;
						set_pos(pos);

						//update hover
						InputEvent ie;
						ie.type=InputEvent::MOUSE_MOTION;
						ie.mouse_motion.x=b.x;
						ie.mouse_motion.y=b.y+s;
						_input_event(ie);
					}
				} break;
				case BUTTON_WHEEL_UP: {

					if (get_global_pos().y < 0) {

						int vseparation = get_constant("vseparation");
						Ref<Font> font = get_font("font");

						Point2 pos = get_pos();
						int s = (vseparation+font->get_height())*3;
						pos.y+=s;
						set_pos(pos);

						//update hover
						InputEvent ie;
						ie.type=InputEvent::MOUSE_MOTION;
						ie.mouse_motion.x=b.x;
						ie.mouse_motion.y=b.y-s;
						_input_event(ie);


					}
				} break;
				case BUTTON_LEFT: {

					int over=_get_mouse_over(Point2(b.x,b.y));

					if (invalidated_click) {
						invalidated_click=false;
						break;
					}
					if (over<0) {
						hide();
						break; //non-activable
					}

					if (items[over].separator || items[over].disabled)
						break;

					if (items[over].submenu!="") {

						_activate_submenu(over);
						return;
					}
					activate_item(over);

				} break;
			}
			
			//update();
		} break;
		case InputEvent::MOUSE_MOTION: {
	

			if (invalidated_click) {
				moved+=Vector2(p_event.mouse_motion.relative_x,p_event.mouse_motion.relative_y);
				if (moved.length()>4)
					invalidated_click=false;

			}

			const InputEventMouseMotion &m=p_event.mouse_motion;
			for(List<Rect2>::Element *E=autohide_areas.front();E;E=E->next()) {

				if (!Rect2(Point2(),get_size()).has_point(Point2(m.x,m.y)) && E->get().has_point(Point2(m.x,m.y))) {
					call_deferred("hide");
					return;
				}
			}

			int over=_get_mouse_over(Point2(m.x,m.y));
			int id = (over<0 || items[over].separator || items[over].disabled)?-1:items[over].ID;

			if (id<0) {
				mouse_over=-1;
				update();
				break;
			}

			if (items[over].submenu!="" && submenu_over!=over) {
				submenu_over=over;
				submenu_timer->start();
			}

			if (over!=mouse_over) {
				mouse_over=over;
				update();
			}
		} break;

	}
}
void AnimationTreeEditor::_popup_edit_dialog() {

	updating_edit=true;

	for(int i=0;i<2;i++)
		edit_scroll[i]->hide();

	for(int i=0;i<4;i++) {

		edit_line[i]->hide();
		edit_label[i]->hide();
	}

	edit_option->hide();
	edit_button->hide();;
	filter_button->hide();
	edit_check->hide();;

	Point2 pos = anim_tree->node_get_pos(edited_node)-Point2(h_scroll->get_val(),v_scroll->get_val());
	Ref<StyleBox> style = get_stylebox("panel","PopupMenu");
	Size2 size = get_node_size(edited_node);
	Point2 popup_pos( pos.x+style->get_margin(MARGIN_LEFT), pos.y+size.y-style->get_margin(MARGIN_BOTTOM));
	popup_pos+=get_global_pos();

	if (renaming_edit) {

		edit_label[0]->set_text("New name:");
		edit_label[0]->set_pos(Point2(5,5));
		edit_label[0]->show();
		edit_line[0]->set_begin(Point2(15,25));
		edit_line[0]->set_text(edited_node);
		edit_line[0]->show();
		edit_dialog->set_size(Size2(150,50));

	} else {

		AnimationTreePlayer::NodeType type=anim_tree->node_get_type(edited_node);


		switch(type) {

			case AnimationTreePlayer::NODE_ANIMATION:

				if (anim_tree->get_master_player()!=NodePath() && anim_tree->has_node(anim_tree->get_master_player())  && anim_tree->get_node(anim_tree->get_master_player())->cast_to<AnimationPlayer>()) {

					AnimationPlayer *ap = anim_tree->get_node(anim_tree->get_master_player())->cast_to<AnimationPlayer>();
					master_anim_popup->clear();
					List<StringName> sn;
					ap->get_animation_list(&sn);
					sn.sort_custom<StringName::AlphCompare>();
					for (List<StringName>::Element *E=sn.front();E;E=E->next()) {
						master_anim_popup->add_item(E->get());
					}

					master_anim_popup->set_pos(popup_pos);
					master_anim_popup->popup();
				} else {
					property_editor->edit(this,"",Variant::OBJECT,anim_tree->animation_node_get_animation(edited_node),PROPERTY_HINT_RESOURCE_TYPE,"Animation");
					property_editor->set_pos(popup_pos);
					property_editor->popup();
					updating_edit=false;
				}
				return;
			 case AnimationTreePlayer::NODE_TIMESCALE:
				edit_label[0]->set_text("Scale:");
				edit_label[0]->set_pos(Point2(5,5));
				edit_label[0]->show();
				edit_line[0]->set_begin(Point2(15,25));
				edit_line[0]->set_text(rtos(anim_tree->timescale_node_get_scale(edited_node)));
				edit_line[0]->show();
				edit_dialog->set_size(Size2(150,50));
				break;
			 case AnimationTreePlayer::NODE_ONESHOT:
				edit_label[0]->set_text("Fade In (s):");
				edit_label[0]->set_pos(Point2(5,5));
				edit_label[0]->show();
				edit_line[0]->set_begin(Point2(15,25));
				edit_line[0]->set_text(rtos(anim_tree->oneshot_node_get_fadein_time(edited_node)));
				edit_line[0]->show();
				edit_label[1]->set_text("Fade Out (s):");
				edit_label[1]->set_pos(Point2(5,55));
				edit_label[1]->show();
				edit_line[1]->set_begin(Point2(15,75));
				edit_line[1]->set_text(rtos(anim_tree->oneshot_node_get_fadeout_time(edited_node)));
				edit_line[1]->show();

				edit_option->clear();
				edit_option->add_item("Blend",0);
				edit_option->add_item("Mix",1);
				edit_option->set_begin(Point2(15,105));

				edit_option->select( anim_tree->oneshot_node_get_mix_mode(edited_node));
				edit_option->show();

				edit_check->set_text("Auto Restart:");
				edit_check->set_begin(Point2(15,125));
				edit_check->set_pressed(anim_tree->oneshot_node_has_autorestart(edited_node));
				edit_check->show();

				edit_label[2]->set_text("Restart (s):");
				edit_label[2]->set_pos(Point2(5,145));
				edit_label[2]->show();
				edit_line[2]->set_begin(Point2(15,165));
				edit_line[2]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_delay(edited_node)));
				edit_line[2]->show();
				edit_label[3]->set_text("Random Restart (s):");
				edit_label[3]->set_pos(Point2(5,195));
				edit_label[3]->show();
				edit_line[3]->set_begin(Point2(15,215));
				edit_line[3]->set_text(rtos(anim_tree->oneshot_node_get_autorestart_random_delay(edited_node)));
				edit_line[3]->show();

				filter_button->set_begin(Point2(10,245));
				filter_button->show();

				edit_button->set_begin(Point2(10,268));
				edit_button->set_text("Start!");

				edit_button->show();

				edit_dialog->set_size(Size2(180,293));

				break;

			 case AnimationTreePlayer::NODE_MIX:

				 edit_label[0]->set_text("Amount:");
				 edit_label[0]->set_pos(Point2(5,5));
				 edit_label[0]->show();
				 edit_scroll[0]->set_min(0);
				 edit_scroll[0]->set_max(1);
				 edit_scroll[0]->set_val(anim_tree->mix_node_get_amount(edited_node));
				 edit_scroll[0]->set_begin(Point2(15,25));
				 edit_scroll[0]->show();
				 edit_dialog->set_size(Size2(150,50));

				 break;
			 case AnimationTreePlayer::NODE_BLEND2:
				 edit_label[0]->set_text("Blend:");
				 edit_label[0]->set_pos(Point2(5,5));
				 edit_label[0]->show();
				 edit_scroll[0]->set_min(0);
				 edit_scroll[0]->set_max(1);
				 edit_scroll[0]->set_val(anim_tree->blend2_node_get_amount(edited_node));
				 edit_scroll[0]->set_begin(Point2(15,25));
				 edit_scroll[0]->show();
				 filter_button->set_begin(Point2(10,47));
				 filter_button->show();
				 edit_dialog->set_size(Size2(150,74));

				 break;

			 case AnimationTreePlayer::NODE_BLEND3:
				 edit_label[0]->set_text("Blend:");
				 edit_label[0]->set_pos(Point2(5,5));
				 edit_label[0]->show();
				 edit_scroll[0]->set_min(-1);
				 edit_scroll[0]->set_max(1);
				 edit_scroll[0]->set_val(anim_tree->blend3_node_get_amount(edited_node));
				 edit_scroll[0]->set_begin(Point2(15,25));
				 edit_scroll[0]->show();
				 edit_dialog->set_size(Size2(150,50));

				 break;
			case AnimationTreePlayer::NODE_BLEND4:

				edit_label[0]->set_text("Blend 0:");
				edit_label[0]->set_pos(Point2(5,5));
				edit_label[0]->show();
				edit_scroll[0]->set_min(0);
				edit_scroll[0]->set_max(1);
				edit_scroll[0]->set_val(anim_tree->blend4_node_get_amount(edited_node).x);
				edit_scroll[0]->set_begin(Point2(15,25));
				edit_scroll[0]->show();
				edit_label[1]->set_text("Blend 1:");
				edit_label[1]->set_pos(Point2(5,55));
				edit_label[1]->show();
				edit_scroll[1]->set_min(0);
				edit_scroll[1]->set_max(1);
				edit_scroll[1]->set_val(anim_tree->blend4_node_get_amount(edited_node).y);
				edit_scroll[1]->set_begin(Point2(15,75));
				edit_scroll[1]->show();
				edit_dialog->set_size(Size2(150,100));

				break;

			 case AnimationTreePlayer::NODE_TRANSITION: {


				 edit_label[0]->set_text("X-Fade Time (s):");
				 edit_label[0]->set_pos(Point2(5,5));
				 edit_label[0]->show();
				 edit_line[0]->set_begin(Point2(15,25));
				 edit_line[0]->set_text(rtos(anim_tree->transition_node_get_xfade_time(edited_node)));
				 edit_line[0]->show();

				 edit_label[1]->set_text("Current:");
				 edit_label[1]->set_pos(Point2(5,55));
				 edit_label[1]->show();
				 edit_option->set_begin(Point2(15,75));

				 edit_option->clear();;

				 for(int i=0;i<anim_tree->transition_node_get_input_count(edited_node);i++) {
					 edit_option->add_item(itos(i),i);
				 }

				 edit_option->select(anim_tree->transition_node_get_current(edited_node));
				 edit_option->show();
				 edit_dialog->set_size(Size2(150,100));

			} break;
			default: {}

		}

	}



	edit_dialog->set_pos(popup_pos);
	edit_dialog->popup();

	updating_edit=false;
}
void OptionButton::pressed() {
	
	popup->set_size( Size( size.width, 0 ) );
	popup->popup( get_global_pos()+Point( 0, size.height) );
}
void AnimationTreeEditor::_input_event(InputEvent p_event) {

	switch(p_event.type) {

		case InputEvent::MOUSE_BUTTON: {

			if (p_event.mouse_button.pressed) {


				if (p_event.mouse_button.button_index==1) {
					click_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
					click_motion=click_pos;
					click_type = _locate_click(click_pos,&click_node,&click_slot);
					if( click_type!=CLICK_NONE) {

						order.erase(click_node);
						order.push_back(click_node);
						update();
					}

					switch(click_type) {
						case CLICK_INPUT_SLOT: {
							click_pos=_get_slot_pos(click_node,true,click_slot);
						} break;
						case CLICK_OUTPUT_SLOT: {
							click_pos=_get_slot_pos(click_node,false,click_slot);
						} break;
						case CLICK_PARAMETER: {

							edited_node=click_node;
							renaming_edit=false;
							_popup_edit_dialog();
							//open editor
					//		_node_edit_property(click_node);
						} break;
						default:{}
					}
				}
				if (p_event.mouse_button.button_index==2) {

					if (click_type!=CLICK_NONE) {
						click_type=CLICK_NONE;
						update();
					} else {
						// try to disconnect/remove

						Point2 rclick_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
						rclick_type = _locate_click(rclick_pos,&rclick_node,&rclick_slot);
						if (rclick_type==CLICK_INPUT_SLOT || rclick_type==CLICK_OUTPUT_SLOT) {

							node_popup->clear();
							node_popup->add_item("Disconnect",NODE_DISCONNECT);
							if (anim_tree->node_get_type(rclick_node)==AnimationTreePlayer::NODE_TRANSITION) {
								node_popup->add_item("Add Input",NODE_ADD_INPUT);
								if (rclick_type==CLICK_INPUT_SLOT) {
									if (anim_tree->transition_node_has_input_auto_advance(rclick_node,rclick_slot))
										node_popup->add_item("Clear Auto-Advance",NODE_CLEAR_AUTOADVANCE);
									else
										node_popup->add_item("Set Auto-Advance",NODE_SET_AUTOADVANCE);
									node_popup->add_item("Delete Input",NODE_DELETE_INPUT);

								}
							}

							node_popup->set_pos(rclick_pos+get_global_pos());
							node_popup->popup();

						}

						if (rclick_type==CLICK_NODE) {
							node_popup->clear();
							node_popup->add_item("Rename",NODE_RENAME);
							node_popup->add_item("Remove",NODE_ERASE);
							if (anim_tree->node_get_type(rclick_node)==AnimationTreePlayer::NODE_TRANSITION)
								node_popup->add_item("Add Input",NODE_ADD_INPUT);
							node_popup->set_pos(rclick_pos+get_global_pos());
							node_popup->popup();
						}


					}
				}
			} else {

				if (p_event.mouse_button.button_index==1 && click_type!=CLICK_NONE) {

					switch(click_type) {
						case CLICK_INPUT_SLOT:
						case CLICK_OUTPUT_SLOT: {

							Point2 dst_click_pos=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
							StringName id;
							int slot;
							ClickType dst_click_type = _locate_click(dst_click_pos,&id,&slot);

							if (dst_click_type==CLICK_INPUT_SLOT && click_type==CLICK_OUTPUT_SLOT) {

								anim_tree->connect(click_node,id,slot);

							}
							if (click_type==CLICK_INPUT_SLOT && dst_click_type==CLICK_OUTPUT_SLOT) {

								anim_tree->connect(id,click_node,click_slot);
							}

						} break;
						case CLICK_NODE: {
							Point2 new_pos = anim_tree->node_get_pos(click_node)+(click_motion-click_pos);
							if (new_pos.x<5)
								new_pos.x=5;
							if (new_pos.y<5)
								new_pos.y=5;
							anim_tree->node_set_pos(click_node,new_pos);

						} break;
						default: {}
					}

					click_type=CLICK_NONE;
					update();
				}
			}
		}

		case InputEvent::MOUSE_MOTION: {

			if (p_event.mouse_motion.button_mask&1 && click_type!=CLICK_NONE) {

				click_motion=Point2(p_event.mouse_button.x,p_event.mouse_button.y);
				update();
			}
			if ((p_event.mouse_motion.button_mask&4 || Input::get_singleton()->is_key_pressed(KEY_SPACE))) {

				h_scroll->set_val( h_scroll->get_val() - p_event.mouse_motion.relative_x );
				v_scroll->set_val( v_scroll->get_val() - p_event.mouse_motion.relative_y );
				update();
			}

		} break;
	}

}