diff --git a/BigBaseV2/src/backend/looped/self/window_log.cpp b/BigBaseV2/src/backend/looped/self/window_log.cpp new file mode 100644 index 00000000..828eb925 --- /dev/null +++ b/BigBaseV2/src/backend/looped/self/window_log.cpp @@ -0,0 +1,37 @@ +#include "gui/window.hpp" +#include "gui/window/main/tabs.hpp" +#include "imgui.h" +#include "renderer.hpp" +#include "logger.hpp" + +namespace big +{ + static size_t iLastLogCount = 0; + void window::log() + { + ImGui::SetNextWindowSize({ 500, 250 }, ImGuiCond_FirstUseEver); + ImGui::SetNextWindowPos({ 50, 50 }, ImGuiCond_FirstUseEver); + if (g.window.log && ImGui::Begin("Log")) + { + ImGui::PushFont(g_renderer->m_monospace_font); + + std::lock_guard lock(g_logger->m_mutex); + auto msgs = g_logger->get_messages(); + + for (size_t i = 0; i < msgs.second; i++) + { + ImGui::TextUnformatted(msgs.first[i].get()); + } + + if (iLastLogCount != msgs.second) + { + iLastLogCount = msgs.second; + ImGui::SetScrollHereY(1.f); + } + + ImGui::PopFont(); + + ImGui::End(); + } + } +} \ No newline at end of file diff --git a/BigBaseV2/src/core/globals.hpp b/BigBaseV2/src/core/globals.hpp index e69b8e50..a3cc1007 100644 --- a/BigBaseV2/src/core/globals.hpp +++ b/BigBaseV2/src/core/globals.hpp @@ -28,6 +28,7 @@ struct globals { struct window { bool main = true; + bool log = false; }; self self{}; diff --git a/BigBaseV2/src/gui/gui_main.cpp b/BigBaseV2/src/gui/gui_main.cpp index b4a31569..f0695d8b 100644 --- a/BigBaseV2/src/gui/gui_main.cpp +++ b/BigBaseV2/src/gui/gui_main.cpp @@ -7,6 +7,8 @@ namespace big { window::top_bar(); + window::log(); + window::main(); } } \ No newline at end of file diff --git a/BigBaseV2/src/gui/window.hpp b/BigBaseV2/src/gui/window.hpp index f14a9639..05186cdf 100644 --- a/BigBaseV2/src/gui/window.hpp +++ b/BigBaseV2/src/gui/window.hpp @@ -5,6 +5,7 @@ namespace big class window { public: static void top_bar(); + static void log(); static void main(); }; } \ No newline at end of file diff --git a/BigBaseV2/src/gui/window/window_main.cpp b/BigBaseV2/src/gui/window/window_main.cpp index 192ad01f..bcd65311 100644 --- a/BigBaseV2/src/gui/window/window_main.cpp +++ b/BigBaseV2/src/gui/window/window_main.cpp @@ -7,7 +7,7 @@ namespace big void window::main() { ImGui::SetNextWindowSize({ 800, 840 }, ImGuiCond_FirstUseEver); - if (g.window.main && ImGui::Begin("Yimura's Mod Menu", &g.window.main)) + if (g.window.main && ImGui::Begin("Yimura's Mod Menu")) { ImGui::BeginTabBar("tabbar"); tab_main::tab_self(); @@ -15,7 +15,8 @@ namespace big tab_main::tab_vehicle(); tab_main::tab_weapons(); ImGui::EndTabBar(); + + ImGui::End(); } - ImGui::End(); } } \ No newline at end of file diff --git a/BigBaseV2/src/gui/window/window_top_bar.cpp b/BigBaseV2/src/gui/window/window_top_bar.cpp index 0f86dcec..d8f298c6 100644 --- a/BigBaseV2/src/gui/window/window_top_bar.cpp +++ b/BigBaseV2/src/gui/window/window_top_bar.cpp @@ -53,7 +53,8 @@ namespace big if (ImGui::BeginMenu("Windows")) { - ImGui::MenuItem("Main Window", nullptr, &g.window.main); + ImGui::MenuItem("Main", nullptr, &g.window.main); + ImGui::MenuItem("Logs", nullptr, &g.window.log); ImGui::EndMenu(); } @@ -62,12 +63,7 @@ namespace big { if (ImGui::MenuItem("Unload Menu (may crash)")) { - QUEUE_JOB_BEGIN_CLAUSE(&) - { - g_running = false; - - notify::above_map("Thanks for using Yim's Mod Menu"); - }QUEUE_JOB_END_CLAUSE + g_running = false; } if (ImGui::MenuItem("Rage Quit (hard crash)")) diff --git a/BigBaseV2/src/logger.hpp b/BigBaseV2/src/logger.hpp index 932966c1..b7a4f548 100644 --- a/BigBaseV2/src/logger.hpp +++ b/BigBaseV2/src/logger.hpp @@ -53,17 +53,6 @@ namespace big explicit logger() : m_file_path(std::getenv("appdata")), m_worker(g3::LogWorker::createLogWorker()) - { - if ((m_did_console_exist = AttachConsole(GetCurrentProcessId())) == false) - AllocConsole(); - - if ((m_console_handle = GetStdHandle(STD_OUTPUT_HANDLE)) != nullptr) - { - SetConsoleTitleA("Yim's Mod Menu"); - SetConsoleOutputCP(CP_UTF8); - - m_console_out.open("CONOUT$", std::ios_base::out | std::ios_base::app); - } m_file_path /= "BigBaseV2"; std::filesystem::path m_backup_path = m_file_path; @@ -130,6 +119,13 @@ namespace big g_logger = nullptr; } + std::pair*, std::size_t> get_messages() + { + return std::make_pair(m_messages.data(), m_messages.size()); + } + std::vector> m_messages; + std::mutex m_mutex; + struct log_sink { std::map log_colors = { @@ -151,8 +147,17 @@ namespace big if (!(level_value & FLAG_NO_CONSOLE)) { - SetConsoleTextAttribute(g_logger->m_console_handle, static_cast(log_colors[log_message._level.text])); - g_logger->m_console_out << log_message.toString(is_raw ? format_raw : format_console) << std::flush; + std::lock_guard lock(g_logger->m_mutex); + + const std::string msg = log_message.toString(is_raw ? format_raw : format_console); + + std::size_t size = msg.size() + 1; + auto message = std::make_unique(size); + std::uninitialized_fill_n(message.get(), size, '\0'); + strcpy(message.get(), msg.c_str()); + g_logger->m_messages.push_back( + std::move(message) + ); } if (!(level_value & FLAG_NO_DISK))