about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/settings_dialog.cpp29
-rw-r--r--src/settings_dialog.h24
-rw-r--r--src/tracker_config.cpp2
-rw-r--r--src/tracker_config.h1
-rw-r--r--src/tracker_frame.cpp22
-rw-r--r--src/tracker_frame.h1
-rw-r--r--src/tracker_panel.cpp58
8 files changed, 119 insertions, 19 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index ac5467d..7750364 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -40,6 +40,7 @@ add_executable(lingo_ap_tracker
40 "src/tracker_config.cpp" 40 "src/tracker_config.cpp"
41 "src/logger.cpp" 41 "src/logger.cpp"
42 "src/achievements_pane.cpp" 42 "src/achievements_pane.cpp"
43 "src/settings_dialog.cpp"
43) 44)
44set_property(TARGET lingo_ap_tracker PROPERTY CXX_STANDARD 20) 45set_property(TARGET lingo_ap_tracker PROPERTY CXX_STANDARD 20)
45set_property(TARGET lingo_ap_tracker PROPERTY CXX_STANDARD_REQUIRED ON) 46set_property(TARGET lingo_ap_tracker PROPERTY CXX_STANDARD_REQUIRED ON)
diff --git a/src/settings_dialog.cpp b/src/settings_dialog.cpp new file mode 100644 index 0000000..58e5988 --- /dev/null +++ b/src/settings_dialog.cpp
@@ -0,0 +1,29 @@
1#include "settings_dialog.h"
2
3#include "tracker_config.h"
4
5SettingsDialog::SettingsDialog() : wxDialog(nullptr, wxID_ANY, "Settings") {
6 should_check_for_updates_box_ = new wxCheckBox(
7 this, wxID_ANY, "Check for updates when the tracker opens");
8 hybrid_areas_box_ = new wxCheckBox(
9 this, wxID_ANY,
10 "Use two colors to show that an area has partial availability");
11
12 should_check_for_updates_box_->SetValue(
13 GetTrackerConfig().should_check_for_updates);
14 hybrid_areas_box_->SetValue(GetTrackerConfig().hybrid_areas);
15
16 wxBoxSizer* form_sizer = new wxBoxSizer(wxVERTICAL);
17
18 form_sizer->Add(should_check_for_updates_box_, wxSizerFlags().HorzBorder());
19 form_sizer->AddSpacer(2);
20
21 form_sizer->Add(hybrid_areas_box_, wxSizerFlags().HorzBorder());
22 form_sizer->AddSpacer(2);
23
24 form_sizer->Add(CreateButtonSizer(wxOK | wxCANCEL), wxSizerFlags().Center());
25
26 SetSizerAndFit(form_sizer);
27
28 Center();
29}
diff --git a/src/settings_dialog.h b/src/settings_dialog.h new file mode 100644 index 0000000..150a7a8 --- /dev/null +++ b/src/settings_dialog.h
@@ -0,0 +1,24 @@
1#ifndef SETTINGS_DIALOG_H_D8635719
2#define SETTINGS_DIALOG_H_D8635719
3
4#include <wx/wxprec.h>
5
6#ifndef WX_PRECOMP
7#include <wx/wx.h>
8#endif
9
10class SettingsDialog : public wxDialog {
11 public:
12 SettingsDialog();
13
14 bool GetShouldCheckForUpdates() const {
15 return should_check_for_updates_box_->GetValue();
16 }
17 bool GetHybridAreas() const { return hybrid_areas_box_->GetValue(); }
18
19 private:
20 wxCheckBox* should_check_for_updates_box_;
21 wxCheckBox* hybrid_areas_box_;
22};
23
24#endif /* end of include guard: SETTINGS_DIALOG_H_D8635719 */
diff --git a/src/tracker_config.cpp b/src/tracker_config.cpp index c09d241..9318091 100644 --- a/src/tracker_config.cpp +++ b/src/tracker_config.cpp
@@ -14,6 +14,7 @@ void TrackerConfig::Load() {
14 ap_password = file["ap_password"].as<std::string>(); 14 ap_password = file["ap_password"].as<std::string>();
15 asked_to_check_for_updates = file["asked_to_check_for_updates"].as<bool>(); 15 asked_to_check_for_updates = file["asked_to_check_for_updates"].as<bool>();
16 should_check_for_updates = file["should_check_for_updates"].as<bool>(); 16 should_check_for_updates = file["should_check_for_updates"].as<bool>();
17 hybrid_areas = file["hybrid_areas"].as<bool>();
17 } catch (const std::exception&) { 18 } catch (const std::exception&) {
18 // It's fine if the file can't be loaded. 19 // It's fine if the file can't be loaded.
19 } 20 }
@@ -26,6 +27,7 @@ void TrackerConfig::Save() {
26 output["ap_password"] = ap_password; 27 output["ap_password"] = ap_password;
27 output["asked_to_check_for_updates"] = asked_to_check_for_updates; 28 output["asked_to_check_for_updates"] = asked_to_check_for_updates;
28 output["should_check_for_updates"] = should_check_for_updates; 29 output["should_check_for_updates"] = should_check_for_updates;
30 output["hybrid_areas"] = hybrid_areas;
29 31
30 std::ofstream filewriter(CONFIG_FILE_NAME); 32 std::ofstream filewriter(CONFIG_FILE_NAME);
31 filewriter << output; 33 filewriter << output;
diff --git a/src/tracker_config.h b/src/tracker_config.h index b9460d2..6c94e1b 100644 --- a/src/tracker_config.h +++ b/src/tracker_config.h
@@ -14,6 +14,7 @@ class TrackerConfig {
14 std::string ap_password; 14 std::string ap_password;
15 bool asked_to_check_for_updates = false; 15 bool asked_to_check_for_updates = false;
16 bool should_check_for_updates = false; 16 bool should_check_for_updates = false;
17 bool hybrid_areas = false;
17}; 18};
18 19
19TrackerConfig& GetTrackerConfig(); 20TrackerConfig& GetTrackerConfig();
diff --git a/src/tracker_frame.cpp b/src/tracker_frame.cpp index a74e81e..5341fa6 100644 --- a/src/tracker_frame.cpp +++ b/src/tracker_frame.cpp
@@ -9,11 +9,16 @@
9#include "achievements_pane.h" 9#include "achievements_pane.h"
10#include "ap_state.h" 10#include "ap_state.h"
11#include "connection_dialog.h" 11#include "connection_dialog.h"
12#include "settings_dialog.h"
12#include "tracker_config.h" 13#include "tracker_config.h"
13#include "tracker_panel.h" 14#include "tracker_panel.h"
14#include "version.h" 15#include "version.h"
15 16
16enum TrackerFrameIds { ID_CONNECT = 1, ID_CHECK_FOR_UPDATES = 2 }; 17enum TrackerFrameIds {
18 ID_CONNECT = 1,
19 ID_CHECK_FOR_UPDATES = 2,
20 ID_SETTINGS = 3
21};
17 22
18wxDEFINE_EVENT(STATE_CHANGED, wxCommandEvent); 23wxDEFINE_EVENT(STATE_CHANGED, wxCommandEvent);
19wxDEFINE_EVENT(STATUS_CHANGED, wxCommandEvent); 24wxDEFINE_EVENT(STATUS_CHANGED, wxCommandEvent);
@@ -29,6 +34,7 @@ TrackerFrame::TrackerFrame()
29 34
30 wxMenu *menuFile = new wxMenu(); 35 wxMenu *menuFile = new wxMenu();
31 menuFile->Append(ID_CONNECT, "&Connect"); 36 menuFile->Append(ID_CONNECT, "&Connect");
37 menuFile->Append(ID_SETTINGS, "&Settings");
32 menuFile->Append(wxID_EXIT); 38 menuFile->Append(wxID_EXIT);
33 39
34 wxMenu *menuHelp = new wxMenu(); 40 wxMenu *menuHelp = new wxMenu();
@@ -47,6 +53,7 @@ TrackerFrame::TrackerFrame()
47 Bind(wxEVT_MENU, &TrackerFrame::OnAbout, this, wxID_ABOUT); 53 Bind(wxEVT_MENU, &TrackerFrame::OnAbout, this, wxID_ABOUT);
48 Bind(wxEVT_MENU, &TrackerFrame::OnExit, this, wxID_EXIT); 54 Bind(wxEVT_MENU, &TrackerFrame::OnExit, this, wxID_EXIT);
49 Bind(wxEVT_MENU, &TrackerFrame::OnConnect, this, ID_CONNECT); 55 Bind(wxEVT_MENU, &TrackerFrame::OnConnect, this, ID_CONNECT);
56 Bind(wxEVT_MENU, &TrackerFrame::OnSettings, this, ID_SETTINGS);
50 Bind(wxEVT_MENU, &TrackerFrame::OnCheckForUpdates, this, 57 Bind(wxEVT_MENU, &TrackerFrame::OnCheckForUpdates, this,
51 ID_CHECK_FOR_UPDATES); 58 ID_CHECK_FOR_UPDATES);
52 Bind(STATE_CHANGED, &TrackerFrame::OnStateChanged, this); 59 Bind(STATE_CHANGED, &TrackerFrame::OnStateChanged, this);
@@ -119,6 +126,19 @@ void TrackerFrame::OnConnect(wxCommandEvent &event) {
119 } 126 }
120} 127}
121 128
129void TrackerFrame::OnSettings(wxCommandEvent &event) {
130 SettingsDialog dlg;
131
132 if (dlg.ShowModal() == wxID_OK) {
133 GetTrackerConfig().should_check_for_updates =
134 dlg.GetShouldCheckForUpdates();
135 GetTrackerConfig().hybrid_areas = dlg.GetHybridAreas();
136 GetTrackerConfig().Save();
137
138 UpdateIndicators();
139 }
140}
141
122void TrackerFrame::OnCheckForUpdates(wxCommandEvent &event) { 142void TrackerFrame::OnCheckForUpdates(wxCommandEvent &event) {
123 CheckForUpdates(/*manual=*/true); 143 CheckForUpdates(/*manual=*/true);
124} 144}
diff --git a/src/tracker_frame.h b/src/tracker_frame.h index 85cc7c3..e5bf97e 100644 --- a/src/tracker_frame.h +++ b/src/tracker_frame.h
@@ -25,6 +25,7 @@ class TrackerFrame : public wxFrame {
25 void OnExit(wxCommandEvent &event); 25 void OnExit(wxCommandEvent &event);
26 void OnAbout(wxCommandEvent &event); 26 void OnAbout(wxCommandEvent &event);
27 void OnConnect(wxCommandEvent &event); 27 void OnConnect(wxCommandEvent &event);
28 void OnSettings(wxCommandEvent &event);
28 void OnCheckForUpdates(wxCommandEvent &event); 29 void OnCheckForUpdates(wxCommandEvent &event);
29 30
30 void OnStateChanged(wxCommandEvent &event); 31 void OnStateChanged(wxCommandEvent &event);
diff --git a/src/tracker_panel.cpp b/src/tracker_panel.cpp index 5580068..466440f 100644 --- a/src/tracker_panel.cpp +++ b/src/tracker_panel.cpp
@@ -3,6 +3,7 @@
3#include "ap_state.h" 3#include "ap_state.h"
4#include "area_popup.h" 4#include "area_popup.h"
5#include "game_data.h" 5#include "game_data.h"
6#include "tracker_config.h"
6#include "tracker_state.h" 7#include "tracker_state.h"
7 8
8constexpr int AREA_ACTUAL_SIZE = 64; 9constexpr int AREA_ACTUAL_SIZE = 64;
@@ -91,9 +92,17 @@ void TrackerPanel::Redraw() {
91 wxMemoryDC dc; 92 wxMemoryDC dc;
92 dc.SelectObject(rendered_); 93 dc.SelectObject(rendered_);
93 94
94 for (AreaIndicator &area : areas_) { 95 int real_area_size =
95 const wxBrush *brush_color = wxGREY_BRUSH; 96 final_width * AREA_EFFECTIVE_SIZE / image_size.GetWidth();
97 int actual_border_size =
98 real_area_size * AREA_BORDER_SIZE / AREA_EFFECTIVE_SIZE;
99 const wxPoint upper_left_triangle[] = {
100 {0, 0}, {0, real_area_size}, {real_area_size, 0}};
101 const wxPoint lower_right_triangle[] = {{0, real_area_size - 1},
102 {real_area_size - 1, 0},
103 {real_area_size, real_area_size}};
96 104
105 for (AreaIndicator &area : areas_) {
97 const MapArea &map_area = GD_GetMapArea(area.area_id); 106 const MapArea &map_area = GD_GetMapArea(area.area_id);
98 if (!AP_IsLocationVisible(map_area.classification)) { 107 if (!AP_IsLocationVisible(map_area.classification)) {
99 area.active = false; 108 area.active = false;
@@ -115,27 +124,40 @@ void TrackerPanel::Redraw() {
115 } 124 }
116 } 125 }
117 126
118 if (has_reachable_unchecked && has_unreachable_unchecked) {
119 brush_color = wxYELLOW_BRUSH;
120 } else if (has_reachable_unchecked) {
121 brush_color = wxGREEN_BRUSH;
122 } else if (has_unreachable_unchecked) {
123 brush_color = wxRED_BRUSH;
124 }
125
126 int real_area_size =
127 final_width * AREA_EFFECTIVE_SIZE / image_size.GetWidth();
128 int actual_border_size =
129 real_area_size * AREA_BORDER_SIZE / AREA_EFFECTIVE_SIZE;
130 int real_area_x = final_x + (map_area.map_x - (AREA_EFFECTIVE_SIZE / 2)) * 127 int real_area_x = final_x + (map_area.map_x - (AREA_EFFECTIVE_SIZE / 2)) *
131 final_width / image_size.GetWidth(); 128 final_width / image_size.GetWidth();
132 int real_area_y = final_y + (map_area.map_y - (AREA_EFFECTIVE_SIZE / 2)) * 129 int real_area_y = final_y + (map_area.map_y - (AREA_EFFECTIVE_SIZE / 2)) *
133 final_width / image_size.GetWidth(); 130 final_width / image_size.GetWidth();
134 131
135 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size)); 132 if (has_reachable_unchecked && has_unreachable_unchecked &&
136 dc.SetBrush(*brush_color); 133 GetTrackerConfig().hybrid_areas) {
137 dc.DrawRectangle({real_area_x, real_area_y}, 134 dc.SetPen(*wxTRANSPARENT_PEN);
138 {real_area_size, real_area_size}); 135 dc.SetBrush(*wxGREEN_BRUSH);
136 dc.DrawPolygon(3, upper_left_triangle, real_area_x, real_area_y);
137
138 dc.SetBrush(*wxRED_BRUSH);
139 dc.DrawPolygon(3, lower_right_triangle, real_area_x, real_area_y);
140
141 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size));
142 dc.SetBrush(*wxTRANSPARENT_BRUSH);
143 dc.DrawRectangle({real_area_x, real_area_y},
144 {real_area_size, real_area_size});
145
146 } else {
147 const wxBrush *brush_color = wxGREY_BRUSH;
148 if (has_reachable_unchecked && has_unreachable_unchecked) {
149 brush_color = wxYELLOW_BRUSH;
150 } else if (has_reachable_unchecked) {
151 brush_color = wxGREEN_BRUSH;
152 } else if (has_unreachable_unchecked) {
153 brush_color = wxRED_BRUSH;
154 }
155
156 dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, actual_border_size));
157 dc.SetBrush(*brush_color);
158 dc.DrawRectangle({real_area_x, real_area_y},
159 {real_area_size, real_area_size});
160 }
139 161
140 area.real_x1 = real_area_x; 162 area.real_x1 = real_area_x;
141 area.real_x2 = real_area_x + real_area_size; 163 area.real_x2 = real_area_x + real_area_size;