Example #1
0
void mouse_handler_base::mouse_wheel(int scrollx, int scrolly, bool browse)
{
    int x, y;
    SDL_GetMouseState(&x, &y);

    int movex = scrollx * preferences::scroll_speed();
    int movey = scrolly * preferences::scroll_speed();

    // Don't scroll map and map zoom slider at same time
    gui::slider* s = gui().find_slider("map-zoom-slider");
    if (s && point_in_rect(x, y, s->location())) {
        movex = 0;
        movey = 0;
    }

    if (movex != 0 || movey != 0) {
        CKey pressed;
        // Alt + mousewheel do an 90° rotation on the scroll direction
        if (pressed[SDLK_LALT] || pressed[SDLK_RALT]) {
            gui().scroll(movey,movex);
        } else {
            gui().scroll(movex,-movey);
        }
    }

    if (scrollx < 0) {
        mouse_wheel_left(x, y, browse);
    } else if (scrollx > 0) {
        mouse_wheel_right(x, y, browse);
    }

    if (scrolly < 0) {
        mouse_wheel_down(x, y, browse);
    } else if (scrolly > 0) {
        mouse_wheel_up(x, y, browse);
    }
}
void mouse_handler_base::mouse_press(const SDL_MouseButtonEvent& event, const bool browse)
{
	if(is_middle_click(event) && !preferences::middle_click_scrolls()) {
		simple_warp_ = true;
	}
	show_menu_ = false;
	map_location loc = gui().hex_clicked_on(event.x,event.y);
	mouse_update(browse, loc);
#if !SDL_VERSION_ATLEAST(2,0,0)
	int scrollx = 0;
	int scrolly = 0;
#endif

	if (is_left_click(event)) {
		if (event.state == SDL_PRESSED) {
			cancel_dragging();
			init_dragging(dragging_left_);
			left_click(event.x, event.y, browse);
		} else if (event.state == SDL_RELEASED) {
			minimap_scrolling_ = false;
			clear_dragging(event, browse);
			left_mouse_up(event.x, event.y, browse);
		}
	} else if (is_right_click(event)) {
		if (event.state == SDL_PRESSED) {
			cancel_dragging();
			init_dragging(dragging_right_);
			right_click(event.x, event.y, browse);
		} else if (event.state == SDL_RELEASED) {
			minimap_scrolling_ = false;
			clear_dragging(event, browse);
			right_mouse_up(event.x, event.y, browse);
		}
	} else if (is_middle_click(event)) {
		if (event.state == SDL_PRESSED) {
			set_scroll_start(event.x, event.y);
			scroll_started_ = true;

			map_location loc = gui().minimap_location_on(event.x,event.y);
			minimap_scrolling_ = false;
			if(loc.valid()) {
				simple_warp_ = false;
				minimap_scrolling_ = true;
				last_hex_ = loc;
				gui().scroll_to_tile(loc,display::WARP,false);
			} else if(simple_warp_) {
				// middle click not on minimap, check gamemap instead
				loc = gui().hex_clicked_on(event.x,event.y);
				if(loc.valid()) {
					last_hex_ = loc;
					gui().scroll_to_tile(loc,display::WARP,false);
				}
			}
		} else if (event.state == SDL_RELEASED) {
			minimap_scrolling_ = false;
			simple_warp_ = false;
			scroll_started_ = false;
		}
	}
#if !SDL_VERSION_ATLEAST(2,0,0)
	else if (allow_mouse_wheel_scroll(event.x, event.y)) {
		if (event.button == SDL_BUTTON_WHEELUP) {
			scrolly = - preferences::scroll_speed();
			mouse_wheel_up(event.x, event.y, browse);
		} else if (event.button == SDL_BUTTON_WHEELDOWN) {
			scrolly = preferences::scroll_speed();
			mouse_wheel_down(event.x, event.y, browse);
		} else if (event.button == SDL_BUTTON_WHEELLEFT) {
			scrollx = - preferences::scroll_speed();
			mouse_wheel_left(event.x, event.y, browse);
		} else if (event.button == SDL_BUTTON_WHEELRIGHT) {
			scrollx = preferences::scroll_speed();
			mouse_wheel_right(event.x, event.y, browse);
		}

		// Don't scroll map and map zoom slider at same time
		gui::slider* s = gui().find_slider("map-zoom-slider");
		if (s && sdl::point_in_rect(event.x, event.y, s->location())) {
			scrollx = 0; scrolly = 0;
		}
	}

	if (scrollx != 0 || scrolly != 0) {
		CKey pressed;
		// Alt + mousewheel do an 90° rotation on the scroll direction
		if (pressed[SDLK_LALT] || pressed[SDLK_RALT])
			gui().scroll(scrolly,scrollx);
		else
			gui().scroll(scrollx,scrolly);
	}
#endif
	if (!dragging_left_ && !dragging_right_ && dragging_started_) {
		dragging_started_ = false;
		cursor::set_dragging(false);
	}
	mouse_update(browse, loc);
}