diff options
Diffstat (limited to 'src/subway_map.cpp')
-rw-r--r-- | src/subway_map.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/subway_map.cpp b/src/subway_map.cpp index 47ebfdf..98d544c 100644 --- a/src/subway_map.cpp +++ b/src/subway_map.cpp | |||
@@ -54,6 +54,9 @@ SubwayMap::SubwayMap(wxWindow *parent) : wxPanel(parent, wxID_ANY) { | |||
54 | Bind(wxEVT_MOUSEWHEEL, &SubwayMap::OnMouseScroll, this); | 54 | Bind(wxEVT_MOUSEWHEEL, &SubwayMap::OnMouseScroll, this); |
55 | Bind(wxEVT_LEAVE_WINDOW, &SubwayMap::OnMouseLeave, this); | 55 | Bind(wxEVT_LEAVE_WINDOW, &SubwayMap::OnMouseLeave, this); |
56 | Bind(wxEVT_TIMER, &SubwayMap::OnTimer, this); | 56 | Bind(wxEVT_TIMER, &SubwayMap::OnTimer, this); |
57 | |||
58 | zoom_slider_ = new wxSlider(this, wxID_ANY, 0, 0, 8, {15, 15}); | ||
59 | zoom_slider_->Bind(wxEVT_SLIDER, &SubwayMap::OnZoomSlide, this); | ||
57 | } | 60 | } |
58 | 61 | ||
59 | void SubwayMap::OnConnect() { | 62 | void SubwayMap::OnConnect() { |
@@ -381,13 +384,7 @@ void SubwayMap::OnMouseScroll(wxMouseEvent &event) { | |||
381 | } | 384 | } |
382 | 385 | ||
383 | if (zoom_ != new_zoom) { | 386 | if (zoom_ != new_zoom) { |
384 | wxPoint map_pos = RenderPosToMapPos(event.GetPosition()); | 387 | SetZoom(new_zoom, event.GetPosition()); |
385 | zoom_ = new_zoom; | ||
386 | |||
387 | wxPoint virtual_pos = MapPosToVirtualPos(map_pos); | ||
388 | SetZoomPos(-(virtual_pos - event.GetPosition())); | ||
389 | |||
390 | Refresh(); | ||
391 | } | 388 | } |
392 | 389 | ||
393 | event.Skip(); | 390 | event.Skip(); |
@@ -400,6 +397,14 @@ void SubwayMap::OnTimer(wxTimerEvent &event) { | |||
400 | Refresh(); | 397 | Refresh(); |
401 | } | 398 | } |
402 | 399 | ||
400 | void SubwayMap::OnZoomSlide(wxCommandEvent &event) { | ||
401 | double new_zoom = 1.0 + 0.25 * zoom_slider_->GetValue(); | ||
402 | |||
403 | if (new_zoom != zoom_) { | ||
404 | SetZoom(new_zoom, {GetSize().GetWidth() / 2, GetSize().GetHeight() / 2}); | ||
405 | } | ||
406 | } | ||
407 | |||
403 | void SubwayMap::Redraw() { | 408 | void SubwayMap::Redraw() { |
404 | rendered_ = wxBitmap(map_image_); | 409 | rendered_ = wxBitmap(map_image_); |
405 | 410 | ||
@@ -530,6 +535,18 @@ void SubwayMap::SetScrollSpeed(int scroll_x, int scroll_y) { | |||
530 | scroll_y_ = scroll_y; | 535 | scroll_y_ = scroll_y; |
531 | } | 536 | } |
532 | 537 | ||
538 | void SubwayMap::SetZoom(double zoom, wxPoint static_point) { | ||
539 | wxPoint map_pos = RenderPosToMapPos(static_point); | ||
540 | zoom_ = zoom; | ||
541 | |||
542 | wxPoint virtual_pos = MapPosToVirtualPos(map_pos); | ||
543 | SetZoomPos(-(virtual_pos - static_point)); | ||
544 | |||
545 | Refresh(); | ||
546 | |||
547 | zoom_slider_->SetValue((zoom - 1.0) / 0.25); | ||
548 | } | ||
549 | |||
533 | quadtree::Box<float> SubwayMap::GetItemBox::operator()(const int &id) const { | 550 | quadtree::Box<float> SubwayMap::GetItemBox::operator()(const int &id) const { |
534 | const SubwayItem &subway_item = GD_GetSubwayItem(id); | 551 | const SubwayItem &subway_item = GD_GetSubwayItem(id); |
535 | return {static_cast<float>(subway_item.x), static_cast<float>(subway_item.y), | 552 | return {static_cast<float>(subway_item.x), static_cast<float>(subway_item.y), |