Implemented scrolling factor for smooth trackpad scrolling

Working platforms platform: OSX, Windows.
Support for almost all ui elements, including project list.

Ported from 304a1f5b5a (#7864).
Fixes #492 and #3913.
This commit is contained in:
Sean Bohan 2017-05-13 12:02:26 +08:00
parent e7328fe5a0
commit ee670f3724
15 changed files with 111 additions and 67 deletions

View file

@ -717,6 +717,18 @@ void GraphEdit::_input_event(const InputEvent &p_ev) {
//too difficult to get right
//set_zoom(zoom/ZOOM_SCALE);
}
if (b.button_index == BUTTON_WHEEL_UP) {
h_scroll->set_val(h_scroll->get_val() - h_scroll->get_page() * b.factor / 8);
}
if (b.button_index == BUTTON_WHEEL_DOWN) {
h_scroll->set_val(h_scroll->get_val() + h_scroll->get_page() * b.factor / 8);
}
if (b.button_index == BUTTON_WHEEL_RIGHT) {
v_scroll->set_val(v_scroll->get_val() + v_scroll->get_page() * b.factor / 8);
}
if (b.button_index == BUTTON_WHEEL_LEFT) {
v_scroll->set_val(v_scroll->get_val() - v_scroll->get_page() * b.factor / 8);
}
}
if (p_ev.type == InputEvent::KEY && p_ev.key.scancode == KEY_D && p_ev.key.pressed && p_ev.key.mod.command) {

View file

@ -519,10 +519,14 @@ void ItemList::_input_event(const InputEvent &p_event) {
}
if (p_event.type == InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index == BUTTON_WHEEL_UP && p_event.mouse_button.pressed) {
scroll_bar->set_val(scroll_bar->get_val() - scroll_bar->get_page() * p_event.mouse_button.factor / 8);
scroll_bar->set_val(scroll_bar->get_val() - scroll_bar->get_page() / 8);
}
if (p_event.type == InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index == BUTTON_WHEEL_DOWN && p_event.mouse_button.pressed) {
scroll_bar->set_val(scroll_bar->get_val() + scroll_bar->get_page() * p_event.mouse_button.factor / 8);
scroll_bar->set_val(scroll_bar->get_val() + scroll_bar->get_page() / 8);
}

View file

@ -271,7 +271,7 @@ void PopupMenu::_input_event(const InputEvent &p_event) {
Point2 pos = get_pos();
int s = (vseparation + font->get_height()) * 3;
pos.y -= s;
pos.y -= (s * b.factor);
set_pos(pos);
//update hover
@ -291,7 +291,7 @@ void PopupMenu::_input_event(const InputEvent &p_event) {
Point2 pos = get_pos();
int s = (vseparation + font->get_height()) * 3;
pos.y += s;
pos.y += (s * b.factor);
set_pos(pos);
//update hover

View file

@ -782,12 +782,14 @@ void RichTextLabel::_input_event(InputEvent p_event) {
if (b.button_index == BUTTON_WHEEL_UP) {
if (scroll_active)
vscroll->set_val(vscroll->get_val() - vscroll->get_page() / 8);
vscroll->set_val(vscroll->get_val() - vscroll->get_page() * b.factor * 0.5 / 8);
}
if (b.button_index == BUTTON_WHEEL_DOWN) {
if (scroll_active)
vscroll->set_val(vscroll->get_val() + vscroll->get_page() / 8);
vscroll->set_val(vscroll->get_val() + vscroll->get_page() * b.factor * 0.5 / 8);
}
} break;
case InputEvent::KEY: {

View file

@ -85,20 +85,32 @@ void ScrollContainer::_input_event(const InputEvent &p_input_event) {
const InputEventMouseButton &mb = p_input_event.mouse_button;
if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
// only horizontal is enabled, scroll horizontally
if (h_scroll->is_visible() && !v_scroll->is_visible()) {
// only horizontal is enabled, scroll horizontally
h_scroll->set_val(h_scroll->get_val() - h_scroll->get_page() / 8);
h_scroll->set_val(h_scroll->get_val() - h_scroll->get_page() / 8 * mb.factor);
} else if (v_scroll->is_visible()) {
v_scroll->set_val(v_scroll->get_val() - v_scroll->get_page() / 8);
v_scroll->set_val(v_scroll->get_val() - v_scroll->get_page() / 8 * mb.factor);
}
}
if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
// only horizontal is enabled, scroll horizontally
if (h_scroll->is_visible() && !v_scroll->is_visible()) {
// only horizontal is enabled, scroll horizontally
h_scroll->set_val(h_scroll->get_val() + h_scroll->get_page() / 8);
h_scroll->set_val(h_scroll->get_val() + h_scroll->get_page() / 8 * mb.factor);
} else if (v_scroll->is_visible()) {
v_scroll->set_val(v_scroll->get_val() + v_scroll->get_page() / 8);
v_scroll->set_val(v_scroll->get_val() + v_scroll->get_page() / 8 * mb.factor);
}
}
if (mb.button_index == BUTTON_WHEEL_LEFT && mb.pressed) {
if (h_scroll->is_visible()) {
h_scroll->set_val(h_scroll->get_val() - h_scroll->get_page() * mb.factor / 8);
}
}
if (mb.button_index == BUTTON_WHEEL_RIGHT && mb.pressed) {
if (h_scroll->is_visible()) {
h_scroll->set_val(h_scroll->get_val() + h_scroll->get_page() * mb.factor / 8);
}
}

View file

@ -113,13 +113,15 @@ void SpinBox::_input_event(const InputEvent &p_event) {
} break;
case BUTTON_WHEEL_UP: {
if (line_edit->has_focus()) {
set_val(get_val() + get_step());
set_val(get_val() + get_step() * mb.factor);
accept_event();
}
} break;
case BUTTON_WHEEL_DOWN: {
if (line_edit->has_focus()) {
set_val(get_val() - get_step());
set_val(get_val() - get_step() * mb.factor);
accept_event();
}
} break;

View file

@ -333,7 +333,10 @@ void TextEdit::_update_scrollbars() {
v_scroll->show();
v_scroll->set_max(total_rows);
v_scroll->set_page(visible_rows);
v_scroll->set_val(cursor.line_ofs);
if (fabs(v_scroll->get_val() - (double)cursor.line_ofs) >= 1) {
v_scroll->set_val(cursor.line_ofs);
}
} else {
cursor.line_ofs = 0;
@ -345,7 +348,9 @@ void TextEdit::_update_scrollbars() {
h_scroll->show();
h_scroll->set_max(total_width);
h_scroll->set_page(visible_width);
h_scroll->set_val(cursor.x_ofs);
if (fabs(h_scroll->get_val() - (double)cursor.x_ofs) >= 1) {
h_scroll->set_val(cursor.x_ofs);
}
} else {
@ -1431,17 +1436,18 @@ void TextEdit::_input_event(const InputEvent &p_input_event) {
}
if (mb.pressed) {
if (mb.button_index == BUTTON_WHEEL_UP && !mb.mod.command) {
v_scroll->set_val(v_scroll->get_val() - 3);
v_scroll->set_val(v_scroll->get_val() - (3 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_DOWN && !mb.mod.command) {
v_scroll->set_val(v_scroll->get_val() + 3);
v_scroll->set_val(v_scroll->get_val() + (3 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_LEFT) {
h_scroll->set_val(h_scroll->get_val() - 3);
h_scroll->set_val(h_scroll->get_val() - (100 * mb.factor));
}
if (mb.button_index == BUTTON_WHEEL_RIGHT) {
h_scroll->set_val(h_scroll->get_val() + 3);
h_scroll->set_val(h_scroll->get_val() + (100 * mb.factor));
}
if (mb.button_index == BUTTON_LEFT) {

View file

@ -2299,11 +2299,11 @@ void Tree::_input_event(InputEvent p_event) {
} break;
case BUTTON_WHEEL_UP: {
v_scroll->set_val(v_scroll->get_val() - v_scroll->get_page() / 8);
v_scroll->set_val(v_scroll->get_val() - v_scroll->get_page() * b.factor / 8);
} break;
case BUTTON_WHEEL_DOWN: {
v_scroll->set_val(v_scroll->get_val() + v_scroll->get_page() / 8);
v_scroll->set_val(v_scroll->get_val() + v_scroll->get_page() * b.factor / 8);
} break;
}