about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-03-10 13:35:48 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2025-03-10 13:35:48 -0400
commit0121ce8e79a17336e42ccd14afd9a9c5dbfb29df (patch)
tree5ed1a9431130811259f7eec94eae72b6b05bd8bd /src
parent30f9e78cb30178834c420106c9f515c8358c4dbf (diff)
downloadlingo-ap-tracker-0121ce8e79a17336e42ccd14afd9a9c5dbfb29df.tar.gz
lingo-ap-tracker-0121ce8e79a17336e42ccd14afd9a9c5dbfb29df.tar.bz2
lingo-ap-tracker-0121ce8e79a17336e42ccd14afd9a9c5dbfb29df.zip
Optimized TrackerPanel refresh
Scaling the map image, determining which map areas are active, placing each area indicator, and positioning the area popups now only happen when necessary (the panel is resized / DPI changed, new connection, hunt settings changed). Notably, this means that updating indicators in a regular way such as from clearing locations will not have to resize the image or reposition windows. It will just redraw all of the indicators on the map image.
Diffstat (limited to 'src')
-rw-r--r--src/tracker_panel.cpp116
-rw-r--r--src/tracker_panel.h3
2 files changed, 70 insertions, 49 deletions
diff --git a/src/tracker_panel.cpp b/src/tracker_panel.cpp index 64e6ab3..37e3265 100644 --- a/src/tracker_panel.cpp +++ b/src/tracker_panel.cpp
@@ -44,6 +44,7 @@ TrackerPanel::TrackerPanel(wxWindow *parent) : wxPanel(parent, wxID_ANY) {
44 areas_.push_back(area); 44 areas_.push_back(area);
45 } 45 }
46 46
47 Resize();
47 Redraw(); 48 Redraw();
48 49
49 Bind(wxEVT_PAINT, &TrackerPanel::OnPaint, this); 50 Bind(wxEVT_PAINT, &TrackerPanel::OnPaint, this);
@@ -57,8 +58,24 @@ void TrackerPanel::UpdateIndicators(bool reset) {
57 58
58 if (reset) { 59 if (reset) {
59 for (AreaIndicator &area : areas_) { 60 for (AreaIndicator &area : areas_) {
61 const MapArea &map_area = GD_GetMapArea(area.area_id);
62
63 if (IsAreaPostgame(area.area_id)) {
64 area.active = false;
65 } else if (panels_mode_) {
66 area.active = map_area.has_single_panel;
67 } else if (!AP_IsLocationVisible(map_area.classification) &&
68 !(map_area.hunt && GetTrackerConfig().show_hunt_panels) &&
69 !(AP_IsPaintingShuffle() && !map_area.paintings.empty())) {
70 area.active = false;
71 } else {
72 area.active = true;
73 }
74
60 area.popup->ResetIndicators(); 75 area.popup->ResetIndicators();
61 } 76 }
77
78 Resize();
62 } else { 79 } else {
63 for (AreaIndicator &area : areas_) { 80 for (AreaIndicator &area : areas_) {
64 area.popup->UpdateIndicators(); 81 area.popup->UpdateIndicators();
@@ -103,6 +120,7 @@ void TrackerPanel::RefreshSavedata() {
103 120
104void TrackerPanel::OnPaint(wxPaintEvent &event) { 121void TrackerPanel::OnPaint(wxPaintEvent &event) {
105 if (GetSize() != rendered_.GetSize()) { 122 if (GetSize() != rendered_.GetSize()) {
123 Resize();
106 Redraw(); 124 Redraw();
107 125
108 if (refresh_button_ != nullptr) { 126 if (refresh_button_ != nullptr) {
@@ -160,7 +178,7 @@ void TrackerPanel::OnRefreshSavedata(wxCommandEvent &event) {
160 RefreshSavedata(); 178 RefreshSavedata();
161} 179}
162 180
163void TrackerPanel::Redraw() { 181void TrackerPanel::Resize() {
164 wxSize panel_size = GetSize(); 182 wxSize panel_size = GetSize();
165 wxSize image_size = map_image_.GetSize(); 183 wxSize image_size = map_image_.GetSize();
166 184
@@ -180,7 +198,7 @@ void TrackerPanel::Redraw() {
180 final_x = (panel_size.GetWidth() - final_width) / 2; 198 final_x = (panel_size.GetWidth() - final_width) / 2;
181 } 199 }
182 200
183 rendered_ = wxBitmap( 201 scaled_map_ = wxBitmap(
184 map_image_.Scale(final_width, final_height, wxIMAGE_QUALITY_NORMAL) 202 map_image_.Scale(final_width, final_height, wxIMAGE_QUALITY_NORMAL)
185 .Size(panel_size, {final_x, final_y}, 0, 0, 0)); 203 .Size(panel_size, {final_x, final_y}, 0, 0, 0));
186 204
@@ -195,32 +213,57 @@ void TrackerPanel::Redraw() {
195 wxBitmap(player_image_.Scale(player_width > 0 ? player_width : 1, 213 wxBitmap(player_image_.Scale(player_width > 0 ? player_width : 1,
196 player_height > 0 ? player_height : 1)); 214 player_height > 0 ? player_height : 1));
197 215
216 real_area_size_ = final_width * AREA_EFFECTIVE_SIZE / image_size.GetWidth();
217
218 for (AreaIndicator &area : areas_) {
219 const MapArea &map_area = GD_GetMapArea(area.area_id);
220
221 int real_area_x = final_x + (map_area.map_x - (AREA_EFFECTIVE_SIZE / 2)) *
222 final_width / image_size.GetWidth();
223 int real_area_y = final_y + (map_area.map_y - (AREA_EFFECTIVE_SIZE / 2)) *
224 final_width / image_size.GetWidth();
225
226 area.real_x1 = real_area_x;
227 area.real_x2 = real_area_x + real_area_size_;
228 area.real_y1 = real_area_y;
229 area.real_y2 = real_area_y + real_area_size_;
230
231 int popup_x =
232 final_x + map_area.map_x * final_width / image_size.GetWidth();
233 int popup_y =
234 final_y + map_area.map_y * final_width / image_size.GetWidth();
235
236 area.popup->SetClientSize(
237 area.popup->GetVirtualSize().GetWidth(),
238 std::min(panel_size.GetHeight(),
239 area.popup->GetVirtualSize().GetHeight()));
240
241 if (popup_x + area.popup->GetSize().GetWidth() > panel_size.GetWidth()) {
242 popup_x = panel_size.GetWidth() - area.popup->GetSize().GetWidth();
243 }
244 if (popup_y + area.popup->GetSize().GetHeight() > panel_size.GetHeight()) {
245 popup_y = panel_size.GetHeight() - area.popup->GetSize().GetHeight();
246 }
247 area.popup->SetPosition({popup_x, popup_y});
248 }
249}
250
251void TrackerPanel::Redraw() {
252 rendered_ = scaled_map_;
253
198 wxMemoryDC dc; 254 wxMemoryDC dc;
199 dc.SelectObject(rendered_); 255 dc.SelectObject(rendered_);
200 256
201 int real_area_size =
202 final_width * AREA_EFFECTIVE_SIZE / image_size.GetWidth();
203 int actual_border_size = 257 int actual_border_size =
204 real_area_size * AREA_BORDER_SIZE / AREA_EFFECTIVE_SIZE; 258 real_area_size_ * AREA_BORDER_SIZE / AREA_EFFECTIVE_SIZE;
205 const wxPoint upper_left_triangle[] = { 259 const wxPoint upper_left_triangle[] = {
206 {0, 0}, {0, real_area_size}, {real_area_size, 0}}; 260 {0, 0}, {0, real_area_size_}, {real_area_size_, 0}};
207 const wxPoint lower_right_triangle[] = {{0, real_area_size - 1}, 261 const wxPoint lower_right_triangle[] = {{0, real_area_size_ - 1},
208 {real_area_size - 1, 0}, 262 {real_area_size_ - 1, 0},
209 {real_area_size, real_area_size}}; 263 {real_area_size_, real_area_size_}};
210 264
211 for (AreaIndicator &area : areas_) { 265 for (AreaIndicator &area : areas_) {
212 const MapArea &map_area = GD_GetMapArea(area.area_id); 266 const MapArea &map_area = GD_GetMapArea(area.area_id);
213 if (IsAreaPostgame(area.area_id)) {
214 area.active = false;
215 } else if (panels_mode_) {
216 area.active = map_area.has_single_panel;
217 } else if (!AP_IsLocationVisible(map_area.classification) &&
218 !(map_area.hunt && GetTrackerConfig().show_hunt_panels) &&
219 !(AP_IsPaintingShuffle() && !map_area.paintings.empty())) {
220 area.active = false;
221 } else {
222 area.active = true;
223 }
224 267
225 if (!area.active) { 268 if (!area.active) {
226 continue; 269 continue;
@@ -276,10 +319,8 @@ void TrackerPanel::Redraw() {
276 } 319 }
277 } 320 }
278 321
279 int real_area_x = final_x + (map_area.map_x - (AREA_EFFECTIVE_SIZE / 2)) * 322 int real_area_x = area.real_x1;
280 final_width / image_size.GetWidth(); 323 int real_area_y = area.real_y1;
281 int real_area_y = final_y + (map_area.map_y - (AREA_EFFECTIVE_SIZE / 2)) *
282 final_width / image_size.GetWidth();
283 324
284 if (has_reachable_unchecked && has_unreachable_unchecked && 325 if (has_reachable_unchecked && has_unreachable_unchecked &&
285 GetTrackerConfig().hybrid_areas) { 326 GetTrackerConfig().hybrid_areas) {
@@ -293,7 +334,7 @@ void TrackerPanel::Redraw() {
293 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size)); 334 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size));
294 dc.SetBrush(*wxTRANSPARENT_BRUSH); 335 dc.SetBrush(*wxTRANSPARENT_BRUSH);
295 dc.DrawRectangle({real_area_x, real_area_y}, 336 dc.DrawRectangle({real_area_x, real_area_y},
296 {real_area_size, real_area_size}); 337 {real_area_size_, real_area_size_});
297 338
298 } else { 339 } else {
299 const wxBrush *brush_color = wxGREY_BRUSH; 340 const wxBrush *brush_color = wxGREY_BRUSH;
@@ -308,31 +349,8 @@ void TrackerPanel::Redraw() {
308 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size)); 349 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size));
309 dc.SetBrush(*brush_color); 350 dc.SetBrush(*brush_color);
310 dc.DrawRectangle({real_area_x, real_area_y}, 351 dc.DrawRectangle({real_area_x, real_area_y},
311 {real_area_size, real_area_size}); 352 {real_area_size_, real_area_size_});
312 } 353 }
313
314 area.real_x1 = real_area_x;
315 area.real_x2 = real_area_x + real_area_size;
316 area.real_y1 = real_area_y;
317 area.real_y2 = real_area_y + real_area_size;
318
319 int popup_x =
320 final_x + map_area.map_x * final_width / image_size.GetWidth();
321 int popup_y =
322 final_y + map_area.map_y * final_width / image_size.GetWidth();
323
324 area.popup->SetClientSize(
325 area.popup->GetVirtualSize().GetWidth(),
326 std::min(panel_size.GetHeight(),
327 area.popup->GetVirtualSize().GetHeight()));
328
329 if (popup_x + area.popup->GetSize().GetWidth() > panel_size.GetWidth()) {
330 popup_x = panel_size.GetWidth() - area.popup->GetSize().GetWidth();
331 }
332 if (popup_y + area.popup->GetSize().GetHeight() > panel_size.GetHeight()) {
333 popup_y = panel_size.GetHeight() - area.popup->GetSize().GetHeight();
334 }
335 area.popup->SetPosition({popup_x, popup_y});
336 } 354 }
337} 355}
338 356
diff --git a/src/tracker_panel.h b/src/tracker_panel.h index ae89a35..abab1bf 100644 --- a/src/tracker_panel.h +++ b/src/tracker_panel.h
@@ -44,6 +44,7 @@ class TrackerPanel : public wxPanel {
44 void OnMouseMove(wxMouseEvent &event); 44 void OnMouseMove(wxMouseEvent &event);
45 void OnRefreshSavedata(wxCommandEvent &event); 45 void OnRefreshSavedata(wxCommandEvent &event);
46 46
47 void Resize();
47 void Redraw(); 48 void Redraw();
48 49
49 void RefreshSavedata(); 50 void RefreshSavedata();
@@ -52,6 +53,7 @@ class TrackerPanel : public wxPanel {
52 53
53 wxImage map_image_; 54 wxImage map_image_;
54 wxImage player_image_; 55 wxImage player_image_;
56 wxBitmap scaled_map_;
55 wxBitmap rendered_; 57 wxBitmap rendered_;
56 wxBitmap scaled_player_; 58 wxBitmap scaled_player_;
57 59
@@ -61,6 +63,7 @@ class TrackerPanel : public wxPanel {
61 int offset_y_ = 0; 63 int offset_y_ = 0;
62 double scale_x_ = 0; 64 double scale_x_ = 0;
63 double scale_y_ = 0; 65 double scale_y_ = 0;
66 int real_area_size_ = 0;
64 67
65 std::vector<AreaIndicator> areas_; 68 std::vector<AreaIndicator> areas_;
66 69