about summary refs log tree commit diff stats
path: root/src/area_popup.cpp
blob: 3b5d8d4e5dc1c50fe218b6a700014a7d4e95aead (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
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Gene
#include "area_popup.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) {
  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
>(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) { wxPaintDC dc(this); PrepareDC(dc); dc.DrawBitmap(rendered_, 0, 0); event.Skip(); }