mirror of
https://github.com/a-b-street/abstreet.git
synced 2025-01-02 03:18:55 +03:00
click minimap to warp
This commit is contained in:
parent
c0cfbde4ec
commit
b8bb2667c2
@ -3,14 +3,57 @@ use crate::ui::UI;
|
||||
use ezgui::{Color, EventCtx, GfxCtx, ScreenPt, ScreenRectangle};
|
||||
use geom::{Distance, Polygon, Pt2D, Ring};
|
||||
|
||||
pub struct Minimap {}
|
||||
pub struct Minimap {
|
||||
dragging: bool,
|
||||
}
|
||||
|
||||
impl Minimap {
|
||||
pub fn new() -> Minimap {
|
||||
Minimap {}
|
||||
Minimap { dragging: false }
|
||||
}
|
||||
|
||||
pub fn event(&mut self, _: &mut UI, _: &mut EventCtx) {}
|
||||
pub fn event(&mut self, ui: &mut UI, ctx: &mut EventCtx) {
|
||||
// TODO duplicate some stuff for now, until we figure out what to cache
|
||||
let square_len = 0.15 * ctx.canvas.window_width;
|
||||
let top_left = ScreenPt::new(
|
||||
ctx.canvas.window_width - square_len - 50.0,
|
||||
ctx.canvas.window_height - square_len - 50.0,
|
||||
);
|
||||
let padding = 10.0;
|
||||
let inner_rect = ScreenRectangle {
|
||||
x1: top_left.x + padding,
|
||||
x2: top_left.x + square_len - padding,
|
||||
y1: top_left.y + padding,
|
||||
y2: top_left.y + square_len - padding,
|
||||
};
|
||||
|
||||
let mut pt = ctx.canvas.get_cursor_in_screen_space();
|
||||
if self.dragging {
|
||||
if ctx.input.left_mouse_button_released() {
|
||||
self.dragging = false;
|
||||
}
|
||||
// Don't drag out of inner_rect
|
||||
pt.x = clamp(pt.x, inner_rect.x1, inner_rect.x2);
|
||||
pt.y = clamp(pt.y, inner_rect.y1, inner_rect.y2);
|
||||
} else if inner_rect.contains(pt) && ctx.input.left_mouse_button_pressed() {
|
||||
self.dragging = true;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
let percent_x = (pt.x - inner_rect.x1) / (inner_rect.x2 - inner_rect.x1);
|
||||
let percent_y = (pt.y - inner_rect.y1) / (inner_rect.y2 - inner_rect.y1);
|
||||
|
||||
let bounds = ui.primary.map.get_bounds();
|
||||
let zoom = (square_len - (padding * 2.0)) / (bounds.max_x - bounds.min_x);
|
||||
|
||||
// We're stretching to fit the entire width, so...
|
||||
let map_x = percent_x * (bounds.max_x - bounds.min_x);
|
||||
// The y2 on the map that we're currently displaying
|
||||
let map_y2 = bounds.min_y + (inner_rect.y2 - inner_rect.y1) / zoom;
|
||||
let map_pt = Pt2D::new(map_x, percent_y * (map_y2 - bounds.min_y));
|
||||
ctx.canvas.center_on_map_pt(map_pt);
|
||||
}
|
||||
|
||||
pub fn draw(&self, g: &mut GfxCtx, ui: &UI) {
|
||||
if g.canvas.cam_zoom < MIN_ZOOM_FOR_DETAIL {
|
||||
|
Loading…
Reference in New Issue
Block a user