瀏覽代碼

Merge pull request #15405 from poke1024/fix-popup-scroll

Allow popup menu scrolling without mouse wheel
Rémi Verschelde 7 年之前
父節點
當前提交
b77c6d43a8
共有 2 個文件被更改,包括 28 次插入32 次删除
  1. 27 32
      scene/gui/popup_menu.cpp
  2. 1 0
      scene/gui/popup_menu.h

+ 27 - 32
scene/gui/popup_menu.cpp

@@ -189,6 +189,26 @@ void PopupMenu::_submenu_timeout() {
 	submenu_over = -1;
 }
 
+void PopupMenu::_scroll(float p_factor, const Point2 &p_over) {
+
+	const float global_y = get_global_position().y;
+
+	int vseparation = get_constant("vseparation");
+	Ref<Font> font = get_font("font");
+
+	float dy = (vseparation + font->get_height()) * 3 * p_factor;
+	if (dy > 0 && global_y < 0)
+		dy = MIN(dy, -global_y - 1);
+	else if (dy < 0 && global_y + get_size().y > get_viewport_rect().size.y)
+		dy = -MIN(-dy, global_y + get_size().y - get_viewport_rect().size.y - 1);
+	set_position(get_position() + Vector2(0, dy));
+
+	Ref<InputEventMouseMotion> ie;
+	ie.instance();
+	ie->set_position(p_over - Vector2(0, dy));
+	_gui_input(ie);
+}
+
 void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
 
 	Ref<InputEventKey> k = p_event;
@@ -285,41 +305,11 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
 
 			case BUTTON_WHEEL_DOWN: {
 
-				if (get_global_position().y + get_size().y > get_viewport_rect().size.y) {
-
-					int vseparation = get_constant("vseparation");
-					Ref<Font> font = get_font("font");
-
-					Point2 pos = get_position();
-					int s = (vseparation + font->get_height()) * 3;
-					pos.y -= (s * b->get_factor());
-					set_position(pos);
-
-					//update hover
-					Ref<InputEventMouseMotion> ie;
-					ie.instance();
-					ie->set_position(b->get_position() + Vector2(0, s));
-					_gui_input(ie);
-				}
+				_scroll(-b->get_factor(), b->get_position());
 			} break;
 			case BUTTON_WHEEL_UP: {
 
-				if (get_global_position().y < 0) {
-
-					int vseparation = get_constant("vseparation");
-					Ref<Font> font = get_font("font");
-
-					Point2 pos = get_position();
-					int s = (vseparation + font->get_height()) * 3;
-					pos.y += (s * b->get_factor());
-					set_position(pos);
-
-					//update hover
-					Ref<InputEventMouseMotion> ie;
-					ie.instance();
-					ie->set_position(b->get_position() - Vector2(0, s));
-					_gui_input(ie);
-				}
+				_scroll(b->get_factor(), b->get_position());
 			} break;
 			case BUTTON_LEFT: {
 
@@ -387,6 +377,11 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
 			update();
 		}
 	}
+
+	Ref<InputEventPanGesture> pan_gesture = p_event;
+	if (pan_gesture.is_valid()) {
+		_scroll(-pan_gesture->get_delta().y, pan_gesture->get_position());
+	}
 }
 
 bool PopupMenu::has_point(const Point2 &p_point) const {

+ 1 - 0
scene/gui/popup_menu.h

@@ -84,6 +84,7 @@ class PopupMenu : public Popup {
 	String _get_accel_text(int p_item) const;
 	int _get_mouse_over(const Point2 &p_over) const;
 	virtual Size2 get_minimum_size() const;
+	void _scroll(float p_factor, const Point2 &p_over);
 	void _gui_input(const Ref<InputEvent> &p_event);
 	void _activate_submenu(int over);
 	void _submenu_timeout();