about summary refs log tree commit diff stats
path: root/src/main.cpp
blob: 1d7cc9e9a47a833d4544ac5ca768408344825930 (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
#include <wx/wxprec.h>

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include "global.h"
#include "tracker_config.h"
#include "tracker_frame.h"

class TrackerApp : public wxApp {
 public:
  virtual bool OnInit() {
    GetTrackerConfig().Load();

    TrackerFrame *frame = new TrackerFrame();
    frame->Show(true);
    return true;
  }

  bool OnExceptionInMainLoop() override {
    try {
      throw;
    } catch (const std::exception& ex) {
      wxLogError(ex.what());
    }

    return false;
  }
};

wxIMPLEMENT_APP(TrackerApp);
-09 11:14:10 -0400 committer Star Rauchenberger <fefferburbia@gmail.com> 2023-05-09 11:14:10 -0400 Support reduce_checks' href='/lingo-ap-tracker/commit/src/area_popup.cpp?h=v2.0.2&id=53a2ec277f20a7c260e80af527659e769f6d2ac6'>53a2ec2 ^
53a2ec2 ^
4adfe42 ^

9bf6a50 ^
53a2ec2 ^

0a3c0c6 ^













fd2f756 ^
0a3c0c6 ^



















4adfe42 ^

cf3fc6c ^

0a3c0c6 ^




8e89e19 ^
70f1c62 ^
0a3c0c6 ^
09d67fb ^
0a3c0c6 ^





09d67fb ^
0a3c0c6 ^





53a2ec2 ^
0a3c0c6 ^
09d67fb ^
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

                       
                     
                      
                   
                           
                          

                                                   







                                                                               
 
                      
 
                                
         



                                               
 

                                    
                                                    












                                                             

                                                                  
                                                                 
 

                                                                  
               

     













                                                                       
        



















                                                                     

                                                             

                                                                             




                                                                  
                                                                  
                                                             
                                          
 





                                                                                
   





                                              
 
               
 
#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& 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) {
  wxPaintDC dc(this);
  PrepareDC(dc);
  dc.DrawBitmap(rendered_, 0, 0);

  event.Skip();
}