diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/subway_map.cpp | 37 | ||||
| -rw-r--r-- | src/subway_map.h | 10 |
2 files changed, 47 insertions, 0 deletions
| diff --git a/src/subway_map.cpp b/src/subway_map.cpp index 0aa7df3..230a256 100644 --- a/src/subway_map.cpp +++ b/src/subway_map.cpp | |||
| @@ -25,6 +25,13 @@ SubwayMap::SubwayMap(wxWindow *parent) : wxPanel(parent, wxID_ANY) { | |||
| 25 | return; | 25 | return; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | tree_ = std::make_unique<quadtree::Quadtree<int, GetItemBox>>( | ||
| 29 | quadtree::Box<float>{0, 0, static_cast<float>(map_image_.GetWidth()), | ||
| 30 | static_cast<float>(map_image_.GetHeight())}); | ||
| 31 | for (const SubwayItem &subway_item : GD_GetSubwayItems()) { | ||
| 32 | tree_->add(subway_item.id); | ||
| 33 | } | ||
| 34 | |||
| 28 | Redraw(); | 35 | Redraw(); |
| 29 | 36 | ||
| 30 | Bind(wxEVT_PAINT, &SubwayMap::OnPaint, this); | 37 | Bind(wxEVT_PAINT, &SubwayMap::OnPaint, this); |
| @@ -47,6 +54,30 @@ void SubwayMap::OnPaint(wxPaintEvent &event) { | |||
| 47 | } | 54 | } |
| 48 | 55 | ||
| 49 | void SubwayMap::OnMouseMove(wxMouseEvent &event) { | 56 | void SubwayMap::OnMouseMove(wxMouseEvent &event) { |
| 57 | int mouse_x = std::clamp( | ||
| 58 | (event.GetX() - render_x_) * map_image_.GetWidth() / render_width_, | ||
| 59 | 0, map_image_.GetWidth() - 1); | ||
| 60 | int mouse_y = std::clamp( | ||
| 61 | (event.GetY() - render_y_) * map_image_.GetWidth() / render_width_, | ||
| 62 | 0, map_image_.GetHeight() - 1); | ||
| 63 | |||
| 64 | std::vector<int> hovered = tree_->query( | ||
| 65 | {static_cast<float>(mouse_x), static_cast<float>(mouse_y), 2, 2}); | ||
| 66 | std::optional<int> new_hovered_item; | ||
| 67 | if (!hovered.empty()) { | ||
| 68 | new_hovered_item = hovered[0]; | ||
| 69 | } | ||
| 70 | |||
| 71 | if (new_hovered_item != hovered_item_) { | ||
| 72 | if (new_hovered_item) { | ||
| 73 | wxLogVerbose("Hovered: %d", *new_hovered_item); | ||
| 74 | } else { | ||
| 75 | wxLogVerbose("Un-hovered: %d", *hovered_item_); | ||
| 76 | } | ||
| 77 | |||
| 78 | hovered_item_ = new_hovered_item; | ||
| 79 | } | ||
| 80 | |||
| 50 | event.Skip(); | 81 | event.Skip(); |
| 51 | } | 82 | } |
| 52 | 83 | ||
| @@ -121,3 +152,9 @@ void SubwayMap::Redraw() { | |||
| 121 | } | 152 | } |
| 122 | } | 153 | } |
| 123 | } | 154 | } |
| 155 | |||
| 156 | quadtree::Box<float> SubwayMap::GetItemBox::operator()(const int& id) const { | ||
| 157 | const SubwayItem &subway_item = GD_GetSubwayItem(id); | ||
| 158 | return {static_cast<float>(subway_item.x), static_cast<float>(subway_item.y), | ||
| 159 | AREA_ACTUAL_SIZE, AREA_ACTUAL_SIZE}; | ||
| 160 | } | ||
| diff --git a/src/subway_map.h b/src/subway_map.h index e375750..6cb5c63 100644 --- a/src/subway_map.h +++ b/src/subway_map.h | |||
| @@ -7,8 +7,12 @@ | |||
| 7 | #include <wx/wx.h> | 7 | #include <wx/wx.h> |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | #include <memory> | ||
| 11 | #include <optional> | ||
| 10 | #include <vector> | 12 | #include <vector> |
| 11 | 13 | ||
| 14 | #include <quadtree/Quadtree.h> | ||
| 15 | |||
| 12 | class SubwayMap : public wxPanel { | 16 | class SubwayMap : public wxPanel { |
| 13 | public: | 17 | public: |
| 14 | SubwayMap(wxWindow *parent); | 18 | SubwayMap(wxWindow *parent); |
| @@ -29,7 +33,13 @@ class SubwayMap : public wxPanel { | |||
| 29 | int render_y_ = 0; | 33 | int render_y_ = 0; |
| 30 | int render_width_ = 0; | 34 | int render_width_ = 0; |
| 31 | int render_height_ = 0; | 35 | int render_height_ = 0; |
| 36 | |||
| 37 | struct GetItemBox { | ||
| 38 | quadtree::Box<float> operator()(const int &id) const; | ||
| 39 | }; | ||
| 32 | 40 | ||
| 41 | std::unique_ptr<quadtree::Quadtree<int, GetItemBox>> tree_; | ||
| 42 | std::optional<int> hovered_item_; | ||
| 33 | }; | 43 | }; |
| 34 | 44 | ||
| 35 | #endif /* end of include guard: SUBWAY_MAP_H_BD2D843E */ | 45 | #endif /* end of include guard: SUBWAY_MAP_H_BD2D843E */ |
