1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include "area_popup.h"
#include <wx/dcbuffer.h>
#include "ap_state.h"
#include "game_data.h"
#include "global.h"
#include "tracker_config.h"
#include "tracker_state.h"
AreaPopup::AreaPopup(wxWindow* parent, int area_id)
: wxScrolledCanvas(parent, wxID_ANY), area_id_(area_id) {
SetBackgroundStyle(wxBG_STYLE_PAINT);
unchecked_eye_ =
wxBitmap(wxImage(GetAbsolutePath("assets/unchecked.png").c_str(),
wxBITMAP_TYPE_PNG)
.Scale(32, 32));
checked_eye_ = wxBitmap(
wxImage(GetAbsolutePath("assets/checked.png").c_str(), wxBITMAP_TYPE_PNG)
.Scale(32, 32));
SetScrollRate(5, 5);
SetBackgroundColour(*wxBLACK);
Hide();
Bind(wxEVT_PAINT, &AreaPopup::OnPaint, this);
UpdateIndicators();
}
void AreaPopup::UpdateIndicators() {
const MapArea& map_area = GD_GetMapArea(area_id_);
// Start calculating extents.
wxMemoryDC mem_dc;
mem_dc.SetFont(GetFont().Bold());
wxSize header_extent = mem_dc.GetTextExtent(map_area.name);
int acc_height = header_extent.GetHeight() + 20;
int col_width = 0;
mem_dc.SetFont(GetFont());
std::vector<int> real_locations;
for (int section_id = 0; section_id < map_area.locations.size();
section_id++) {
const Location& location = map_area.locations.at(section_id);
if (!AP_IsLocationVisible(location.classification) &&
!(location.hunt && GetTrackerConfig().show_hunt_panels)) {
continue;
}
real_locations.push_back(section_id);
wxSize item_extent = mem_dc.GetTextExtent(location.name);
int item_height = std::max(32, item_extent.GetHeight()) + 10;
acc_height += item_height;
if (item_extent.GetWidth() > col_width) {
col_width = item_extent.GetWidth();
}
}
int item_width = col_width + 10 + 32;
int full_width = std::max(header_extent.GetWidth(), item_width) + 20;
Fit();
SetVirtualSize(full_width, acc_height);
rendered_ = wxBitmap(full_width, acc_height);
mem_dc.SelectObject(rendered_);
mem_dc.SetPen(*wxTRANSPARENT_PEN);
mem_dc.SetBrush(*wxBLACK_BRUSH);
mem_dc.DrawRectangle({0, 0}, {full_width, acc_height});
mem_dc.SetFont(GetFont().Bold());
mem_dc.SetTextForeground(*wxWHITE);
mem_dc.DrawText(map_area.name,
{(full_width - header_extent.GetWidth()) / 2, 10});
int cur_height = header_extent.GetHeight() + 20;
mem_dc.SetFont(GetFont());
for (int section_id : real_locations) {
const Location& location = map_area.locations.at(section_id);
bool checked =
AP_HasCheckedGameLocation(location.ap_location_id) ||
(location.hunt && AP_HasCheckedHuntPanel(location.ap_location_id)) ||
(IsLocationWinCondition(location) && AP_HasReachedGoal());
wxBitmap* eye_ptr = checked ? &checked_eye_ : &unchecked_eye_;
mem_dc.DrawBitmap(*eye_ptr, {10, cur_height});
bool reachable = IsLocationReachable(location.ap_location_id);
const wxColour* text_color = reachable ? wxWHITE : wxRED;
mem_dc.SetTextForeground(*text_color);
wxSize item_extent = mem_dc.GetTextExtent(location.name);
mem_dc.DrawText(
location.name,
{10 + 32 + 10, cur_height + (32 - mem_dc.GetFontMetrics().height) / 2});
cur_height += 10 + 32;
}
}
void AreaPopup::OnPaint(wxPaintEvent& event) {
wxBufferedPaintDC dc(this);
PrepareDC(dc);
dc.DrawBitmap(rendered_, 0, 0);
event.Skip();
}
|