about summary refs log tree commit diff stats
path: root/src/subway_map.cpp
blob: c58b2d1501934523e270ea7b669fc5b65440bca5 (plain) (blame)
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));
}