about summary refs log tree commit diff stats
path: root/src/area_popup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/area_popup.cpp')
-rw-r--r--src/area_popup.cpp68
1 files changed, 43 insertions, 25 deletions
diff --git a/src/area_popup.cpp b/src/area_popup.cpp index 467a2bc..aabf20b 100644 --- a/src/area_popup.cpp +++ b/src/area_popup.cpp
@@ -15,20 +15,16 @@ AreaPopup::AreaPopup(wxWindow* parent, int area_id)
15 : wxScrolledCanvas(parent, wxID_ANY), area_id_(area_id) { 15 : wxScrolledCanvas(parent, wxID_ANY), area_id_(area_id) {
16 SetBackgroundStyle(wxBG_STYLE_PAINT); 16 SetBackgroundStyle(wxBG_STYLE_PAINT);
17 17
18 unchecked_eye_ = 18 LoadIcons();
19 wxBitmap(wxImage(GetAbsolutePath("assets/unchecked.png").c_str(),
20 wxBITMAP_TYPE_PNG)
21 .Scale(32, 32));
22 checked_eye_ = wxBitmap(
23 wxImage(GetAbsolutePath("assets/checked.png").c_str(), wxBITMAP_TYPE_PNG)
24 .Scale(32, 32));
25 19
20 // TODO: This is slow on high-DPI screens.
26 SetScrollRate(5, 5); 21 SetScrollRate(5, 5);
27 22
28 SetBackgroundColour(*wxBLACK); 23 SetBackgroundColour(*wxBLACK);
29 Hide(); 24 Hide();
30 25
31 Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this); 26 Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this);
27 Bind(wxEVT_DPI_CHANGED, &AreaPopup::OnDPIChanged, this);
32 28
33 UpdateIndicators(); 29 UpdateIndicators();
34} 30}
@@ -36,15 +32,17 @@ AreaPopup::AreaPopup(wxWindow* parent, int area_id)
36void AreaPopup::UpdateIndicators() { 32void AreaPopup::UpdateIndicators() {
37 const MapArea& map_area = GD_GetMapArea(area_id_); 33 const MapArea& map_area = GD_GetMapArea(area_id_);
38 34
35 wxFont the_font = GetFont().Scale(GetDPIScaleFactor());
36
39 // Start calculating extents. 37 // Start calculating extents.
40 wxMemoryDC mem_dc; 38 wxMemoryDC mem_dc;
41 mem_dc.SetFont(GetFont().Bold()); 39 mem_dc.SetFont(the_font.Bold());
42 wxSize header_extent = mem_dc.GetTextExtent(map_area.name); 40 wxSize header_extent = mem_dc.GetTextExtent(map_area.name);
43 41
44 int acc_height = header_extent.GetHeight() + 20; 42 int acc_height = header_extent.GetHeight() + FromDIP(20);
45 int col_width = 0; 43 int col_width = 0;
46 44
47 mem_dc.SetFont(GetFont()); 45 mem_dc.SetFont(the_font);
48 46
49 TrackerPanel* tracker_panel = dynamic_cast<TrackerPanel*>(GetParent()); 47 TrackerPanel* tracker_panel = dynamic_cast<TrackerPanel*>(GetParent());
50 48
@@ -68,7 +66,8 @@ void AreaPopup::UpdateIndicators() {
68 real_locations.push_back(section_id); 66 real_locations.push_back(section_id);
69 67
70 wxSize item_extent = mem_dc.GetTextExtent(location.name); 68 wxSize item_extent = mem_dc.GetTextExtent(location.name);
71 int item_height = std::max(32, item_extent.GetHeight()) + 10; 69 int item_height =
70 std::max(FromDIP(32), item_extent.GetHeight()) + FromDIP(10);
72 acc_height += item_height; 71 acc_height += item_height;
73 72
74 if (item_extent.GetWidth() > col_width) { 73 if (item_extent.GetWidth() > col_width) {
@@ -80,7 +79,8 @@ void AreaPopup::UpdateIndicators() {
80 for (int painting_id : map_area.paintings) { 79 for (int painting_id : map_area.paintings) {
81 const PaintingExit& painting = GD_GetPaintingExit(painting_id); 80 const PaintingExit& painting = GD_GetPaintingExit(painting_id);
82 wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); 81 wxSize item_extent = mem_dc.GetTextExtent(painting.display_name);
83 int item_height = std::max(32, item_extent.GetHeight()) + 10; 82 int item_height =
83 std::max(FromDIP(32), item_extent.GetHeight()) + FromDIP(10);
84 acc_height += item_height; 84 acc_height += item_height;
85 85
86 if (item_extent.GetWidth() > col_width) { 86 if (item_extent.GetWidth() > col_width) {
@@ -89,8 +89,8 @@ void AreaPopup::UpdateIndicators() {
89 } 89 }
90 } 90 }
91 91
92 int item_width = col_width + 10 + 32; 92 int item_width = col_width + FromDIP(10 + 32);
93 int full_width = std::max(header_extent.GetWidth(), item_width) + 20; 93 int full_width = std::max(header_extent.GetWidth(), item_width) + FromDIP(20);
94 94
95 Fit(); 95 Fit();
96 SetVirtualSize(full_width, acc_height); 96 SetVirtualSize(full_width, acc_height);
@@ -101,14 +101,14 @@ void AreaPopup::UpdateIndicators() {
101 mem_dc.SetBrush(*wxBLACK_BRUSH); 101 mem_dc.SetBrush(*wxBLACK_BRUSH);
102 mem_dc.DrawRectangle({0, 0}, {full_width, acc_height}); 102 mem_dc.DrawRectangle({0, 0}, {full_width, acc_height});
103 103
104 mem_dc.SetFont(GetFont().Bold()); 104 mem_dc.SetFont(the_font.Bold());
105 mem_dc.SetTextForeground(*wxWHITE); 105 mem_dc.SetTextForeground(*wxWHITE);
106 mem_dc.DrawText(map_area.name, 106 mem_dc.DrawText(map_area.name,
107 {(full_width - header_extent.GetWidth()) / 2, 10}); 107 {(full_width - header_extent.GetWidth()) / 2, FromDIP(10)});
108 108
109 int cur_height = header_extent.GetHeight() + 20; 109 int cur_height = header_extent.GetHeight() + FromDIP(20);
110 110
111 mem_dc.SetFont(GetFont()); 111 mem_dc.SetFont(the_font);
112 112
113 for (int section_id : real_locations) { 113 for (int section_id : real_locations) {
114 const Location& location = map_area.locations.at(section_id); 114 const Location& location = map_area.locations.at(section_id);
@@ -131,7 +131,7 @@ void AreaPopup::UpdateIndicators() {
131 131
132 wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_; 132 wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_;
133 133
134 mem_dc.DrawBitmap(*eye_ptr, {10, cur_height}); 134 mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), cur_height});
135 135
136 bool reachable = IsLocationReachable(location.ap_location_id); 136 bool reachable = IsLocationReachable(location.ap_location_id);
137 const wxColour* text_color = reachable ? wxWHITE : wxRED; 137 const wxColour* text_color = reachable ? wxWHITE : wxRED;
@@ -140,9 +140,10 @@ void AreaPopup::UpdateIndicators() {
140 wxSize item_extent = mem_dc.GetTextExtent(location.name); 140 wxSize item_extent = mem_dc.GetTextExtent(location.name);
141 mem_dc.DrawText( 141 mem_dc.DrawText(
142 location.name, 142 location.name,
143 {10 + 32 + 10, cur_height + (32 - mem_dc.GetFontMetrics().height) / 2}); 143 {FromDIP(10 + 32 + 10),
144 cur_height + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2});
144 145
145 cur_height += 10 + 32; 146 cur_height += FromDIP(10 + 32);
146 } 147 }
147 148
148 if (AP_IsPaintingShuffle() && !tracker_panel->IsPanelsMode()) { 149 if (AP_IsPaintingShuffle() && !tracker_panel->IsPanelsMode()) {
@@ -155,14 +156,14 @@ void AreaPopup::UpdateIndicators() {
155 156
156 bool checked = reachable && AP_IsPaintingChecked(painting.internal_id); 157 bool checked = reachable && AP_IsPaintingChecked(painting.internal_id);
157 wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_; 158 wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_;
158 mem_dc.DrawBitmap(*eye_ptr, {10, cur_height}); 159 mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), cur_height});
159 160
160 wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); 161 wxSize item_extent = mem_dc.GetTextExtent(painting.display_name);
161 mem_dc.DrawText(painting.display_name, 162 mem_dc.DrawText(painting.display_name,
162 {10 + 32 + 10, 163 {FromDIP(10 + 32 + 10),
163 cur_height + (32 - mem_dc.GetFontMetrics().height) / 2}); 164 cur_height + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2});
164 165
165 cur_height += 10 + 32; 166 cur_height += FromDIP(10 + 32);
166 } 167 }
167 } 168 }
168} 169}
@@ -174,3 +175,20 @@ void AreaPopup::OnPaint(wxPaintEvent& event) {
174 175
175 event.Skip(); 176 event.Skip();
176} 177}
178
179void AreaPopup::OnDPIChanged(wxDPIChangedEvent& event) {
180 LoadIcons();
181 UpdateIndicators();
182}
183
184void AreaPopup::LoadIcons() {
185 // TODO: We do not have to read these in and scale them for every single
186 // popup.
187 unchecked_eye_ =
188 wxBitmap(wxImage(GetAbsolutePath("assets/unchecked.png").c_str(),
189 wxBITMAP_TYPE_PNG)
190 .Scale(FromDIP(32), FromDIP(32)));
191 checked_eye_ = wxBitmap(
192 wxImage(GetAbsolutePath("assets/checked.png").c_str(), wxBITMAP_TYPE_PNG)
193 .Scale(FromDIP(32), FromDIP(32)));
194}