From d3457700075fab2dac25bcff2775b7ae5a436a28 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 9 Mar 2025 13:07:35 -0400 Subject: Created log window --- CMakeLists.txt | 1 + src/log_dialog.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/log_dialog.h | 24 ++++++++++++++++++++++++ src/logger.cpp | 42 +++++++++++++++++++++++++++++++++++++----- src/logger.h | 6 ++++++ src/tracker_frame.cpp | 26 ++++++++++++++++++++++++++ src/tracker_frame.h | 5 +++++ 7 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 src/log_dialog.cpp create mode 100644 src/log_dialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1904518..9432f2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(SOURCE_FILES "src/paintings_pane.cpp" "src/items_pane.cpp" "src/options_pane.cpp" + "src/log_dialog.cpp" "vendor/whereami/whereami.c" ) diff --git a/src/log_dialog.cpp b/src/log_dialog.cpp new file mode 100644 index 0000000..3f0a8ad --- /dev/null +++ b/src/log_dialog.cpp @@ -0,0 +1,37 @@ +#include "log_dialog.h" + +#include "logger.h" + +wxDEFINE_EVENT(LOG_MESSAGE, wxCommandEvent); + +LogDialog::LogDialog(wxWindow* parent) + : wxDialog(parent, wxID_ANY, "Debug Log", wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { + SetSize(FromDIP(wxSize{512, 280})); + + text_area_ = + new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE | wxTE_READONLY | wxTE_DONTWRAP); + text_area_->SetValue(TrackerReadPastLog()); + + wxBoxSizer* top_sizer = new wxBoxSizer(wxVERTICAL); + top_sizer->Add(text_area_, + wxSizerFlags().DoubleBorder().Expand().Proportion(1)); + + SetSizer(top_sizer); + + Bind(LOG_MESSAGE, &LogDialog::OnLogMessage, this); +} + +void LogDialog::LogMessage(const std::string& message) { + wxCommandEvent* event = new wxCommandEvent(LOG_MESSAGE); + event->SetString(message); + QueueEvent(event); +} + +void LogDialog::OnLogMessage(wxCommandEvent& event) { + if (!text_area_->IsEmpty()) { + text_area_->AppendText("\n"); + } + text_area_->AppendText(event.GetString()); +} diff --git a/src/log_dialog.h b/src/log_dialog.h new file mode 100644 index 0000000..c29251f --- /dev/null +++ b/src/log_dialog.h @@ -0,0 +1,24 @@ +#ifndef LOG_DIALOG_H_EEFD45B6 +#define LOG_DIALOG_H_EEFD45B6 + +#include + +#ifndef WX_PRECOMP +#include +#endif + +wxDECLARE_EVENT(LOG_MESSAGE, wxCommandEvent); + +class LogDialog : public wxDialog { + public: + explicit LogDialog(wxWindow* parent); + + void LogMessage(const std::string& message); + + private: + void OnLogMessage(wxCommandEvent& event); + + wxTextCtrl* text_area_; +}; + +#endif /* end of include guard: LOG_DIALOG_H_EEFD45B6 */ diff --git a/src/logger.cpp b/src/logger.cpp index 09fc331..8a08b58 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -3,8 +3,10 @@ #include #include #include +#include #include "global.h" +#include "log_dialog.h" namespace { @@ -14,19 +16,49 @@ class Logger { void LogLine(const std::string& text) { std::lock_guard guard(file_mutex_); - logfile_ << "[" << std::chrono::system_clock::now() << "] " << text - << std::endl; + std::ostringstream line; + line << "[" << std::chrono::system_clock::now() << "] " << text; + + logfile_ << line.str() << std::endl; logfile_.flush(); + + if (log_dialog_ != nullptr) { + log_dialog_->LogMessage(line.str()); + } + } + + std::string GetContents() { + std::lock_guard guard(file_mutex_); + + std::ifstream file_in(GetAbsolutePath("debug.log")); + std::ostringstream buffer; + buffer << file_in.rdbuf(); + + return buffer.str(); + } + + void SetLogDialog(LogDialog* log_dialog) { + std::lock_guard guard(file_mutex_); + log_dialog_ = log_dialog; } private: std::ofstream logfile_; std::mutex file_mutex_; + LogDialog* log_dialog_ = nullptr; }; +Logger& GetLogger() { + static Logger* instance = new Logger(); + return *instance; +} + } // namespace -void TrackerLog(std::string text) { - static Logger* instance = new Logger(); - instance->LogLine(text); +void TrackerLog(std::string text) { GetLogger().LogLine(text); } + +std::string TrackerReadPastLog() { return GetLogger().GetContents(); } + +void TrackerSetLogDialog(LogDialog* log_dialog) { + GetLogger().SetLogDialog(log_dialog); } diff --git a/src/logger.h b/src/logger.h index a27839f..f669790 100644 --- a/src/logger.h +++ b/src/logger.h @@ -3,6 +3,12 @@ #include +class LogDialog; + void TrackerLog(std::string message); +std::string TrackerReadPastLog(); + +void TrackerSetLogDialog(LogDialog* log_dialog); + #endif /* end of include guard: LOGGER_H_9BDD07EA */ diff --git a/src/tracker_frame.cpp b/src/tracker_frame.cpp index 4a4e3b5..6a4ab2e 100644 --- a/src/tracker_frame.cpp +++ b/src/tracker_frame.cpp @@ -18,6 +18,8 @@ #include "ipc_dialog.h" #include "ipc_state.h" #include "items_pane.h" +#include "log_dialog.h" +#include "logger.h" #include "options_pane.h" #include "paintings_pane.h" #include "settings_dialog.h" @@ -50,6 +52,7 @@ enum TrackerFrameIds { ID_ZOOM_OUT = 5, ID_OPEN_SAVE_FILE = 6, ID_IPC_CONNECT = 7, + ID_LOG_DIALOG = 8, }; wxDEFINE_EVENT(STATE_RESET, wxCommandEvent); @@ -80,6 +83,8 @@ TrackerFrame::TrackerFrame() wxMenu *menuView = new wxMenu(); zoom_in_menu_item_ = menuView->Append(ID_ZOOM_IN, "Zoom In\tCtrl-+"); zoom_out_menu_item_ = menuView->Append(ID_ZOOM_OUT, "Zoom Out\tCtrl--"); + menuView->AppendSeparator(); + menuView->Append(ID_LOG_DIALOG, "Show Log Window\tCtrl-L"); zoom_in_menu_item_->Enable(false); zoom_out_menu_item_->Enable(false); @@ -106,6 +111,7 @@ TrackerFrame::TrackerFrame() ID_CHECK_FOR_UPDATES); Bind(wxEVT_MENU, &TrackerFrame::OnZoomIn, this, ID_ZOOM_IN); Bind(wxEVT_MENU, &TrackerFrame::OnZoomOut, this, ID_ZOOM_OUT); + Bind(wxEVT_MENU, &TrackerFrame::OnOpenLogWindow, this, ID_LOG_DIALOG); Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, &TrackerFrame::OnChangePage, this); Bind(wxEVT_MENU, &TrackerFrame::OnOpenFile, this, ID_OPEN_SAVE_FILE); Bind(wxEVT_SPLITTER_SASH_POS_CHANGED, &TrackerFrame::OnSashPositionChanged, @@ -270,6 +276,26 @@ void TrackerFrame::OnZoomOut(wxCommandEvent &event) { } } +void TrackerFrame::OnOpenLogWindow(wxCommandEvent &event) { + if (log_dialog_ == nullptr) { + log_dialog_ = new LogDialog(this); + log_dialog_->Show(); + TrackerSetLogDialog(log_dialog_); + + log_dialog_->Bind(wxEVT_CLOSE_WINDOW, &TrackerFrame::OnCloseLogWindow, + this); + } else { + log_dialog_->SetFocus(); + } +} + +void TrackerFrame::OnCloseLogWindow(wxCloseEvent& event) { + TrackerSetLogDialog(nullptr); + log_dialog_ = nullptr; + + event.Skip(); +} + void TrackerFrame::OnChangePage(wxBookCtrlEvent &event) { zoom_in_menu_item_->Enable(event.GetSelection() == 1); zoom_out_menu_item_->Enable(event.GetSelection() == 1); diff --git a/src/tracker_frame.h b/src/tracker_frame.h index 55e7759..7704208 100644 --- a/src/tracker_frame.h +++ b/src/tracker_frame.h @@ -15,6 +15,7 @@ class AchievementsPane; class ItemsPane; +class LogDialog; class OptionsPane; class PaintingsPane; class SubwayMap; @@ -49,6 +50,7 @@ class ApConnectEvent : public wxEvent { struct StateUpdate { std::vector items; + bool progression_items = false; std::vector paintings; bool achievements = false; bool open_panels_tab = false; @@ -94,6 +96,8 @@ class TrackerFrame : public wxFrame { void OnCheckForUpdates(wxCommandEvent &event); void OnZoomIn(wxCommandEvent &event); void OnZoomOut(wxCommandEvent &event); + void OnOpenLogWindow(wxCommandEvent &event); + void OnCloseLogWindow(wxCloseEvent &event); void OnChangePage(wxBookCtrlEvent &event); void OnOpenFile(wxCommandEvent &event); void OnSashPositionChanged(wxSplitterEvent &event); @@ -114,6 +118,7 @@ class TrackerFrame : public wxFrame { PaintingsPane *paintings_pane_; SubwayMap *subway_map_; TrackerPanel *panels_panel_ = nullptr; + LogDialog *log_dialog_ = nullptr; wxMenuItem *zoom_in_menu_item_; wxMenuItem *zoom_out_menu_item_; -- cgit 1.4.1