From 34c022a0a22bccb88a47be7356eec71543f57c89 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Mon, 8 Feb 2016 16:28:12 -0300 Subject: [PATCH] -Cleaned up GraphEdit, also fixes #3568 --- scene/gui/graph_edit.cpp | 106 +++++++++++++----- scene/gui/graph_edit.h | 13 ++- scene/gui/graph_node.cpp | 1 + .../resources/default_theme/default_theme.cpp | 7 ++ .../default_theme/icon_zoom_less.png | Bin 0 -> 390 bytes .../default_theme/icon_zoom_more.png | Bin 0 -> 388 bytes .../default_theme/icon_zoom_reset.png | Bin 0 -> 311 bytes scene/resources/default_theme/theme_data.h | 15 +++ 8 files changed, 112 insertions(+), 30 deletions(-) create mode 100644 scene/resources/default_theme/icon_zoom_less.png create mode 100644 scene/resources/default_theme/icon_zoom_more.png create mode 100644 scene/resources/default_theme/icon_zoom_reset.png diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 9472c589ca2..c9c9dbd1d22 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -4,6 +4,12 @@ #include "scene/gui/box_container.h" +#define ZOOM_SCALE 1.2 + +#define MIN_ZOOM (((1/ZOOM_SCALE)/ZOOM_SCALE)/ZOOM_SCALE) +#define MAX_ZOOM (1*ZOOM_SCALE*ZOOM_SCALE*ZOOM_SCALE) + + bool GraphEditFilter::has_point(const Point2& p_point) const { return ge->_filter_input(p_point); @@ -85,9 +91,10 @@ void GraphEdit::_update_scroll_offset() { if (!gn) continue; - Point2 pos=gn->get_offset(); + Point2 pos=gn->get_offset()*zoom; pos-=Point2(h_scroll->get_val(),v_scroll->get_val()); gn->set_pos(pos); + gn->set_scale(Vector2(zoom,zoom)); } } @@ -106,8 +113,8 @@ void GraphEdit::_update_scroll() { continue; Rect2 r; - r.pos=gn->get_offset(); - r.size=gn->get_size(); + r.pos=gn->get_offset()*zoom; + r.size=gn->get_size()*zoom; screen = screen.merge(r); } @@ -193,10 +200,11 @@ 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")); +// zoom_icon->set_texture( get_icon("Zoom", "EditorIcons")); } if (p_what==NOTIFICATION_DRAW) { + draw_style_box( get_stylebox("bg"),Rect2(Point2(),get_size()) ); VS::get_singleton()->canvas_item_set_clip(get_canvas_item(),true); } @@ -516,7 +524,7 @@ 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(); if (gn && gn->is_selected()) - gn->set_offset(gn->get_drag_from()+drag_accum); + gn->set_offset((gn->get_drag_from()*zoom+drag_accum)/zoom); } } @@ -650,6 +658,8 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { } else { if (_filter_input(Vector2(b.x,b.y))) return; + if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) + return; box_selecting = true; box_selecting_from = get_local_mouse_pos(); @@ -697,11 +707,13 @@ void GraphEdit::_input_event(const InputEvent& p_ev) { } if (b.button_index==BUTTON_WHEEL_UP && b.pressed) { - sl_zoom->set_val(zoom/0.9); + //too difficult to get right + //set_zoom(zoom*ZOOM_SCALE); } if (b.button_index==BUTTON_WHEEL_DOWN && b.pressed) { - sl_zoom->set_val(zoom*0.9); + //too difficult to get right + //set_zoom(zoom/ZOOM_SCALE); } } @@ -725,21 +737,29 @@ void GraphEdit::clear_connections() { void GraphEdit::set_zoom(float p_zoom) { - if (p_zoom<0.01) p_zoom=0.01; - if (p_zoom>4) p_zoom=4; + p_zoom=CLAMP(p_zoom,MIN_ZOOM,MAX_ZOOM); if (zoom == p_zoom) return; + zoom_minus->set_disabled(zoom==MIN_ZOOM); + zoom_plus->set_disabled(zoom==MAX_ZOOM); + + Vector2 sbofs = (Vector2( h_scroll->get_val(), v_scroll->get_val() ) + get_size()/2)/zoom; + float prev_zoom = zoom; zoom = p_zoom; - for (int i = 0; i < get_child_count(); i++) { - GraphNode *child = get_child(i)->cast_to(); - if (!child) - continue; - Point2 ofs = child->get_offset() / prev_zoom * zoom; - child->set_scale(Vector2(zoom,zoom)); - child->set_offset(ofs); + top_layer->update(); + + _update_scroll(); + + if (is_visible()) { + + Vector2 ofs = sbofs*zoom - get_size()/2; + h_scroll->set_val( ofs.x ); + v_scroll->set_val( ofs.y ); } + + update(); } @@ -772,6 +792,26 @@ Array GraphEdit::_get_connection_list() const { } return arr; } + + + +void GraphEdit::_zoom_minus() { + + + set_zoom(zoom/ZOOM_SCALE); +} +void GraphEdit::_zoom_reset() { + + + set_zoom(1); +} + +void GraphEdit::_zoom_plus() { + + set_zoom(zoom*ZOOM_SCALE); +} + + void GraphEdit::_bind_methods() { ObjectTypeDB::bind_method(_MD("connect_node:Error","from","from_port","to","to_port"),&GraphEdit::connect_node); @@ -792,6 +832,9 @@ void GraphEdit::_bind_methods() { ObjectTypeDB::bind_method(_MD("_top_layer_input"),&GraphEdit::_top_layer_input); ObjectTypeDB::bind_method(_MD("_top_layer_draw"),&GraphEdit::_top_layer_draw); ObjectTypeDB::bind_method(_MD("_scroll_moved"),&GraphEdit::_scroll_moved); + ObjectTypeDB::bind_method(_MD("_zoom_minus"),&GraphEdit::_zoom_minus); + ObjectTypeDB::bind_method(_MD("_zoom_reset"),&GraphEdit::_zoom_reset); + ObjectTypeDB::bind_method(_MD("_zoom_plus"),&GraphEdit::_zoom_plus); ObjectTypeDB::bind_method(_MD("_input_event"),&GraphEdit::_input_event); @@ -837,18 +880,25 @@ GraphEdit::GraphEdit() { zoom = 1; - HBoxContainer* tools = memnew( HBoxContainer ); - add_child(tools); + HBoxContainer *zoom_hb = memnew( HBoxContainer ); + top_layer->add_child(zoom_hb); + zoom_hb->set_pos(Vector2(10,10)); + + + zoom_minus = memnew( ToolButton ); + zoom_hb->add_child(zoom_minus); + zoom_minus->connect("pressed",this,"_zoom_minus"); + zoom_minus->set_icon(get_icon("minus")); + + zoom_reset = memnew( ToolButton ); + zoom_hb->add_child(zoom_reset); + zoom_reset->connect("pressed",this,"_zoom_reset"); + zoom_reset->set_icon(get_icon("reset")); + + zoom_plus = memnew( ToolButton ); + zoom_hb->add_child(zoom_plus); + zoom_plus->connect("pressed",this,"_zoom_plus"); + zoom_plus->set_icon(get_icon("more")); - 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)); } diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index fe9c36cee41..a189c10046d 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -4,7 +4,9 @@ #include "scene/gui/graph_node.h" #include "scene/gui/scroll_bar.h" #include "scene/gui/slider.h" +#include "scene/gui/tool_button.h" #include "texture_frame.h" + class GraphEdit; class GraphEditFilter : public Control { @@ -35,8 +37,15 @@ public: }; private: - TextureFrame* zoom_icon; - HSlider* sl_zoom; + + ToolButton *zoom_minus; + ToolButton *zoom_reset; + ToolButton *zoom_plus; + + void _zoom_minus(); + void _zoom_reset(); + void _zoom_plus(); + HScrollBar* h_scroll; VScrollBar* v_scroll; diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index 762afb158a7..eef1bf79c4e 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -591,4 +591,5 @@ void GraphNode::_bind_methods() { GraphNode::GraphNode() { show_close=false; connpos_dirty=true; + set_stop_mouse(false); } diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 2c22c81455a..fb9f66a40a2 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -884,6 +884,13 @@ void make_default_theme() { t->set_stylebox("panelf","Panel", tc_sb ); t->set_stylebox("panel","PanelContainer", tc_sb ); + t->set_icon("minus","GraphEdit", make_icon(icon_zoom_less_png) ); + t->set_icon("reset","GraphEdit", make_icon(icon_zoom_reset_png) ); + t->set_icon("more","GraphEdit", make_icon(icon_zoom_more_png) ); + t->set_stylebox("bg","GraphEdit", make_stylebox( tree_bg_png,4,4,4,5) ); + + + t->set_icon( "logo","Icons", make_icon(logo_png) ); diff --git a/scene/resources/default_theme/icon_zoom_less.png b/scene/resources/default_theme/icon_zoom_less.png new file mode 100644 index 0000000000000000000000000000000000000000..3e50ce0c222643fb27e8de6775ddb2b7704d9b1f GIT binary patch literal 390 zcmV;10eSw3P)H9yGB6txAN)NTzWG~z7vaP$W-zm&w{`@l;;S=W^)>QNHJ}?uARzy(MRaNs}n5M6) z7-KNTpc>QUdCo8lbX~{!e4ab_4d)yo1a7xmj1@&eUDvM(JQFF)@~efvu+}0Xtk>%p k^WMMi;HMMsJylil0Z49uJ`?Z-4FCWD07*qoM6N<$g3)Q6@c;k- literal 0 HcmV?d00001 diff --git a/scene/resources/default_theme/icon_zoom_more.png b/scene/resources/default_theme/icon_zoom_more.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2928064c1712c2321d5adc0b5c3c2f9718d161 GIT binary patch literal 388 zcmV-~0ek+5P)7|NmF6)ie+=U})>+!Se|w`tGi2=giE#6@KKL!&=MrdL@JafU2_J?}xi7NnZ?5 zRTbWQ=JPoKUDq+2%~-8gh{z;F0j#wYML`GwV+@DGfv)Q!5WV-YEX!!E9UA?az&S_T zwlqxxz;3q#peTy?{4h;Z$@6?Xfwh*VX;`nYO7<68o$g*slLhrt+VvHGe zS}Yda?{})I;(R`j0nebRD2*}nLDh9VK=k8XMc8h)!?~_&E|<%%2cO6}M~soOECE<9 im)`-NAt3~^EaL(5*@dr0AuksI00002BR0pdfpR zr>`sf111hZX)eRZig`exYo0ESAr_~XPCB@%#em1vf0e>3r!KviZ~ynNl3&1bq_t^V z{^u!@?y_mm)_6^xt@cv%Uts8(tzT;WIT#s|c}ip7Z!}I3X6|`>V%NGQnOp}p>8N-* zMNaEDktukS?_PC7#h&{G=WL%^JZDh|4SiObHfz}l-gfq~o~_^fWaM3zTeis?GAJpf z7teq5TJ`t}t;lJ$DpfBR