From abf01f657d068aa6b22ab962cbe01b88f3b5f7ea Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Fri, 12 Sep 2025 16:35:40 +0200 Subject: event logging --- src/administration.cpp | 11 +++++++++-- src/administration_writer.cpp | 24 ++++++++++++++++++++++-- src/log.cpp | 33 ++++++++++++++++++++++++++++----- src/main.cpp | 4 +++- src/ui/ui_expenses.cpp | 10 +++++++++- src/ui/ui_invoices.cpp | 9 ++++++++- src/ui/ui_log.cpp | 20 ++++++++++++++++++++ src/ui/ui_main.cpp | 11 +++++++++++ 8 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/ui/ui_log.cpp (limited to 'src') diff --git a/src/administration.cpp b/src/administration.cpp index bbc9a65..ab72647 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -6,6 +6,7 @@ #include #include +#include "log.hpp" #include "strops.hpp" #include "administration.hpp" #include "administration_writer.hpp" @@ -395,6 +396,8 @@ static s32 administration_create_sequence_number() // ======================= void administration_create() { + STOPWATCH_START; + g_administration.next_id = 1; g_administration.next_sequence_number = 1; @@ -412,8 +415,8 @@ void administration_create() administration_create_debug_data(); //administration_writer_save_all_async(); - income_statement* statement = (income_statement*)malloc(sizeof(income_statement)); - administration_create_income_statement(statement); + + log_add("Setup took %.3fms.", STOPWATCH_TIME); } static void administration_destroy_list(list_t *list) @@ -520,6 +523,8 @@ static void administration_debug_print_income_statement(income_statement* statem void administration_create_income_statement(income_statement* statement) { + STOPWATCH_START; + assert(statement); statement->quarter_count = 0; @@ -702,6 +707,8 @@ void administration_create_income_statement(income_statement* statement) //administration_debug_print_income_statement(statement); free(invoice_buffer); + + log_add("Created income statement in %.3fms.", STOPWATCH_TIME); } char* administration_file_path_get() diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index c97a828..6a0aba3 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -170,6 +170,8 @@ static char* administration_writer_get_eas_scheme_for_address(address addr) bool administration_writer_save_invoice_blocking(invoice inv) { + STOPWATCH_START; + bool result = 1; int buf_length = 150000; // Ballpark file content size. char* file_content = (char*)malloc(buf_length); @@ -312,8 +314,7 @@ bool administration_writer_save_invoice_blocking(invoice inv) free(file_content); - log_add(ImGui::GetTime(), "Saved file."); - + log_add("Saved invoice '%s' in %.3fms.", inv.sequential_number, STOPWATCH_TIME); return result; } @@ -339,6 +340,8 @@ static bool administration_writer_save_all_invoices_blocking() ///////////////////////////// bool administration_writer_save_project_blocking(project project) { + STOPWATCH_START; + bool result = 1; int buf_length = 0; char* file_content = administration_writer_copy_template(project_save_template, &buf_length); @@ -358,6 +361,8 @@ bool administration_writer_save_project_blocking(project project) else if (!administration_writer_write_to_zip(final_path, file_content, final_length)) result = 0; free(file_content); + + log_add("Saved project '%s' in %.3fms.", project.description, STOPWATCH_TIME); return result; } @@ -383,6 +388,8 @@ static bool administration_writer_save_all_projects_blocking() ///////////////////////////// bool administration_writer_save_cost_center_blocking(cost_center cost) { + STOPWATCH_START; + bool result = 1; int buf_length = 0; char* file_content = administration_writer_copy_template(costcenter_save_template, &buf_length); @@ -400,6 +407,8 @@ bool administration_writer_save_cost_center_blocking(cost_center cost) else if (!administration_writer_write_to_zip(final_path, file_content, final_length)) result = 0; free(file_content); + + log_add("Saved cost center '%s' in %.3fms.", cost.code, STOPWATCH_TIME); return result; } @@ -425,6 +434,8 @@ static bool administration_writer_save_all_cost_centers_blocking() ///////////////////////////// bool administration_writer_save_tax_bracket_blocking(country_tax_bracket bracket) { + STOPWATCH_START; + bool result = 1; int buf_length = 0; char* file_content = administration_writer_copy_template(taxbracket_save_template, &buf_length); @@ -443,6 +454,8 @@ bool administration_writer_save_tax_bracket_blocking(country_tax_bracket bracket else if (!administration_writer_write_to_zip(final_path, file_content, final_length)) result = 0; free(file_content); + + log_add("Saved tax bracket '%s/%.1f' in %.3fms.", bracket.country_code, bracket.rate, STOPWATCH_TIME); return result; } @@ -470,6 +483,8 @@ static bool administration_writer_save_all_tax_brackets_blocking() ///////////////////////////// bool administration_writer_save_contact_blocking(contact c) { + STOPWATCH_START; + bool result = 1; int buf_length = 0; char* file_content = administration_writer_copy_template(contact_save_template, &buf_length); @@ -497,6 +512,8 @@ bool administration_writer_save_contact_blocking(contact c) else if (!administration_writer_write_to_zip(final_path, file_content, final_length)) result = 0; free(file_content); + + log_add("Saved contact '%s' in %.3fms.", c.name, STOPWATCH_TIME); return result; } @@ -528,6 +545,8 @@ static bool administration_writer_save_all_contacts_blocking() ///////////////////////////// bool administration_writer_save_all_administration_info_blocking() { + STOPWATCH_START; + bool result = 1; int buf_length = 0; char* file_content = administration_writer_copy_template(administration_save_template, &buf_length); @@ -543,6 +562,7 @@ bool administration_writer_save_all_administration_info_blocking() free(file_content); + log_add("Saved administration info in %.3fms.", STOPWATCH_TIME); return result; } diff --git a/src/log.cpp b/src/log.cpp index 960ee85..058b594 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -1,24 +1,47 @@ #include #include - +#include +#include "timer.h" #include "log.hpp" log g_log = {0}; -void log_add(double timestamp, const char* fmt, ...) +log* get_log() +{ + return &g_log; +} + +void log_add(const char* fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(g_log.history[g_log.write_cursor], MAX_LEN_LOG_TXT, fmt, args); va_end(args); + tick_t ms_since_epoch = timer_system(); + char time_buf[50]; + time_t seconds = (time_t)(ms_since_epoch / 1000); + int milliseconds = (int)(ms_since_epoch % 1000); + + // Convert to local time + struct tm tm_time; + #if defined(_WIN32) + localtime_s(&tm_time, &seconds); + #else + localtime_r(&seconds, &tm_time); + #endif + + snprintf(time_buf, 50, "%02d:%02d %02d.%03d", + tm_time.tm_hour, + tm_time.tm_min, + tm_time.tm_sec, + milliseconds); + char tmp[MAX_LEN_LOG_TXT]; - snprintf(tmp, MAX_LEN_LOG_TXT, "[%.3f] %s", timestamp, g_log.history[g_log.write_cursor]); + snprintf(tmp, MAX_LEN_LOG_TXT, "[%s] %s", time_buf, g_log.history[g_log.write_cursor]); tmp[MAX_LEN_LOG_TXT-1] = 0; memcpy(g_log.history[g_log.write_cursor], tmp, MAX_LEN_LOG_TXT); - printf(g_log.history[g_log.write_cursor]); - g_log.write_cursor++; if (g_log.write_cursor >= MAX_LEN_LOG_HISTORY) g_log.write_cursor = 0; diff --git a/src/main.cpp b/src/main.cpp index 289ca57..d579a19 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,7 +3,7 @@ #include "imgui_impl_dx11.h" #include #include - +#include "timer.h" #include "ui.hpp" #include "administration.hpp" #include "administration_writer.hpp" @@ -89,6 +89,7 @@ int main() ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + timer_lib_initialize(); administration_writer_create(); administration_create(); @@ -148,6 +149,7 @@ int main() administration_destroy(); administration_writer_destroy(); + timer_lib_shutdown(); // Cleanup ImGui_ImplDX11_Shutdown(); diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index eb8d8c1..bb23ba9 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -438,7 +438,15 @@ static void ui_draw_expenses_list() ImGui::Separator(); if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { - administration_invoice_remove(&selected_for_removal); + if (administration_invoice_remove(&selected_for_removal)) { + if (administration_writer_delete_entry(selected_for_removal.id)) { + ui_set_status(localize("status.saved")); + } + else { + ui_set_status_error(localize("status.saveFailed")); + } + } + ImGui::CloseCurrentPopup(); } ImGui::SameLine(); diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index fd748c8..d64147f 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -471,7 +471,14 @@ static void ui_draw_invoices_list() ImGui::Separator(); if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { - administration_invoice_remove(&selected_for_removal); + if (administration_invoice_remove(&selected_for_removal)) { + if (administration_writer_delete_entry(selected_for_removal.id)) { + ui_set_status(localize("status.saved")); + } + else { + ui_set_status_error(localize("status.saveFailed")); + } + } ImGui::CloseCurrentPopup(); } ImGui::SameLine(); diff --git a/src/ui/ui_log.cpp b/src/ui/ui_log.cpp new file mode 100644 index 0000000..08a0a72 --- /dev/null +++ b/src/ui/ui_log.cpp @@ -0,0 +1,20 @@ +#include + +#include "ui.hpp" +#include "imgui.h" +#include "log.hpp" +#include "locales.hpp" + +void ui_draw_log() +{ + log* l = get_log(); + + for (int i = (int)l->history_length-1; i >= 0; i--) + { + u32 cursor = l->write_cursor - l->history_length + i; + if (cursor < 0) { + cursor = (l->write_cursor + i) % MAX_LEN_LOG_HISTORY; + } + ImGui::Text(l->history[cursor]); + } +} \ No newline at end of file diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp index 9ff965d..61c4784 100644 --- a/src/ui/ui_main.cpp +++ b/src/ui/ui_main.cpp @@ -12,6 +12,7 @@ typedef enum REPORT_TAX = 4, PROJECTS = 5, SETTINGS = 6, + LOG = 7, END } dashboard_view_state; @@ -25,6 +26,7 @@ void (*drawcalls[dashboard_view_state::END])(void) = { 0, ui_draw_projects, ui_draw_settings, + ui_draw_log, }; void (*setupcalls[dashboard_view_state::END])(void) = { @@ -35,6 +37,7 @@ void (*setupcalls[dashboard_view_state::END])(void) = { 0, ui_setup_projects, ui_setup_settings, + 0, }; void (*destroycalls[dashboard_view_state::END])(void) = { @@ -45,6 +48,7 @@ void (*destroycalls[dashboard_view_state::END])(void) = { 0, 0, ui_destroy_settings, + 0, }; static void set_dashboard_state(dashboard_view_state state) @@ -68,6 +72,13 @@ void ui_draw_main() ImGui::EndMenu(); } + + if (ImGui::BeginMenu("Help")) + { + if (ImGui::MenuItem("Event Log")) { set_dashboard_state(dashboard_view_state::LOG); } + + ImGui::EndMenu(); + } ImGui::EndMainMenuBar(); } -- cgit v1.2.3-70-g09d2