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)); } } }
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))); }
void OptionBox::pressed() { pre_show_signal.call(); popup->set_size( Size( size.width, 0 ) ); popup->popup( get_global_pos()+Point( 0, size.height) ); }
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(); }
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(); }
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"); }
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 ); }
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(); } }
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(); }
void Node2D::global_translate(const Vector2& p_amount) { set_global_pos( get_global_pos() + p_amount ); }
Vector2 KinematicBody2D::move_to(const Vector2& p_position) { return move(p_position-get_global_pos()); }
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); } } }
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; } }