diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-05-19 11:48:34 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-05-19 11:48:34 -0400 |
commit | eaa21c53b96b945d8809dc5f4a9353ecaaacc266 (patch) | |
tree | f36d399002934d608945c6a0ab38d40c8bf0662c | |
parent | e50107d0339000c48a955caab8b56d0d4fc56e84 (diff) | |
download | lingo-ap-tracker-eaa21c53b96b945d8809dc5f4a9353ecaaacc266.tar.gz lingo-ap-tracker-eaa21c53b96b945d8809dc5f4a9353ecaaacc266.tar.bz2 lingo-ap-tracker-eaa21c53b96b945d8809dc5f4a9353ecaaacc266.zip |
Zoom slider
-rw-r--r-- | src/subway_map.cpp | 31 | ||||
-rw-r--r-- | src/subway_map.h | 4 |
2 files changed, 28 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), |
diff --git a/src/subway_map.h b/src/subway_map.h index 9b0b43f..e891058 100644 --- a/src/subway_map.h +++ b/src/subway_map.h | |||
@@ -32,6 +32,7 @@ class SubwayMap : public wxPanel { | |||
32 | void OnMouseScroll(wxMouseEvent &event); | 32 | void OnMouseScroll(wxMouseEvent &event); |
33 | void OnMouseLeave(wxMouseEvent &event); | 33 | void OnMouseLeave(wxMouseEvent &event); |
34 | void OnTimer(wxTimerEvent &event); | 34 | void OnTimer(wxTimerEvent &event); |
35 | void OnZoomSlide(wxCommandEvent &event); | ||
35 | 36 | ||
36 | void Redraw(); | 37 | void Redraw(); |
37 | 38 | ||
@@ -41,6 +42,7 @@ class SubwayMap : public wxPanel { | |||
41 | 42 | ||
42 | void SetZoomPos(wxPoint pos); | 43 | void SetZoomPos(wxPoint pos); |
43 | void SetScrollSpeed(int scroll_x, int scroll_y); | 44 | void SetScrollSpeed(int scroll_x, int scroll_y); |
45 | void SetZoom(double zoom, wxPoint static_point); | ||
44 | 46 | ||
45 | wxImage map_image_; | 47 | wxImage map_image_; |
46 | wxImage owl_image_; | 48 | wxImage owl_image_; |
@@ -61,6 +63,8 @@ class SubwayMap : public wxPanel { | |||
61 | int scroll_x_ = 0; | 63 | int scroll_x_ = 0; |
62 | int scroll_y_ = 0; | 64 | int scroll_y_ = 0; |
63 | 65 | ||
66 | wxSlider *zoom_slider_; | ||
67 | |||
64 | struct GetItemBox { | 68 | struct GetItemBox { |
65 | quadtree::Box<float> operator()(const int &id) const; | 69 | quadtree::Box<float> operator()(const int &id) const; |
66 | }; | 70 | }; |