diff options
Diffstat (limited to 'src/area_popup.cpp')
-rw-r--r-- | src/area_popup.cpp | 147 |
1 files changed, 77 insertions, 70 deletions
diff --git a/src/area_popup.cpp b/src/area_popup.cpp index d7f45b6..a8e6004 100644 --- a/src/area_popup.cpp +++ b/src/area_popup.cpp | |||
@@ -27,28 +27,26 @@ AreaPopup::AreaPopup(wxWindow* parent, int area_id) | |||
27 | Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this); | 27 | Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this); |
28 | Bind(wxEVT_DPI_CHANGED, &AreaPopup::OnDPIChanged, this); | 28 | Bind(wxEVT_DPI_CHANGED, &AreaPopup::OnDPIChanged, this); |
29 | 29 | ||
30 | UpdateIndicators(); | 30 | ResetIndicators(); |
31 | } | 31 | } |
32 | 32 | ||
33 | void AreaPopup::UpdateIndicators() { | 33 | void AreaPopup::ResetIndicators() { |
34 | const MapArea& map_area = GD_GetMapArea(area_id_); | 34 | indicators_.clear(); |
35 | 35 | ||
36 | const MapArea& map_area = GD_GetMapArea(area_id_); | ||
36 | wxFont the_font = GetFont().Scale(GetDPIScaleFactor()); | 37 | wxFont the_font = GetFont().Scale(GetDPIScaleFactor()); |
38 | TrackerPanel* tracker_panel = dynamic_cast<TrackerPanel*>(GetParent()); | ||
37 | 39 | ||
38 | // Start calculating extents. | 40 | // Start calculating extents. |
39 | wxMemoryDC mem_dc; | 41 | wxMemoryDC mem_dc; |
40 | mem_dc.SetFont(the_font.Bold()); | 42 | mem_dc.SetFont(the_font.Bold()); |
41 | wxSize header_extent = mem_dc.GetTextExtent(map_area.name); | 43 | header_extent_ = mem_dc.GetTextExtent(map_area.name); |
42 | 44 | ||
43 | int acc_height = header_extent.GetHeight() + FromDIP(20); | 45 | int acc_height = header_extent_.GetHeight() + FromDIP(20); |
44 | int col_width = 0; | 46 | int col_width = 0; |
45 | 47 | ||
46 | mem_dc.SetFont(the_font); | 48 | mem_dc.SetFont(the_font); |
47 | 49 | ||
48 | TrackerPanel* tracker_panel = dynamic_cast<TrackerPanel*>(GetParent()); | ||
49 | |||
50 | std::vector<int> real_locations; | ||
51 | |||
52 | for (int section_id = 0; section_id < map_area.locations.size(); | 50 | for (int section_id = 0; section_id < map_area.locations.size(); |
53 | section_id++) { | 51 | section_id++) { |
54 | const Location& location = map_area.locations.at(section_id); | 52 | const Location& location = map_area.locations.at(section_id); |
@@ -67,7 +65,7 @@ void AreaPopup::UpdateIndicators() { | |||
67 | } | 65 | } |
68 | } | 66 | } |
69 | 67 | ||
70 | real_locations.push_back(section_id); | 68 | indicators_.emplace_back(section_id, kLOCATION, acc_height); |
71 | 69 | ||
72 | wxSize item_extent = mem_dc.GetTextExtent(location.name); | 70 | wxSize item_extent = mem_dc.GetTextExtent(location.name); |
73 | int item_height = | 71 | int item_height = |
@@ -85,6 +83,8 @@ void AreaPopup::UpdateIndicators() { | |||
85 | continue; | 83 | continue; |
86 | } | 84 | } |
87 | 85 | ||
86 | indicators_.emplace_back(painting_id, kPAINTING, acc_height); | ||
87 | |||
88 | const PaintingExit& painting = GD_GetPaintingExit(painting_id); | 88 | const PaintingExit& painting = GD_GetPaintingExit(painting_id); |
89 | wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); | 89 | wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); |
90 | int item_height = | 90 | int item_height = |
@@ -98,84 +98,91 @@ void AreaPopup::UpdateIndicators() { | |||
98 | } | 98 | } |
99 | 99 | ||
100 | int item_width = col_width + FromDIP(10 + 32); | 100 | int item_width = col_width + FromDIP(10 + 32); |
101 | int full_width = std::max(header_extent.GetWidth(), item_width) + FromDIP(20); | 101 | full_width_ = std::max(header_extent_.GetWidth(), item_width) + FromDIP(20); |
102 | full_height_ = acc_height; | ||
102 | 103 | ||
103 | Fit(); | 104 | Fit(); |
104 | SetVirtualSize(full_width, acc_height); | 105 | SetVirtualSize(full_width_, full_height_); |
106 | |||
107 | UpdateIndicators(); | ||
108 | } | ||
109 | |||
110 | void AreaPopup::UpdateIndicators() { | ||
111 | const MapArea& map_area = GD_GetMapArea(area_id_); | ||
112 | wxFont the_font = GetFont().Scale(GetDPIScaleFactor()); | ||
113 | TrackerPanel* tracker_panel = dynamic_cast<TrackerPanel*>(GetParent()); | ||
114 | |||
115 | rendered_ = wxBitmap(full_width_, full_height_); | ||
105 | 116 | ||
106 | rendered_ = wxBitmap(full_width, acc_height); | 117 | wxMemoryDC mem_dc; |
107 | mem_dc.SelectObject(rendered_); | 118 | mem_dc.SelectObject(rendered_); |
108 | mem_dc.SetPen(*wxTRANSPARENT_PEN); | 119 | mem_dc.SetPen(*wxTRANSPARENT_PEN); |
109 | mem_dc.SetBrush(*wxBLACK_BRUSH); | 120 | mem_dc.SetBrush(*wxBLACK_BRUSH); |
110 | mem_dc.DrawRectangle({0, 0}, {full_width, acc_height}); | 121 | mem_dc.DrawRectangle({0, 0}, {full_width_, full_height_}); |
111 | 122 | ||
112 | mem_dc.SetFont(the_font.Bold()); | 123 | mem_dc.SetFont(the_font.Bold()); |
113 | mem_dc.SetTextForeground(*wxWHITE); | 124 | mem_dc.SetTextForeground(*wxWHITE); |
114 | mem_dc.DrawText(map_area.name, | 125 | mem_dc.DrawText(map_area.name, |
115 | {(full_width - header_extent.GetWidth()) / 2, FromDIP(10)}); | 126 | {(full_width_ - header_extent_.GetWidth()) / 2, FromDIP(10)}); |
116 | |||
117 | int cur_height = header_extent.GetHeight() + FromDIP(20); | ||
118 | 127 | ||
119 | mem_dc.SetFont(the_font); | 128 | mem_dc.SetFont(the_font); |
120 | 129 | ||
121 | for (int section_id : real_locations) { | 130 | for (const IndicatorInfo& indicator : indicators_) { |
122 | const Location& location = map_area.locations.at(section_id); | 131 | switch (indicator.type) { |
123 | 132 | case kLOCATION: { | |
124 | bool checked = false; | 133 | const Location& location = map_area.locations.at(indicator.id); |
125 | if (IsLocationWinCondition(location)) { | 134 | |
126 | checked = AP_HasReachedGoal(); | 135 | bool checked = false; |
127 | } else if (tracker_panel->IsPanelsMode()) { | 136 | if (IsLocationWinCondition(location)) { |
128 | const Panel& panel = GD_GetPanel(*location.single_panel); | 137 | checked = AP_HasReachedGoal(); |
129 | if (panel.non_counting) { | 138 | } else if (tracker_panel->IsPanelsMode()) { |
130 | checked = AP_HasCheckedGameLocation(location.ap_location_id); | 139 | const Panel& panel = GD_GetPanel(*location.single_panel); |
131 | } else { | 140 | if (panel.non_counting) { |
132 | checked = tracker_panel->GetSolvedPanels().contains(panel.nodepath); | 141 | checked = AP_HasCheckedGameLocation(location.ap_location_id); |
142 | } else { | ||
143 | checked = tracker_panel->GetSolvedPanels().contains(panel.nodepath); | ||
144 | } | ||
145 | } else { | ||
146 | checked = AP_HasCheckedGameLocation(location.ap_location_id) || | ||
147 | (location.hunt && | ||
148 | AP_HasCheckedHuntPanel(location.ap_location_id)); | ||
149 | } | ||
150 | |||
151 | const wxBitmap* eye_ptr = checked ? checked_eye_ : unchecked_eye_; | ||
152 | |||
153 | mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), indicator.y}); | ||
154 | |||
155 | bool reachable = IsLocationReachable(location.ap_location_id); | ||
156 | const wxColour* text_color = reachable ? wxWHITE : wxRED; | ||
157 | mem_dc.SetTextForeground(*text_color); | ||
158 | |||
159 | wxSize item_extent = mem_dc.GetTextExtent(location.name); | ||
160 | mem_dc.DrawText( | ||
161 | location.name, | ||
162 | {FromDIP(10 + 32 + 10), | ||
163 | indicator.y + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2}); | ||
164 | |||
165 | break; | ||
133 | } | 166 | } |
134 | } else { | 167 | case kPAINTING: { |
135 | checked = | 168 | const PaintingExit& painting = GD_GetPaintingExit(indicator.id); |
136 | AP_HasCheckedGameLocation(location.ap_location_id) || | ||
137 | (location.hunt && AP_HasCheckedHuntPanel(location.ap_location_id)); | ||
138 | } | ||
139 | |||
140 | const wxBitmap* eye_ptr = checked ? checked_eye_ : unchecked_eye_; | ||
141 | 169 | ||
142 | mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), cur_height}); | 170 | bool reachable = IsPaintingReachable(indicator.id); |
171 | const wxColour* text_color = reachable ? wxWHITE : wxRED; | ||
172 | mem_dc.SetTextForeground(*text_color); | ||
143 | 173 | ||
144 | bool reachable = IsLocationReachable(location.ap_location_id); | 174 | bool checked = reachable && AP_IsPaintingChecked(painting.internal_id); |
145 | const wxColour* text_color = reachable ? wxWHITE : wxRED; | 175 | const wxBitmap* eye_ptr = checked ? checked_owl_ : unchecked_owl_; |
146 | mem_dc.SetTextForeground(*text_color); | 176 | mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), indicator.y}); |
147 | 177 | ||
148 | wxSize item_extent = mem_dc.GetTextExtent(location.name); | 178 | wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); |
149 | mem_dc.DrawText( | 179 | mem_dc.DrawText( |
150 | location.name, | 180 | painting.display_name, |
151 | {FromDIP(10 + 32 + 10), | 181 | {FromDIP(10 + 32 + 10), |
152 | cur_height + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2}); | 182 | indicator.y + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2}); |
153 | |||
154 | cur_height += FromDIP(10 + 32); | ||
155 | } | ||
156 | 183 | ||
157 | if (AP_IsPaintingShuffle() && !tracker_panel->IsPanelsMode()) { | 184 | break; |
158 | for (int painting_id : map_area.paintings) { | ||
159 | if (IsPaintingPostgame(painting_id)) { | ||
160 | continue; | ||
161 | } | 185 | } |
162 | |||
163 | const PaintingExit& painting = GD_GetPaintingExit(painting_id); | ||
164 | |||
165 | bool reachable = IsPaintingReachable(painting_id); | ||
166 | const wxColour* text_color = reachable ? wxWHITE : wxRED; | ||
167 | mem_dc.SetTextForeground(*text_color); | ||
168 | |||
169 | bool checked = reachable && AP_IsPaintingChecked(painting.internal_id); | ||
170 | const wxBitmap* eye_ptr = checked ? checked_owl_ : unchecked_owl_; | ||
171 | mem_dc.DrawBitmap(*eye_ptr, {FromDIP(10), cur_height}); | ||
172 | |||
173 | wxSize item_extent = mem_dc.GetTextExtent(painting.display_name); | ||
174 | mem_dc.DrawText(painting.display_name, | ||
175 | {FromDIP(10 + 32 + 10), | ||
176 | cur_height + (FromDIP(32) - mem_dc.GetFontMetrics().height) / 2}); | ||
177 | |||
178 | cur_height += FromDIP(10 + 32); | ||
179 | } | 186 | } |
180 | } | 187 | } |
181 | } | 188 | } |
@@ -190,7 +197,7 @@ void AreaPopup::OnPaint(wxPaintEvent& event) { | |||
190 | 197 | ||
191 | void AreaPopup::OnDPIChanged(wxDPIChangedEvent& event) { | 198 | void AreaPopup::OnDPIChanged(wxDPIChangedEvent& event) { |
192 | LoadIcons(); | 199 | LoadIcons(); |
193 | UpdateIndicators(); | 200 | ResetIndicators(); |
194 | 201 | ||
195 | event.Skip(); | 202 | event.Skip(); |
196 | } | 203 | } |