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
|
#include "subway_map.h"
#include "game_data.h"
#include "global.h"
#include "tracker_state.h"
constexpr int AREA_ACTUAL_SIZE = 21;
SubwayMap::SubwayMap(wxWindow *parent) : wxPanel(parent, wxID_ANY) {
map_image_ =
wxImage(GetAbsolutePath("assets/subway.png").c_str(), wxBITMAP_TYPE_PNG);
if (!map_image_.IsOk()) {
return;
}
Redraw();
Resize();
Bind(wxEVT_PAINT, &SubwayMap::OnPaint, this);
Bind(wxEVT_MOTION, &SubwayMap::OnMouseMove, this);
}
void SubwayMap::UpdateIndicators() {
Redraw();
Resize();
}
void SubwayMap::OnPaint(wxPaintEvent &event) {
if (GetSize() != resized_.GetSize()) {
Resize();
}
wxPaintDC dc(this);
dc.DrawBitmap(resized_, 0, 0);
event.Skip();
}
void SubwayMap::OnMouseMove(wxMouseEvent &event) {
event.Skip();
}
void SubwayMap::Redraw() {
rendered_ = wxBitmap(map_image_);
wxMemoryDC dc;
dc.SelectObject(rendered_);
for (const SubwayItem &subway_item : GD_GetSubwayItems()) {
const wxBrush *brush_color = wxGREY_BRUSH;
if (subway_item.door) {
if (IsDoorOpen(*subway_item.door)) {
brush_color = wxGREEN_BRUSH;
} else {
brush_color = wxRED_BRUSH;
}
}
dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, 1));
dc.SetBrush(*brush_color);
dc.DrawRectangle({subway_item.x, subway_item.y},
{AREA_ACTUAL_SIZE, AREA_ACTUAL_SIZE});
}
}
void SubwayMap::Resize() {
wxSize panel_size = GetSize();
wxSize image_size = rendered_.GetSize();
render_x_ = 0;
render_y_ = 0;
render_width_ = panel_size.GetWidth();
render_height_ = panel_size.GetHeight();
if (image_size.GetWidth() * panel_size.GetHeight() >
panel_size.GetWidth() * image_size.GetHeight()) {
render_height_ = (panel_size.GetWidth() * image_size.GetHeight()) /
image_size.GetWidth();
render_y_ = (panel_size.GetHeight() - render_height_) / 2;
} else {
render_width_ = (image_size.GetWidth() * panel_size.GetHeight()) /
image_size.GetHeight();
render_x_ = (panel_size.GetWidth() - render_width_) / 2;
}
resized_ = wxBitmap(rendered_.ConvertToImage()
.Scale(render_width_, render_height_, wxIMAGE_QUALITY_BILINEAR)
.Size(panel_size, {render_x_, render_y_}, 0, 0, 0));
}
|