mirror of
https://github.com/wesnoth/wesnoth
synced 2025-05-11 17:59:10 +00:00
parent
dc48c6dc63
commit
4e58b57e95
@ -43,6 +43,9 @@ controller_base::controller_base()
|
|||||||
, scroll_down_(false)
|
, scroll_down_(false)
|
||||||
, scroll_left_(false)
|
, scroll_left_(false)
|
||||||
, scroll_right_(false)
|
, scroll_right_(false)
|
||||||
|
, last_scroll_tick_(0)
|
||||||
|
, scroll_carry_x_(0.0)
|
||||||
|
, scroll_carry_y_(0.0)
|
||||||
, key_release_listener_(*this)
|
, key_release_listener_(*this)
|
||||||
, last_mouse_is_touch_(false)
|
, last_mouse_is_touch_(false)
|
||||||
, long_touch_timer_(0)
|
, long_touch_timer_(0)
|
||||||
@ -273,7 +276,7 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags)
|
|||||||
|| preferences::get("scroll_when_mouse_outside", true);
|
|| preferences::get("scroll_when_mouse_outside", true);
|
||||||
|
|
||||||
int scroll_speed = preferences::scroll_speed();
|
int scroll_speed = preferences::scroll_speed();
|
||||||
int dx = 0, dy = 0;
|
double dx = 0.0, dy = 0.0;
|
||||||
|
|
||||||
int scroll_threshold = preferences::mouse_scroll_enabled()
|
int scroll_threshold = preferences::mouse_scroll_enabled()
|
||||||
? preferences::mouse_scroll_threshold()
|
? preferences::mouse_scroll_threshold()
|
||||||
@ -285,28 +288,41 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scale scroll distance according to time passed
|
||||||
|
uint32_t tick_now = SDL_GetTicks();
|
||||||
|
// If we weren't previously scrolling, start small.
|
||||||
|
int dt = 1;
|
||||||
|
if (scrolling_) {
|
||||||
|
dt = tick_now - last_scroll_tick_;
|
||||||
|
}
|
||||||
|
// scroll_speed is in percent. Ticks are in milliseconds.
|
||||||
|
// Let's assume the maximum speed (100) moves 50 hexes per second,
|
||||||
|
// i.e. 3600 pixels per 1000 ticks.
|
||||||
|
double scroll_amount = double(dt) * 0.036 * double(scroll_speed);
|
||||||
|
last_scroll_tick_ = tick_now;
|
||||||
|
|
||||||
// Apply keyboard scrolling
|
// Apply keyboard scrolling
|
||||||
dy -= scroll_up_ * scroll_speed;
|
dy -= scroll_up_ * scroll_amount;
|
||||||
dy += scroll_down_ * scroll_speed;
|
dy += scroll_down_ * scroll_amount;
|
||||||
dx -= scroll_left_ * scroll_speed;
|
dx -= scroll_left_ * scroll_amount;
|
||||||
dx += scroll_right_ * scroll_speed;
|
dx += scroll_right_ * scroll_amount;
|
||||||
|
|
||||||
// Scroll if mouse is placed near the edge of the screen
|
// Scroll if mouse is placed near the edge of the screen
|
||||||
if(mouse_in_window) {
|
if(mouse_in_window) {
|
||||||
if(mousey < scroll_threshold) {
|
if(mousey < scroll_threshold) {
|
||||||
dy -= scroll_speed;
|
dy -= scroll_amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mousey > get_display().video().get_height() - scroll_threshold) {
|
if(mousey > get_display().video().get_height() - scroll_threshold) {
|
||||||
dy += scroll_speed;
|
dy += scroll_amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mousex < scroll_threshold) {
|
if(mousex < scroll_threshold) {
|
||||||
dx -= scroll_speed;
|
dx -= scroll_amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mousex > get_display().video().get_width() - scroll_threshold) {
|
if(mousex > get_display().video().get_width() - scroll_threshold) {
|
||||||
dx += scroll_speed;
|
dx += scroll_amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +338,7 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags)
|
|||||||
if(sdl::point_in_rect(mousex, mousey, rect) && mh_base.scroll_started()) {
|
if(sdl::point_in_rect(mousex, mousey, rect) && mh_base.scroll_started()) {
|
||||||
// Scroll speed is proportional from the distance from the first
|
// Scroll speed is proportional from the distance from the first
|
||||||
// middle click and scrolling speed preference.
|
// middle click and scrolling speed preference.
|
||||||
const double speed = 0.04 * std::sqrt(static_cast<double>(scroll_speed));
|
const double speed = 0.01 * scroll_amount;
|
||||||
const double snap_dist = 16; // Snap to horizontal/vertical scrolling
|
const double snap_dist = 16; // Snap to horizontal/vertical scrolling
|
||||||
const double x_diff = (mousex - original_loc.x);
|
const double x_diff = (mousex - original_loc.x);
|
||||||
const double y_diff = (mousey - original_loc.y);
|
const double y_diff = (mousey - original_loc.y);
|
||||||
@ -340,7 +356,27 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return get_display().scroll(dx, dy);
|
// If nothing is scrolling, just return.
|
||||||
|
if (!dx && !dy) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we are continuing a scroll, carry over any subpixel movement.
|
||||||
|
if (scrolling_) {
|
||||||
|
dx += scroll_carry_x_;
|
||||||
|
dy += scroll_carry_y_;
|
||||||
|
}
|
||||||
|
int dx_int = int(dx);
|
||||||
|
int dy_int = int(dy);
|
||||||
|
scroll_carry_x_ = dx - double(dx_int);
|
||||||
|
scroll_carry_y_ = dy - double(dy_int);
|
||||||
|
|
||||||
|
// Scroll the display
|
||||||
|
get_display().scroll(dx_int, dy_int);
|
||||||
|
|
||||||
|
// Even if the integer parts are both zero, we are still scrolling.
|
||||||
|
// The subpixel amounts will add up.
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void controller_base::play_slice(bool is_delay_enabled)
|
void controller_base::play_slice(bool is_delay_enabled)
|
||||||
|
@ -189,6 +189,12 @@ protected:
|
|||||||
bool scroll_down_;
|
bool scroll_down_;
|
||||||
bool scroll_left_;
|
bool scroll_left_;
|
||||||
bool scroll_right_;
|
bool scroll_right_;
|
||||||
|
/* When the last scroll tick was processed */
|
||||||
|
uint32_t last_scroll_tick_;
|
||||||
|
/* Sub-pixel movement left over from a previous scroll tick.
|
||||||
|
* This is added to the next scroll tick, if scrolling continues. */
|
||||||
|
double scroll_carry_x_;
|
||||||
|
double scroll_carry_y_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* A separate class for listening key-up events.
|
/* A separate class for listening key-up events.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user