about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/ap_state.cpp93
-rw-r--r--src/ap_state.h6
-rw-r--r--src/ipc_state.cpp4
-rw-r--r--src/paintings_pane.cpp12
-rw-r--r--src/paintings_pane.h3
-rw-r--r--src/subway_map.cpp2
-rw-r--r--src/tracker_frame.cpp73
-rw-r--r--src/tracker_frame.h37
8 files changed, 133 insertions, 97 deletions
diff --git a/src/ap_state.cpp b/src/ap_state.cpp index 29e649f..d01290b 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp
@@ -243,7 +243,7 @@ struct APState {
243 checked_paintings.count(painting_mapping.at(painting_id))); 243 checked_paintings.count(painting_mapping.at(painting_id)));
244 } 244 }
245 245
246 std::string GetItemName(int id) { return apclient->get_item_name(id); } 246 std::string GetItemName(int id) { return apclient->get_item_name(id, "Lingo"); }
247 247
248 void RevealPaintings() { 248 void RevealPaintings() {
249 std::lock_guard state_guard(state_mutex); 249 std::lock_guard state_guard(state_mutex);
@@ -369,7 +369,7 @@ struct APState {
369 } 369 }
370 } 370 }
371 371
372 RefreshTracker(false); 372 RefreshTracker(StateUpdate{.cleared_locations = true});
373 } 373 }
374 374
375 void OnSlotDisconnected() { 375 void OnSlotDisconnected() {
@@ -391,51 +391,53 @@ struct APState {
391 } 391 }
392 392
393 void OnItemsReceived(const std::list<APClient::NetworkItem>& items) { 393 void OnItemsReceived(const std::list<APClient::NetworkItem>& items) {
394 std::vector<ItemState> item_states;
395
394 { 396 {
395 std::lock_guard state_guard(state_mutex); 397 std::lock_guard state_guard(state_mutex);
396 398
399 std::map<int64_t, int> index_by_item;
400
397 for (const APClient::NetworkItem& item : items) { 401 for (const APClient::NetworkItem& item : items) {
398 inventory[item.item]++; 402 inventory[item.item]++;
399 TrackerLog(fmt::format("Item: {}", item.item)); 403 TrackerLog(fmt::format("Item: {}", item.item));
404
405 index_by_item[item.item] = item.index;
406 }
407
408 for (const auto& [item_id, item_index] : index_by_item) {
409 item_states.push_back(ItemState{.name = GetItemName(item_id),
410 .amount = inventory[item_id],
411 .index = item_index});
400 } 412 }
401 } 413 }
402 414
403 RefreshTracker(false); 415 RefreshTracker(StateUpdate{.items = item_states});
404 } 416 }
405 417
406 void OnRetrieved(const std::map<std::string, nlohmann::json>& data) { 418 void OnRetrieved(const std::map<std::string, nlohmann::json>& data) {
419 StateUpdate state_update;
420
407 { 421 {
408 std::lock_guard state_guard(state_mutex); 422 std::lock_guard state_guard(state_mutex);
409 423
410 for (const auto& [key, value] : data) { 424 for (const auto& [key, value] : data) {
411 HandleDataStorage(key, value); 425 HandleDataStorage(key, value, state_update);
412 } 426 }
413 } 427 }
414 428
415 RefreshTracker(false); 429 RefreshTracker(state_update);
416 } 430 }
417 431
418 void OnSetReply(const std::string& key, const nlohmann::json& value) { 432 void OnSetReply(const std::string& key, const nlohmann::json& value) {
419 bool should_refresh = false; 433 StateUpdate state_update;
420 bool should_redraw_position = false; 434
421 { 435 {
422 std::lock_guard state_guard(state_mutex); 436 std::lock_guard state_guard(state_mutex);
423 HandleDataStorage(key, value); 437 HandleDataStorage(key, value, state_update);
424
425 if (key.ends_with("PlayerPos"))
426 {
427 should_redraw_position = true;
428 } else {
429 should_refresh = true;
430 }
431 } 438 }
432 439
433 if (should_refresh) 440 RefreshTracker(state_update);
434 {
435 RefreshTracker(false);
436 } else if (should_redraw_position) {
437 tracker_frame->RedrawPosition();
438 }
439 } 441 }
440 442
441 void OnSlotConnected(std::string player, std::string server, 443 void OnSlotConnected(std::string player, std::string server,
@@ -531,7 +533,7 @@ struct APState {
531 } 533 }
532 534
533 ResetReachabilityRequirements(); 535 ResetReachabilityRequirements();
534 RefreshTracker(true); 536 RefreshTracker(std::nullopt);
535 } 537 }
536 538
537 void OnSlotRefused(const std::list<std::string>& errors) { 539 void OnSlotRefused(const std::list<std::string>& errors) {
@@ -574,11 +576,15 @@ struct APState {
574 } 576 }
575 577
576 // Assumes state mutex is locked. 578 // Assumes state mutex is locked.
577 void HandleDataStorage(const std::string& key, const nlohmann::json& value) { 579 void HandleDataStorage(const std::string& key, const nlohmann::json& value, StateUpdate& state_update) {
578 if (value.is_boolean()) { 580 if (value.is_boolean()) {
579 data_storage[key] = value.get<bool>(); 581 data_storage[key] = value.get<bool>();
580 TrackerLog(fmt::format("Data storage {} retrieved as {}", key, 582 TrackerLog(fmt::format("Data storage {} retrieved as {}", key,
581 (value.get<bool>() ? "true" : "false"))); 583 (value.get<bool>() ? "true" : "false")));
584
585 if (key.find("Achievement|") != std::string::npos) {
586 state_update.achievements = true;
587 }
582 } else if (value.is_number()) { 588 } else if (value.is_number()) {
583 data_storage[key] = value.get<int>(); 589 data_storage[key] = value.get<int>();
584 TrackerLog(fmt::format("Data storage {} retrieved as {}", key, 590 TrackerLog(fmt::format("Data storage {} retrieved as {}", key,
@@ -587,6 +593,7 @@ struct APState {
587 if (key.ends_with("PlayerPos")) { 593 if (key.ends_with("PlayerPos")) {
588 auto map_value = value.get<std::map<std::string, int>>(); 594 auto map_value = value.get<std::map<std::string, int>>();
589 player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]); 595 player_pos = std::tuple<int, int>(map_value["x"], map_value["z"]);
596 state_update.player_position = true;
590 } else { 597 } else {
591 data_storage[key] = value.get<std::map<std::string, int>>(); 598 data_storage[key] = value.get<std::map<std::string, int>>();
592 } 599 }
@@ -595,6 +602,7 @@ struct APState {
595 } else if (value.is_null()) { 602 } else if (value.is_null()) {
596 if (key.ends_with("PlayerPos")) { 603 if (key.ends_with("PlayerPos")) {
597 player_pos = std::nullopt; 604 player_pos = std::nullopt;
605 state_update.player_position = true;
598 } else { 606 } else {
599 data_storage.erase(key); 607 data_storage.erase(key);
600 } 608 }
@@ -606,6 +614,8 @@ struct APState {
606 if (key.ends_with("Paintings")) { 614 if (key.ends_with("Paintings")) {
607 data_storage[key] = 615 data_storage[key] =
608 std::set<std::string>(list_value.begin(), list_value.end()); 616 std::set<std::string>(list_value.begin(), list_value.end());
617 state_update.paintings =
618 std::vector<std::string>(list_value.begin(), list_value.end());
609 } else { 619 } else {
610 data_storage[key] = list_value; 620 data_storage[key] = list_value;
611 } 621 }
@@ -616,29 +626,34 @@ struct APState {
616 } 626 }
617 627
618 // State mutex should NOT be locked. 628 // State mutex should NOT be locked.
619 void RefreshTracker(bool reset) { 629 // nullopt state_update indicates a reset.
630 void RefreshTracker(std::optional<StateUpdate> state_update) {
620 TrackerLog("Refreshing display..."); 631 TrackerLog("Refreshing display...");
621 632
622 std::string prev_msg; 633 if (!state_update || !state_update->items.empty() ||
623 { 634 !state_update->paintings.empty()) {
624 std::lock_guard state_guard(state_mutex); 635 std::string prev_msg;
636 {
637 std::lock_guard state_guard(state_mutex);
625 638
626 prev_msg = status_message; 639 prev_msg = status_message;
627 SetStatusMessage(fmt::format("{} Recalculating...", status_message)); 640 SetStatusMessage(fmt::format("{} Recalculating...", status_message));
628 } 641 }
629 642
630 RecalculateReachability(); 643 RecalculateReachability();
631 644
632 if (reset) { 645 {
633 tracker_frame->ResetIndicators(); 646 std::lock_guard state_guard(state_mutex);
634 } else {
635 tracker_frame->UpdateIndicators();
636 }
637 647
638 { 648 SetStatusMessage(prev_msg);
639 std::lock_guard state_guard(state_mutex); 649 }
650 }
651
640 652
641 SetStatusMessage(prev_msg); 653 if (!state_update) {
654 tracker_frame->ResetIndicators();
655 } else {
656 tracker_frame->UpdateIndicators(*state_update);
642 } 657 }
643 } 658 }
644 659
diff --git a/src/ap_state.h b/src/ap_state.h index 4de7689..8b8db03 100644 --- a/src/ap_state.h +++ b/src/ap_state.h
@@ -39,6 +39,12 @@ struct SunwarpMapping {
39 int exit_index; 39 int exit_index;
40}; 40};
41 41
42struct ItemState {
43 std::string name;
44 int amount = 0;
45 int index = 0;
46};
47
42void AP_SetTrackerFrame(TrackerFrame* tracker_frame); 48void AP_SetTrackerFrame(TrackerFrame* tracker_frame);
43 49
44void AP_Connect(std::string server, std::string player, std::string password); 50void AP_Connect(std::string server, std::string player, std::string password);
diff --git a/src/ipc_state.cpp b/src/ipc_state.cpp index 1f8d286..a99fa89 100644 --- a/src/ipc_state.cpp +++ b/src/ipc_state.cpp
@@ -313,7 +313,7 @@ struct IPCState {
313 player_position = 313 player_position =
314 std::make_tuple<int, int>(msg["position"]["x"], msg["position"]["z"]); 314 std::make_tuple<int, int>(msg["position"]["x"], msg["position"]["z"]);
315 315
316 tracker_frame->RedrawPosition(); 316 tracker_frame->UpdateIndicators(StateUpdate{.player_position = true});
317 } else if (msg["cmd"] == "SolvePanels") { 317 } else if (msg["cmd"] == "SolvePanels") {
318 std::lock_guard state_guard(state_mutex); 318 std::lock_guard state_guard(state_mutex);
319 319
@@ -321,7 +321,7 @@ struct IPCState {
321 solved_panels.insert(std::move(panel)); 321 solved_panels.insert(std::move(panel));
322 } 322 }
323 323
324 tracker_frame->UpdateIndicators(kUPDATE_ONLY_PANELS); 324 tracker_frame->UpdateIndicators(StateUpdate{.open_panels_tab = true});
325 } 325 }
326 } 326 }
327 327
diff --git a/src/paintings_pane.cpp b/src/paintings_pane.cpp index dc6f050..51c4995 100644 --- a/src/paintings_pane.cpp +++ b/src/paintings_pane.cpp
@@ -39,15 +39,15 @@ PaintingsPane::PaintingsPane(wxWindow* parent) : wxPanel(parent, wxID_ANY) {
39 reveal_btn_->Bind(wxEVT_BUTTON, &PaintingsPane::OnClickRevealPaintings, this); 39 reveal_btn_->Bind(wxEVT_BUTTON, &PaintingsPane::OnClickRevealPaintings, this);
40} 40}
41 41
42void PaintingsPane::UpdateIndicators() { 42void PaintingsPane::ResetIndicators() {
43 tree_ctrl_->DeleteAllItems(); 43 tree_ctrl_->DeleteAllItems();
44 reveal_btn_->Enable(AP_IsPaintingShuffle());
45}
44 46
45 if (!AP_IsPaintingShuffle()) { 47void PaintingsPane::UpdateIndicators(const std::vector<std::string>&) {
46 reveal_btn_->Disable(); 48 // TODO: Optimize this by using the paintings delta.
47 return;
48 }
49 49
50 reveal_btn_->Enable(); 50 tree_ctrl_->DeleteAllItems();
51 51
52 std::map<std::string, std::set<std::string>> grouped_paintings; 52 std::map<std::string, std::set<std::string>> grouped_paintings;
53 53
diff --git a/src/paintings_pane.h b/src/paintings_pane.h index 4c7856f..2b79286 100644 --- a/src/paintings_pane.h +++ b/src/paintings_pane.h
@@ -13,7 +13,8 @@ class PaintingsPane : public wxPanel {
13 public: 13 public:
14 explicit PaintingsPane(wxWindow* parent); 14 explicit PaintingsPane(wxWindow* parent);
15 15
16 void UpdateIndicators(); 16 void ResetIndicators();
17 void UpdateIndicators(const std::vector<std::string>& paintings);
17 18
18 private: 19 private:
19 void OnClickRevealPaintings(wxCommandEvent& event); 20 void OnClickRevealPaintings(wxCommandEvent& event);
diff --git a/src/subway_map.cpp b/src/subway_map.cpp index f742d12..9a35eef 100644 --- a/src/subway_map.cpp +++ b/src/subway_map.cpp
@@ -169,6 +169,8 @@ void SubwayMap::OnConnect() {
169 } 169 }
170 170
171 checked_paintings_.clear(); 171 checked_paintings_.clear();
172
173 UpdateIndicators();
172} 174}
173 175
174void SubwayMap::UpdateIndicators() { 176void SubwayMap::UpdateIndicators() {
diff --git a/src/tracker_frame.cpp b/src/tracker_frame.cpp index a697f9a..dc6c283 100644 --- a/src/tracker_frame.cpp +++ b/src/tracker_frame.cpp
@@ -51,9 +51,8 @@ enum TrackerFrameIds {
51}; 51};
52 52
53wxDEFINE_EVENT(STATE_RESET, wxCommandEvent); 53wxDEFINE_EVENT(STATE_RESET, wxCommandEvent);
54wxDEFINE_EVENT(STATE_CHANGED, wxCommandEvent); 54wxDEFINE_EVENT(STATE_CHANGED, StateChangedEvent);
55wxDEFINE_EVENT(STATUS_CHANGED, wxCommandEvent); 55wxDEFINE_EVENT(STATUS_CHANGED, wxCommandEvent);
56wxDEFINE_EVENT(REDRAW_POSITION, wxCommandEvent);
57wxDEFINE_EVENT(CONNECT_TO_AP, ApConnectEvent); 56wxDEFINE_EVENT(CONNECT_TO_AP, ApConnectEvent);
58 57
59TrackerFrame::TrackerFrame() 58TrackerFrame::TrackerFrame()
@@ -112,7 +111,6 @@ TrackerFrame::TrackerFrame()
112 Bind(STATE_RESET, &TrackerFrame::OnStateReset, this); 111 Bind(STATE_RESET, &TrackerFrame::OnStateReset, this);
113 Bind(STATE_CHANGED, &TrackerFrame::OnStateChanged, this); 112 Bind(STATE_CHANGED, &TrackerFrame::OnStateChanged, this);
114 Bind(STATUS_CHANGED, &TrackerFrame::OnStatusChanged, this); 113 Bind(STATUS_CHANGED, &TrackerFrame::OnStatusChanged, this);
115 Bind(REDRAW_POSITION, &TrackerFrame::OnRedrawPosition, this);
116 Bind(CONNECT_TO_AP, &TrackerFrame::OnConnectToAp, this); 114 Bind(CONNECT_TO_AP, &TrackerFrame::OnConnectToAp, this);
117 115
118 wxSize logicalSize = FromDIP(wxSize(1280, 728)); 116 wxSize logicalSize = FromDIP(wxSize(1280, 728));
@@ -173,15 +171,8 @@ void TrackerFrame::ResetIndicators() {
173 QueueEvent(new wxCommandEvent(STATE_RESET)); 171 QueueEvent(new wxCommandEvent(STATE_RESET));
174} 172}
175 173
176void TrackerFrame::UpdateIndicators(UpdateIndicatorsMode mode) { 174void TrackerFrame::UpdateIndicators(StateUpdate state) {
177 auto evt = new wxCommandEvent(STATE_CHANGED); 175 QueueEvent(new StateChangedEvent(STATE_CHANGED, GetId(), std::move(state)));
178 evt->SetInt(static_cast<int>(mode));
179
180 QueueEvent(evt);
181}
182
183void TrackerFrame::RedrawPosition() {
184 QueueEvent(new wxCommandEvent(REDRAW_POSITION));
185} 176}
186 177
187void TrackerFrame::OnAbout(wxCommandEvent &event) { 178void TrackerFrame::OnAbout(wxCommandEvent &event) {
@@ -250,7 +241,8 @@ void TrackerFrame::OnSettings(wxCommandEvent &event) {
250 GetTrackerConfig().track_position = dlg.GetTrackPosition(); 241 GetTrackerConfig().track_position = dlg.GetTrackPosition();
251 GetTrackerConfig().Save(); 242 GetTrackerConfig().Save();
252 243
253 UpdateIndicators(); 244 UpdateIndicators(
245 StateUpdate{.cleared_locations = true, .player_position = true});
254 } 246 }
255} 247}
256 248
@@ -304,7 +296,7 @@ void TrackerFrame::OnSashPositionChanged(wxSplitterEvent& event) {
304void TrackerFrame::OnStateReset(wxCommandEvent &event) { 296void TrackerFrame::OnStateReset(wxCommandEvent &event) {
305 tracker_panel_->UpdateIndicators(); 297 tracker_panel_->UpdateIndicators();
306 achievements_pane_->UpdateIndicators(); 298 achievements_pane_->UpdateIndicators();
307 paintings_pane_->UpdateIndicators(); 299 paintings_pane_->ResetIndicators();
308 subway_map_->OnConnect(); 300 subway_map_->OnConnect();
309 if (panels_panel_ != nullptr) { 301 if (panels_panel_ != nullptr) {
310 notebook_->DeletePage(notebook_->FindPage(panels_panel_)); 302 notebook_->DeletePage(notebook_->FindPage(panels_panel_));
@@ -313,19 +305,10 @@ void TrackerFrame::OnStateReset(wxCommandEvent &event) {
313 Refresh(); 305 Refresh();
314} 306}
315 307
316void TrackerFrame::OnStateChanged(wxCommandEvent &event) { 308void TrackerFrame::OnStateChanged(StateChangedEvent &event) {
317 UpdateIndicatorsMode mode = static_cast<UpdateIndicatorsMode>(event.GetInt()); 309 const StateUpdate &state = event.GetState();
318 310
319 if (mode == kUPDATE_ALL_INDICATORS) { 311 if (state.open_panels_tab) {
320 tracker_panel_->UpdateIndicators();
321 achievements_pane_->UpdateIndicators();
322 paintings_pane_->UpdateIndicators();
323 subway_map_->UpdateIndicators();
324 if (panels_panel_ != nullptr) {
325 panels_panel_->UpdateIndicators();
326 }
327 Refresh();
328 } else if (mode == kUPDATE_ONLY_PANELS) {
329 if (panels_panel_ == nullptr) { 312 if (panels_panel_ == nullptr) {
330 panels_panel_ = new TrackerPanel(notebook_); 313 panels_panel_ = new TrackerPanel(notebook_);
331 panels_panel_->SetPanelsMode(); 314 panels_panel_->SetPanelsMode();
@@ -335,25 +318,39 @@ void TrackerFrame::OnStateChanged(wxCommandEvent &event) {
335 if (notebook_->GetSelection() == 2) { 318 if (notebook_->GetSelection() == 2) {
336 Refresh(); 319 Refresh();
337 } 320 }
338 }
339}
340
341void TrackerFrame::OnStatusChanged(wxCommandEvent &event) {
342 SetStatusText(wxString::FromUTF8(GetStatusMessage()));
343}
344 321
345void TrackerFrame::OnRedrawPosition(wxCommandEvent &event) {
346 if (!GetTrackerConfig().track_position) {
347 return; 322 return;
348 } 323 }
324
325 if (!state.items.empty() || !state.paintings.empty() ||
326 state.cleared_locations) {
327 tracker_panel_->UpdateIndicators();
328 subway_map_->UpdateIndicators();
329 if (panels_panel_ != nullptr) {
330 panels_panel_->UpdateIndicators();
331 }
332 Refresh();
333 } else if (state.player_position && GetTrackerConfig().track_position) {
334 if (notebook_->GetSelection() == 0) {
335 tracker_panel_->Refresh();
336 } else if (notebook_->GetSelection() == 2) {
337 panels_panel_->Refresh();
338 }
339 }
349 340
350 if (notebook_->GetSelection() == 0) { 341 if (state.achievements) {
351 tracker_panel_->Refresh(); 342 achievements_pane_->UpdateIndicators();
352 } else if (notebook_->GetSelection() == 2) { 343 }
353 panels_panel_->Refresh(); 344
345 if (!state.paintings.empty()) {
346 paintings_pane_->UpdateIndicators(state.paintings);
354 } 347 }
355} 348}
356 349
350void TrackerFrame::OnStatusChanged(wxCommandEvent &event) {
351 SetStatusText(wxString::FromUTF8(GetStatusMessage()));
352}
353
357void TrackerFrame::OnConnectToAp(ApConnectEvent &event) { 354void TrackerFrame::OnConnectToAp(ApConnectEvent &event) {
358 AP_Connect(event.GetServer(), event.GetUser(), event.GetPass()); 355 AP_Connect(event.GetServer(), event.GetUser(), event.GetPass());
359} 356}
diff --git a/src/tracker_frame.h b/src/tracker_frame.h index 4f1f464..ff18e49 100644 --- a/src/tracker_frame.h +++ b/src/tracker_frame.h
@@ -9,6 +9,7 @@
9 9
10#include <memory> 10#include <memory>
11 11
12#include "ap_state.h"
12#include "icons.h" 13#include "icons.h"
13#include "updater.h" 14#include "updater.h"
14 15
@@ -44,17 +45,33 @@ class ApConnectEvent : public wxEvent {
44 std::string ap_pass_; 45 std::string ap_pass_;
45}; 46};
46 47
48struct StateUpdate {
49 std::vector<ItemState> items;
50 std::vector<std::string> paintings;
51 bool achievements = false;
52 bool open_panels_tab = false;
53 bool cleared_locations = false;
54 bool player_position = false;
55};
56
57class StateChangedEvent : public wxEvent {
58 public:
59 StateChangedEvent(wxEventType eventType, int winid, StateUpdate state)
60 : wxEvent(winid, eventType), state_(std::move(state)) {}
61
62 const StateUpdate &GetState() const { return state_; }
63
64 virtual wxEvent *Clone() const { return new StateChangedEvent(*this); }
65
66 private:
67 StateUpdate state_;
68};
69
47wxDECLARE_EVENT(STATE_RESET, wxCommandEvent); 70wxDECLARE_EVENT(STATE_RESET, wxCommandEvent);
48wxDECLARE_EVENT(STATE_CHANGED, wxCommandEvent); 71wxDECLARE_EVENT(STATE_CHANGED, StateChangedEvent);
49wxDECLARE_EVENT(STATUS_CHANGED, wxCommandEvent); 72wxDECLARE_EVENT(STATUS_CHANGED, wxCommandEvent);
50wxDECLARE_EVENT(REDRAW_POSITION, wxCommandEvent);
51wxDECLARE_EVENT(CONNECT_TO_AP, ApConnectEvent); 73wxDECLARE_EVENT(CONNECT_TO_AP, ApConnectEvent);
52 74
53enum UpdateIndicatorsMode {
54 kUPDATE_ALL_INDICATORS = 0,
55 kUPDATE_ONLY_PANELS = 1,
56};
57
58class TrackerFrame : public wxFrame { 75class TrackerFrame : public wxFrame {
59 public: 76 public:
60 TrackerFrame(); 77 TrackerFrame();
@@ -63,8 +80,7 @@ class TrackerFrame : public wxFrame {
63 void UpdateStatusMessage(); 80 void UpdateStatusMessage();
64 81
65 void ResetIndicators(); 82 void ResetIndicators();
66 void UpdateIndicators(UpdateIndicatorsMode mode = kUPDATE_ALL_INDICATORS); 83 void UpdateIndicators(StateUpdate state);
67 void RedrawPosition();
68 84
69 private: 85 private:
70 void OnExit(wxCommandEvent &event); 86 void OnExit(wxCommandEvent &event);
@@ -80,9 +96,8 @@ class TrackerFrame : public wxFrame {
80 void OnSashPositionChanged(wxSplitterEvent &event); 96 void OnSashPositionChanged(wxSplitterEvent &event);
81 97
82 void OnStateReset(wxCommandEvent &event); 98 void OnStateReset(wxCommandEvent &event);
83 void OnStateChanged(wxCommandEvent &event); 99 void OnStateChanged(StateChangedEvent &event);
84 void OnStatusChanged(wxCommandEvent &event); 100 void OnStatusChanged(wxCommandEvent &event);
85 void OnRedrawPosition(wxCommandEvent &event);
86 void OnConnectToAp(ApConnectEvent &event); 101 void OnConnectToAp(ApConnectEvent &event);
87 102
88 std::unique_ptr<Updater> updater_; 103 std::unique_ptr<Updater> updater_;