浏览代码

Add scrolling to Tree control in Drag and Drop mode

Pawel Kowal 9 年之前
父节点
当前提交
9e5aaa27bc
共有 3 个文件被更改,包括 36 次插入0 次删除
  1. 31 0
      scene/gui/tree.cpp
  2. 3 0
      scene/gui/tree.h
  3. 2 0
      scene/resources/default_theme/default_theme.cpp

+ 31 - 0
scene/gui/tree.cpp

@@ -32,6 +32,7 @@
 #include "os/keyboard.h"
 #include "globals.h"
 #include "os/input.h"
+#include "scene/main/viewport.h"
 
 
 
@@ -829,6 +830,8 @@ void Tree::update_cache() {
 	cache.guide_width=get_constant("guide_width");
 	cache.draw_relationship_lines=get_constant("draw_relationship_lines");
 	cache.relationship_line_color=get_color("relationship_line_color");
+	cache.scroll_border=get_constant("scroll_border");
+	cache.scroll_speed=get_constant("scroll_speed");
 
 	cache.title_button = get_stylebox("title_button_normal");
 	cache.title_button_pressed = get_stylebox("title_button_pressed");
@@ -2681,11 +2684,17 @@ void Tree::_notification(int p_what) {
 	if (p_what==NOTIFICATION_DRAG_END) {
 
 		drop_mode_flags=0;
+		scrolling = false;
+		set_fixed_process(false);
 		update();
 	}
 	if (p_what==NOTIFICATION_DRAG_BEGIN) {
 
 		single_select_defer=NULL;
+		if (cache.scroll_speed > 0 && get_rect().has_point(get_viewport()->get_mouse_pos() - get_global_pos())) {
+			scrolling = true;
+			set_fixed_process(true);
+		}
 	}
 	if (p_what==NOTIFICATION_FIXED_PROCESS) {
 
@@ -2731,6 +2740,28 @@ void Tree::_notification(int p_what) {
 
 			}
 		}
+		
+		if (scrolling) {
+			Point2 point = get_viewport()->get_mouse_pos() - get_global_pos();
+			if (point.x < cache.scroll_border) {
+				point.x -= cache.scroll_border;
+			} else if (point.x > get_size().width - cache.scroll_border) {
+				point.x -= get_size().width - cache.scroll_border;
+			} else {
+				point.x = 0;
+			}
+			if (point.y < cache.scroll_border) {
+				point.y -= cache.scroll_border;
+			} else if (point.y > get_size().height - cache.scroll_border) {
+				point.y -= get_size().height - cache.scroll_border;
+			} else {
+				point.y = 0;
+			}
+			point *= cache.scroll_speed * get_fixed_process_delta_time();
+			point += get_scroll();
+			h_scroll->set_val(point.x);
+			v_scroll->set_val(point.y);
+		}
 	}
 
 	if (p_what==NOTIFICATION_DRAW) {

+ 3 - 0
scene/gui/tree.h

@@ -390,6 +390,8 @@ friend class TreeItem;
 		int button_margin;
 		Point2 offset;
 		int draw_relationship_lines;
+		int scroll_border;
+		int scroll_speed;
 
 		enum ClickType {
 			CLICK_NONE,
@@ -448,6 +450,7 @@ friend class TreeItem;
 	bool drag_touching_deaccel;
 	bool click_handled;
 	bool allow_rmb_select;
+	bool scrolling;
 
 	bool force_select_on_already_selected;
 

+ 2 - 0
scene/resources/default_theme/default_theme.cpp

@@ -714,6 +714,8 @@ void fill_default_theme(Ref<Theme>& t, const Ref<Font> & default_font, const Ref
 	t->set_constant("item_margin","Tree",12 *scale);
 	t->set_constant("button_margin","Tree",4 *scale);
 	t->set_constant("draw_relationship_lines", "Tree", 0);
+	t->set_constant("scroll_border", "Tree", 4);
+	t->set_constant("scroll_speed", "Tree", 12);
 
 
 	// ItemList