about summary refs log tree commit diff stats
path: root/src/report_popup.cpp
blob: d772b32b445a8624296313e07a4ee321df24c7e3 (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
90
91
92
93
94
95
96
97
98
#include "report_popup.h"

#include <wx/dcbuffer.h>

#include <map>
#include <string>

#include "global.h"
#include "tracker_state.h"

ReportPopup::ReportPopup(wxWindow* parent)
    : wxScrolledCanvas(parent, wxID_ANY) {
  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, &ReportPopup::OnPaint, this);
}

void ReportPopup::SetDoorId(int door_id) {
  door_id_ = door_id;

  UpdateIndicators();
}

void ReportPopup::Reset() {
  door_id_ = -1;
}

void ReportPopup::UpdateIndicators() {
  wxMemoryDC mem_dc;

  const std::map<std::string, bool>& report = GetDoorRequirements(door_id_);

  int acc_height = 10;
  int col_width = 0;

  for (const auto& [text, obtained] : report) {
    wxSize item_extent = mem_dc.GetTextExtent(text);
    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 = 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());

  int cur_height = 10;

  for (const auto& [text, obtained] : report) {
    wxBitmap* eye_ptr = obtained ? &checked_eye_ : &unchecked_eye_;

    mem_dc.DrawBitmap(*eye_ptr, wxPoint{10, cur_height});

    mem_dc.SetTextForeground(obtained ? *wxWHITE : *wxRED);
    wxSize item_extent = mem_dc.GetTextExtent(text);
    mem_dc.DrawText(
        text, wxPoint{10 + 32 + 10,
                      cur_height + (32 - mem_dc.GetFontMetrics().height) / 2});

    cur_height += 10 + 32;
  }
}

void ReportPopup::OnPaint(wxPaintEvent& event) {
  if (door_id_ != -1) {
    wxBufferedPaintDC dc(this);
    PrepareDC(dc);
    dc.DrawBitmap(rendered_, 0, 0);
  }

  event.Skip();
}