diff options
| author | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-09 17:30:15 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-09 17:30:15 +0100 |
| commit | 0821197bc1c57c756e737740d6a6de9c83314fae (patch) | |
| tree | 4963d2be78bd0978442a4b311889c6f2c5feaeee | |
| parent | ccacaf0582bcea4a71ec8247ade0fd75e4ca99bf (diff) | |
fix warnings
30 files changed, 104 insertions, 427 deletions
diff --git a/include/administration.hpp b/include/administration.hpp index 2d6d621..51e72d8 100644 --- a/include/administration.hpp +++ b/include/administration.hpp @@ -489,9 +489,9 @@ namespace administration { // Setup functions. // ======================= - void create_empty(char* save_file); - void create_default(char* save_file); - void create_from_file(char* save_file); + void create_empty(const char* save_file); + void create_default(const char* save_file); + void create_from_file(const char* save_file); void destroy(); void sort_data(); @@ -519,11 +519,11 @@ namespace administration { // Other functions. // ======================= - char* get_file_path(); + const char* get_file_path(); s32 get_next_id(); s32 get_next_sequence_number(); - char* get_currency_symbol_for_currency(char* code); - char* get_default_currency(); + const char* get_currency_symbol_for_currency(const char* code); + const char* get_default_currency(); time_t get_default_invoice_expire_duration(); ai_service get_active_ai_service(); ai_service get_ai_service(ai_provider provider); @@ -563,7 +563,7 @@ namespace administration { a_err project_remove(project data); void project_cancel(project data); a_err project_is_valid(project data); - char* project_get_status_string(project data); + const char* project_get_status_string(project data); u32 project_get_all(project* buffer); u32 project_get_partial_list(u32 page_index, u32 page_size, project* buffer); a_err project_get_by_id(project* buffer, char* id); @@ -610,7 +610,7 @@ namespace administration { void invoice_destroy(invoice* invoice); a_err invoice_is_valid(invoice* invoice); bool invoice_has_intra_community_services(invoice* invoice); - char* invoice_get_status_string(invoice* invoice); + const char* invoice_get_status_string(invoice* invoice); u32 invoice_get_partial_list_outgoing(u32 page_index, u32 page_size, invoice* buffer); u32 invoice_get_partial_list_incomming(u32 page_index, u32 page_size, invoice* buffer); u32 invoice_get_all(invoice* buffer); @@ -635,7 +635,7 @@ namespace administration { // Activity functions. // =================== a_err activity_import(activity ac); - a_err activity_add(char* user, char* ref_id, char* message); + a_err activity_add(const char* user, const char* ref_id, const char* message); u32 activity_get_all_for_object(activity* buffer, char* ref_id); u32 activity_count(); a_err activity_get_by_index(u32 index, activity* buffer); diff --git a/include/config.hpp b/include/config.hpp index 7650e75..b7b38d5 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -34,9 +34,9 @@ #define SIMULATE_SLOW_DISK 0 #define SIMULATE_WRITE_FAILURE 0 -namespace config { - static const char* PROGRAM_VERSION = "0.1.0"; // major.minor.patch +#define PROGRAM_VERSION "0.1.0" // major.minor.patch +namespace config { namespace colors { static const ImU32 COLOR_ERROR_OUTLINE = IM_COL32(255, 0, 0, 80); static const ImU32 COLOR_ERROR = IM_COL32(235, 64, 52, 255); diff --git a/include/countries.hpp b/include/countries.hpp index 1595b85..de91dab 100644 --- a/include/countries.hpp +++ b/include/countries.hpp @@ -39,14 +39,14 @@ namespace country { s32 get_count(); const char* get_code_by_index(s32 index); - time_t get_default_invoice_expire_duration(char* country_code); + time_t get_default_invoice_expire_duration(const char* country_code); bool is_EU(const char* country_code); bool is_enabled(const char* country_code); bool tax_is_implemented(const char* country_code); - void fill_tax_report_with_categories(char* country_code, tax_report* report); - bool add_billing_item_to_tax_report(char* country_code, tax_report* report, invoice* inv, billing_item* item); - float calculate_tax_report_final(char* country_code, tax_report* report); - time_t get_invoice_date_to_use_for_tax_report(char* country_code, invoice* inv); + void fill_tax_report_with_categories(const char* country_code, tax_report* report); + bool add_billing_item_to_tax_report(const char* country_code, tax_report* report, invoice* inv, billing_item* item); + float calculate_tax_report_final(const char* country_code, tax_report* report); + time_t get_invoice_date_to_use_for_tax_report(const char* country_code, invoice* inv); u32 get_available_tax_rates(const char* country_code, tax_rate* buffer, u32 buffer_size); } diff --git a/include/exporter.hpp b/include/exporter.hpp index 82c18b2..3ac57b0 100644 --- a/include/exporter.hpp +++ b/include/exporter.hpp @@ -42,8 +42,8 @@ namespace exporter { time_t done_at; e_err error; status status; - char* sender; - char* recipient; + const char* sender; + const char* recipient; const char* subject; const char* text; send_email_callback callback; @@ -51,10 +51,10 @@ namespace exporter { typedef struct { - char* provider_name; - bool (*send_email)(char* sender, char* recipient, const char* subject, const char* text); + const char* provider_name; + bool (*send_email)(const char* sender, const char* recipient, const char* subject, const char* text); } email_provider_impl; email_provider_impl get_email_provider_implementation(email_provider provider); - exporter::export_request* send_email(char* sender, char* recipient, const char* subject, const char* text, send_email_callback ev); + exporter::export_request* send_email(const char* sender, const char* recipient, const char* subject, const char* text, send_email_callback ev); }
\ No newline at end of file diff --git a/include/importer.hpp b/include/importer.hpp index 2360d29..b432b45 100644 --- a/include/importer.hpp +++ b/include/importer.hpp @@ -62,18 +62,18 @@ namespace importer { typedef struct { - char* provider_name; - char* default_model; - bool (*upload_file)(char* file_path, char* file_id, size_t file_id_len); - bool (*query_with_file)(const char* query, size_t query_length, char* file_id, char** response); - bool (*batch_query_with_file)(const char** queries, size_t query_count, char* file_id, invoice* buffer, batch_query_response_handler response_handler); + const char* provider_name; + const char* default_model; + bool (*upload_file)(const char* file_path, char* file_id, size_t file_id_len); + bool (*query_with_file)(const char* query, size_t query_length, const char* file_id, char** response); + bool (*batch_query_with_file)(const char** queries, size_t query_count, const char* file_id, invoice* buffer, batch_query_response_handler response_handler); bool (*get_available_models)(model_list_request* buffer); } ai_provider_impl; typedef struct { - char* provider_name; - bool (*send_email)(char* sender, char* recipient, const char* subject, const char* text); + const char* provider_name; + bool (*send_email)(const char* sender, const char* recipient, const char* subject, const char* text); } email_provider_impl; const char* error_to_string(i_err error); diff --git a/include/logger.hpp b/include/logger.hpp index 0f8d658..b37f343 100644 --- a/include/logger.hpp +++ b/include/logger.hpp @@ -41,7 +41,7 @@ namespace logger { void clear(); void aerr(a_err errors); - void info(const char* fmt, ...) IM_FMTARGS(2); - void error(const char* fmt, ...) IM_FMTARGS(2); + void info(const char* fmt, ...) IM_FMTARGS(1); + void error(const char* fmt, ...) IM_FMTARGS(1); }
\ No newline at end of file diff --git a/include/ui.hpp b/include/ui.hpp index 54d3e97..4636601 100644 --- a/include/ui.hpp +++ b/include/ui.hpp @@ -111,7 +111,7 @@ namespace ImGui void ProjectDropdown(char* project_id); void TaxRateDropdown(char* tax_internal_code, bool outgoing, bool has_error); bool CurrencyDropdown(char* currency); - void ToggleDropdown(bool *buffer, char* option1, char* option2); + void ToggleDropdown(bool *buffer, const char* option1, const char* option2); bool BeginExportDropdown(const char* title, const char* text, exporter::export_request* active_request); }
\ No newline at end of file diff --git a/libs/xml.c/src/xml.c b/libs/xml.c/src/xml.c index 0b435cd..4b8cb65 100644 --- a/libs/xml.c/src/xml.c +++ b/libs/xml.c/src/xml.c @@ -1147,7 +1147,7 @@ void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length) memcpy(buffer, string->buffer, length); } -s64 xml_get_s64(struct xml_node* root, char* child_name) +s64 xml_get_s64(struct xml_node* root, const char* child_name) { struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0); @@ -1163,7 +1163,7 @@ s64 xml_get_s64(struct xml_node* root, char* child_name) return num; } -s32 xml_get_s32(struct xml_node* root, char* child_name) +s32 xml_get_s32(struct xml_node* root, const char* child_name) { struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0); if (!node) return 0; @@ -1180,7 +1180,7 @@ s32 xml_get_s32(struct xml_node* root, char* child_name) return num; } -struct xml_node* xml_get_node_x(struct xml_node* root, char* child_name, ...) +struct xml_node* xml_get_node_x(struct xml_node* root, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); @@ -1189,7 +1189,7 @@ struct xml_node* xml_get_node_x(struct xml_node* root, char* child_name, ...) return node; } -char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, char* attribute_name, char* child_name, ...) +char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, const char* attribute_name, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); @@ -1217,7 +1217,7 @@ char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, return 0; } -s32 xml_get_s32_x(struct xml_node* root, char* child_name, ...) +s32 xml_get_s32_x(struct xml_node* root, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); @@ -1237,7 +1237,7 @@ s32 xml_get_s32_x(struct xml_node* root, char* child_name, ...) return num; } -float xml_get_float(struct xml_node* root, char* child_name) +float xml_get_float(struct xml_node* root, const char* child_name) { struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0); if (!node) return 0; @@ -1252,7 +1252,7 @@ float xml_get_float(struct xml_node* root, char* child_name) return val; } -float xml_get_float_x(struct xml_node* root, char* child_name, ...) +float xml_get_float_x(struct xml_node* root, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); @@ -1270,7 +1270,7 @@ float xml_get_float_x(struct xml_node* root, char* child_name, ...) return val; } -char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, char* child_name) +char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, const char* child_name) { struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0); if (!node) return 0; @@ -1283,7 +1283,7 @@ char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, char* chi return buffer; } -char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, char* child_name, ...) +char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); @@ -1300,7 +1300,7 @@ char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, char* c } #include <time.h> -time_t xml_get_date_x(struct xml_node* root, char* child_name, ...) +time_t xml_get_date_x(struct xml_node* root, const char* child_name, ...) { va_list arguments; va_start(arguments, child_name); diff --git a/libs/xml.c/src/xml.h b/libs/xml.c/src/xml.h index 43e7f0f..9997a76 100644 --- a/libs/xml.c/src/xml.h +++ b/libs/xml.c/src/xml.h @@ -202,16 +202,16 @@ void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length); #define u64 uint64_t /// Custom OpenBooks functions. -s64 xml_get_s64(struct xml_node* root, char* child_name); -s32 xml_get_s32(struct xml_node* root, char* child_name); -struct xml_node* xml_get_node_x(struct xml_node* root, char* child_name, ...); -char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, char* attribute_name, char* child_name, ...); -s32 xml_get_s32_x(struct xml_node* root, char* child_name, ...); -float xml_get_float(struct xml_node* root, char* child_name); -float xml_get_float_x(struct xml_node* root, char* child_name, ...); -char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, char* child_name); -char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, char* child_name, ...); -time_t xml_get_date_x(struct xml_node* root, char* child_name, ...); +s64 xml_get_s64(struct xml_node* root, const char* child_name); +s32 xml_get_s32(struct xml_node* root, const char* child_name); +struct xml_node* xml_get_node_x(struct xml_node* root, const char* child_name, ...); +char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, const char* attribute_name, const char* child_name, ...); +s32 xml_get_s32_x(struct xml_node* root, const char* child_name, ...); +float xml_get_float(struct xml_node* root, const char* child_name); +float xml_get_float_x(struct xml_node* root, const char* child_name, ...); +char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, const char* child_name); +char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, const char* child_name, ...); +time_t xml_get_date_x(struct xml_node* root, const char* child_name, ...); #ifdef __cplusplus diff --git a/run_linux64.sh b/run_linux64.sh index 7f87d6c..8d7cefc 100755 --- a/run_linux64.sh +++ b/run_linux64.sh @@ -11,7 +11,7 @@ SOURCES=$(find src -type f \( -name "*.cpp" \) ! -path "src/countries/*") # Compiler flags. LIBS="-lstdc++ -lglfw -lGL -lm -lssl -lcrypto" -FLAGS="-Wall -Wno-changes-meaning -Wno-write-strings -Wno-attributes -Wno-unused-variable -fpermissive -Wno-format-zero-length -ggdb" +FLAGS="-Wall -Wno-changes-meaning -ggdb -Wfatal-errors" DEFINITIONS="-D_DATE_=\"$DATE\"" INCLUDE_DIRS="-Ilibs/openssl-3.6.0-beta1/x64/include -Ilibs/ -Iinclude" diff --git a/src/administration.cpp b/src/administration.cpp index f69ae9d..3905c74 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -45,7 +45,7 @@ time_t administration::get_default_invoice_expire_duration() // TODO depricated } static void administration_recalculate_billing_item_totals(billing_item* item); -static char* get_default_currency_for_country(char* country_code); +static const char* get_default_currency_for_country(const char* country_code); static void create_default_cost_centers() { @@ -203,16 +203,16 @@ void administration::destroy() administration_destroy_list(&g_administration.cost_centers); } -void administration::create_from_file(char* save_file) +void administration::create_from_file(const char* save_file) { if (is_initialized) administration::destroy(); administration_create(); strops::copy(g_administration.path, save_file, sizeof(g_administration.path)); - strops::copy(g_administration.program_version, config::PROGRAM_VERSION, sizeof(g_administration.program_version)); + strops::copy(g_administration.program_version, PROGRAM_VERSION, sizeof(g_administration.program_version)); } -void administration::create_empty(char* save_file) +void administration::create_empty(const char* save_file) { if (is_initialized) administration::destroy(); administration_create(); @@ -221,11 +221,11 @@ void administration::create_empty(char* save_file) g_administration.next_sequence_number = 1; strops::copy(g_administration.path, save_file, sizeof(g_administration.path)); - strops::copy(g_administration.program_version, config::PROGRAM_VERSION, sizeof(g_administration.program_version)); + strops::copy(g_administration.program_version, PROGRAM_VERSION, sizeof(g_administration.program_version)); administration::company_info_set(administration::contact_create_empty()); } -void administration::create_default(char* save_file) +void administration::create_default(const char* save_file) { administration::create_empty(save_file); if (!strops::empty(save_file)) create_default_cost_centers(); @@ -291,12 +291,12 @@ bool administration::company_info_is_valid() return administration::contact_is_valid(g_administration.company_info) == A_ERR_SUCCESS; } -char* administration::get_default_currency() +const char* administration::get_default_currency() { return g_administration.default_currency; } -char* administration::get_currency_symbol_for_currency(char* code) +const char* administration::get_currency_symbol_for_currency(const char* code) { // Major European currencies if (strops::equals(code, "EUR")) return "€"; // Euro @@ -663,7 +663,7 @@ void administration::set_file_path(char* path) strops::copy(g_administration.path, path, MAX_LEN_PATH); } -char* administration::get_file_path() +const char* administration::get_file_path() { return strops::empty(g_administration.path) ? NULL : g_administration.path; } @@ -992,7 +992,7 @@ a_err administration::project_is_valid(project data) return A_ERR_SUCCESS; } -char* administration::project_get_status_string(project data) +const char* administration::project_get_status_string(project data) { switch(data.state) { @@ -1350,7 +1350,7 @@ a_err administration::cost_center_update(cost_center data) // Invoice functions. // ======================= -static char* get_default_currency_for_country(char* country_code) +static const char* get_default_currency_for_country(const char* country_code) { if (country_code == NULL || strops::length(country_code) != 2) return "EUR"; // default @@ -1763,7 +1763,7 @@ u32 administration::invoice_get_partial_list_incomming(u32 page_index, u32 page_ return invoice_get_partial_list(page_index, page_size, buffer, 0); } -char* administration::invoice_get_status_string(invoice* invoice) +const char* administration::invoice_get_status_string(invoice* invoice) { switch(invoice->extras.status) { @@ -1957,7 +1957,7 @@ a_err administration::activity_import(activity ac) return A_ERR_SUCCESS; } -a_err administration::activity_add(char* user, char* ref_id, char* message) +a_err administration::activity_add(const char* user, const char* ref_id, const char* message) { activity* new_activity = (activity*)memops::alloc(sizeof(activity)); strops::copy(new_activity->user_name, user, MAX_LEN_SHORT_DESC); diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp index e481c10..81f5b02 100644 --- a/src/administration_reader.cpp +++ b/src/administration_reader.cpp @@ -358,7 +358,7 @@ bool administration_reader::import_project(char* buffer, size_t buffer_size) a_err result = administration::project_import(data); if (result == A_ERR_SUCCESS) { - logger::info("Loaded project in %.3fms. id=%s description=%s state=%d started=%lld end=%lld", + logger::info("Loaded project in %.3fms. id=%s description=%s state=%d started=%ld end=%ld", STOPWATCH_TIME, data.id, data.description, data.state, data.start_date, data.end_date); } else { @@ -523,7 +523,6 @@ bool administration_reader::import_activities(char* buffer, size_t buffer_size) if (strops::equals(child_name, "Activity")) { activity ac = {0}; - time_t timestamp; ac.timestamp = xml_get_s64(child, "Timestamp"); xml_get_str(child, ac.user_name, MAX_LEN_SHORT_DESC, "User"); @@ -536,7 +535,7 @@ bool administration_reader::import_activities(char* buffer, size_t buffer_size) memops::unalloc(child_name); } - logger::info("Loaded %d activities in %.3fms.", child_count, STOPWATCH_TIME); + logger::info("Loaded %ld activities in %.3fms.", child_count, STOPWATCH_TIME); xml_document_free(document, false); return true; diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index e0a6ae7..ee0ccdb 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -919,7 +919,7 @@ bool administration_writer::save_administration_info_blocking() strops::replace_int32(file_content, buf_length, "{{NEXT_ID}}", administration::get_next_id()); strops::replace_int32(file_content, buf_length, "{{NEXT_SEQUENCE_NUMBER}}", administration::get_next_sequence_number()); - strops::replace(file_content, buf_length, "{{PROGRAM_VERSION}}", config::PROGRAM_VERSION); + strops::replace(file_content, buf_length, "{{PROGRAM_VERSION}}", PROGRAM_VERSION); ai_service active_ai_service = administration::get_active_ai_service(); strops::replace_int32(file_content, buf_length, "{{ACTIVE_AI_SERVICE_PROVIDER}}", (s32)active_ai_service.provider); diff --git a/src/countries.cpp b/src/countries.cpp index 5d1ea5a..5384889 100644 --- a/src/countries.cpp +++ b/src/countries.cpp @@ -258,7 +258,7 @@ bool country::is_enabled(const char* country_code) return country_map[index].enabled; } -time_t country::get_default_invoice_expire_duration(char* country_code) +time_t country::get_default_invoice_expire_duration(const char* country_code) { s32 index = get_index_by_country_code(country_code); if (index == -1) return 0; @@ -275,7 +275,7 @@ bool country::tax_is_implemented(const char* country_code) country_map[index].add_billing_item_to_tax_report && country_map[index].get_available_tax_rates; } -void country::fill_tax_report_with_categories(char* country_code, tax_report* report) +void country::fill_tax_report_with_categories(const char* country_code, tax_report* report) { s32 index = get_index_by_country_code(country_code); assert(index != -1); @@ -283,7 +283,7 @@ void country::fill_tax_report_with_categories(char* country_code, tax_report* re country_map[index].fill_tax_report_with_categories(report); } -bool country::add_billing_item_to_tax_report(char* country_code, tax_report* report, invoice* inv, billing_item* item) +bool country::add_billing_item_to_tax_report(const char* country_code, tax_report* report, invoice* inv, billing_item* item) { s32 index = get_index_by_country_code(country_code); assert(index != -1); @@ -291,7 +291,7 @@ bool country::add_billing_item_to_tax_report(char* country_code, tax_report* rep return country_map[index].add_billing_item_to_tax_report(report, inv, item); } -float country::calculate_tax_report_final(char* country_code, tax_report* report) +float country::calculate_tax_report_final(const char* country_code, tax_report* report) { s32 index = get_index_by_country_code(country_code); assert(index != -1); @@ -299,7 +299,7 @@ float country::calculate_tax_report_final(char* country_code, tax_report* report return country_map[index].calculate_tax_report_final(report); } -time_t country::get_invoice_date_to_use_for_tax_report(char* country_code, invoice* inv) +time_t country::get_invoice_date_to_use_for_tax_report(const char* country_code, invoice* inv) { s32 index = get_index_by_country_code(country_code); assert(index != -1); diff --git a/src/exporter.cpp b/src/exporter.cpp index 74c77c1..54d2b59 100644 --- a/src/exporter.cpp +++ b/src/exporter.cpp @@ -53,7 +53,7 @@ static int _send_email_t(void* arg) { return 0; } -exporter::export_request* exporter::send_email(char* sender, char* recipient, const char* subject, const char* text, send_email_callback ev) +exporter::export_request* exporter::send_email(const char* sender, const char* recipient, const char* subject, const char* text, send_email_callback ev) { exporter::export_request* result = (exporter::export_request*)memops::alloc(sizeof(exporter::export_request)); result->started_at = time(NULL); diff --git a/src/importer.cpp b/src/importer.cpp index fd3e90e..c3757ce 100644 --- a/src/importer.cpp +++ b/src/importer.cpp @@ -24,7 +24,6 @@ #include "memops.hpp" #include "locales.hpp" #include "importer.hpp" -#include "file_templates.hpp" #include "administration_reader.hpp" extern importer::ai_provider_impl _chatgpt_api_provider; diff --git a/src/main_windows.cpp b/src/main_windows.cpp deleted file mode 100644 index 47c9a42..0000000 --- a/src/main_windows.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/* -* Copyright (c) 2025 Aldrik Ramaekers <aldrik.ramaekers@gmail.com> -* -* Permission to use, copy, modify, and/or distribute this software for any -* purpose with or without fee is hereby granted, provided that the above -* copyright notice and this permission notice appear in all copies. -* -* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifdef win64 - -#include "imgui/imgui.h" -#include "imgui_impl_win32.h" -#include "imgui_impl_dx11.h" -#include <d3d11.h> -#include <tchar.h> -#include "timer_lib/timer.h" -#include "ui.hpp" -#include "administration.hpp" -#include "administration_writer.hpp" -#include "administration_reader.hpp" - -// Data -static HWND hwnd; -static ID3D11Device* g_pd3dDevice = nullptr; -static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr; -static IDXGISwapChain* g_pSwapChain = nullptr; -static bool g_SwapChainOccluded = false; -static UINT g_ResizeWidth = 0, g_ResizeHeight = 0; -static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr; - -// Forward declarations of helper functions -bool CreateDeviceD3D(HWND hWnd); -void CleanupDeviceD3D(); -void CreateRenderTarget(); -void CleanupRenderTarget(); -LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -void platorm_maximize_window() -{ - LONG style = GetWindowLong(hwnd, GWL_STYLE); - - // allow resizing + maximize - style |= (WS_THICKFRAME | WS_MAXIMIZEBOX); - - SetWindowLong(hwnd, GWL_STYLE, style); - - // Apply style changes - SetWindowPos(hwnd, NULL, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - ShowWindow(hwnd, SW_MAXIMIZE); -} - -// Main code -//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -int main(int argc, char** argv) -{ - int start_width = 1280; - int start_height = 800; - - // Make process DPI aware and obtain main monitor scale - ImGui_ImplWin32_EnableDpiAwareness(); - float main_scale = ImGui_ImplWin32_GetDpiScaleForMonitor(::MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY)); - - // Create application window - WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; - ::RegisterClassExW(&wc); - - // Get screen size - int screenW = GetSystemMetrics(SM_CXSCREEN); - int screenH = GetSystemMetrics(SM_CYSCREEN); - - // Calculate top-left so window is centered - int x = (screenW - start_width) / 2; - int y = (screenH - start_height) / 2; - - hwnd = ::CreateWindowW(wc.lpszClassName, L"OpenBooks", WS_OVERLAPPEDWINDOW, - x, y, (int)(start_width * main_scale), (int)(start_height * main_scale), nullptr, nullptr, wc.hInstance, nullptr); - - // Initialize Direct3D - if (!CreateDeviceD3D(hwnd)) - { - CleanupDeviceD3D(); - ::UnregisterClassW(wc.lpszClassName, wc.hInstance); - return 1; - } - - // Show the window - ::ShowWindow(hwnd, SW_SHOWDEFAULT); - ::UpdateWindow(hwnd); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - io.IniFilename = NULL; - io.LogFilename = NULL; - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsLight(); - - // Setup scaling - ImGuiStyle& style = ImGui::GetStyle(); - style.ScaleAllSizes(main_scale); // Bake a fixed style scale. (until we have a solution for dynamic style scaling, changing this requires resetting Style + calling this again) - style.FontScaleDpi = main_scale; // Set initial font scale. (using io.ConfigDpiScaleFonts=true makes this unnecessary. We leave both here for documentation purpose) - - // Setup Platform/Renderer backends - ImGui_ImplWin32_Init(hwnd); - ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - style.FontSizeBase = 18.0f; - //io.Fonts->AddFontDefault(); - io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf"); - //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\seguisym.ttf"); - ui::fontBold = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeuib.ttf"); - ui::fontBig = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeuib.ttf", 30); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf"); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf"); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf"); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf"); - //IM_ASSERT(font != nullptr); - - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - timer_lib_initialize(); - administration_writer::create(); - - if (argc < 2) { - administration::create_default(""); - } - else { - administration_reader::open_existing(argv[1]); - } - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle messages (inputs, window resize, etc.) - // See the WndProc() function below for our to dispatch events to the Win32 backend. - MSG msg; - while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) - { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - if (msg.message == WM_QUIT) - done = true; - } - if (done) - break; - - // Handle window being minimized or screen locked - if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) - { - ::Sleep(10); - continue; - } - g_SwapChainOccluded = false; - - // Handle window resize (we don't resize directly in the WM_SIZE handler) - if (g_ResizeWidth != 0 && g_ResizeHeight != 0) - { - CleanupRenderTarget(); - g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0); - g_ResizeWidth = g_ResizeHeight = 0; - CreateRenderTarget(); - } - - // Start the Dear ImGui frame - ImGui_ImplDX11_NewFrame(); - ImGui_ImplWin32_NewFrame(); - ImGui::NewFrame(); - - ui::draw_main(); - - // Rendering - ImGui::Render(); - const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); - g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); - ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - - // Present - HRESULT hr = g_pSwapChain->Present(1, 0); // Present with vsync - //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync - g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); - } - - administration_writer::destroy(); - timer_lib_shutdown(); - administration::destroy(); - - // Cleanup - ImGui_ImplDX11_Shutdown(); - ImGui_ImplWin32_Shutdown(); - ImGui::DestroyContext(); - - CleanupDeviceD3D(); - ::DestroyWindow(hwnd); - ::UnregisterClassW(wc.lpszClassName, wc.hInstance); - - return 0; -} - -// Helper functions - -bool CreateDeviceD3D(HWND hWnd) -{ - // Setup swap chain - DXGI_SWAP_CHAIN_DESC sd; - ZeroMemory(&sd, sizeof(sd)); - sd.BufferCount = 2; - sd.BufferDesc.Width = 0; - sd.BufferDesc.Height = 0; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferDesc.RefreshRate.Numerator = 60; - sd.BufferDesc.RefreshRate.Denominator = 1; - sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.OutputWindow = hWnd; - sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; - sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; - - UINT createDeviceFlags = 0; - //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; - D3D_FEATURE_LEVEL featureLevel; - const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; - HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); - if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. - res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); - if (res != S_OK) - return false; - - CreateRenderTarget(); - return true; -} - -void CleanupDeviceD3D() -{ - CleanupRenderTarget(); - if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } - if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; } - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } -} - -void CreateRenderTarget() -{ - ID3D11Texture2D* pBackBuffer; - g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); - g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); - pBackBuffer->Release(); -} - -void CleanupRenderTarget() -{ - if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } -} - -// Forward declare message handler from imgui_impl_win32.cpp -extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -// Win32 message handler -// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. -// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. -// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. -// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. -LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) - return true; - - switch (msg) - { - case WM_GETMINMAXINFO: - { - MINMAXINFO* minMaxInfo = (MINMAXINFO*)lParam; - minMaxInfo->ptMinTrackSize.x = 1400; // Minimum width - minMaxInfo->ptMinTrackSize.y = 900; // Minimum height - return 0; - } - - case WM_SIZE: - if (wParam == SIZE_MINIMIZED) - return 0; - g_ResizeWidth = (UINT)LOWORD(lParam); // Queue resize - g_ResizeHeight = (UINT)HIWORD(lParam); - return 0; - case WM_SYSCOMMAND: - if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu - return 0; - break; - case WM_DESTROY: - ::PostQuitMessage(0); - return 0; - } - return ::DefWindowProcW(hWnd, msg, wParam, lParam); -} - -#endif
\ No newline at end of file diff --git a/src/providers/DeepSeek.cpp b/src/providers/DeepSeek.cpp index 2fc73c9..7c695fb 100644 --- a/src/providers/DeepSeek.cpp +++ b/src/providers/DeepSeek.cpp @@ -25,7 +25,7 @@ #define QUERY_BUFFER_SIZE 1000000 char* query_buffer = 0; -static bool _DeepSeek_query_with_file(const char* query, size_t query_length, char* file_id, char** response) +static bool _DeepSeek_query_with_file(const char* query, size_t query_length, const char* file_id, char** response) { (void)file_id; (void)query_length; @@ -74,7 +74,7 @@ static bool _DeepSeek_query_with_file(const char* query, size_t query_length, ch return 1; } -static bool _DeepSeek_upload_file(char* file_path, char* file_id, size_t file_id_len) +static bool _DeepSeek_upload_file(const char* file_path, char* file_id, size_t file_id_len) { (void)file_id; (void)file_id_len; diff --git a/src/providers/MailerSend.cpp b/src/providers/MailerSend.cpp index ab07907..1758ac8 100644 --- a/src/providers/MailerSend.cpp +++ b/src/providers/MailerSend.cpp @@ -22,7 +22,7 @@ #include "logger.hpp" #include "exporter.hpp" -bool _MailerSend_send_email(char* sender, char* recipient, const char* subject, const char* text) +bool _MailerSend_send_email(const char* sender, const char* recipient, const char* subject, const char* text) { #if SIMULATE_EMAIL usleep(1000 * 1000); diff --git a/src/providers/openAI.cpp b/src/providers/openAI.cpp index 62a2ae8..c743711 100644 --- a/src/providers/openAI.cpp +++ b/src/providers/openAI.cpp @@ -24,7 +24,7 @@ #include "logger.hpp" #include "importer.hpp" -static bool _openAI_batch_query_with_file(const char** queries, size_t query_count, char* file_id, invoice* buffer, importer::batch_query_response_handler response_handler) +static bool _openAI_batch_query_with_file(const char** queries, size_t query_count, const char* file_id, invoice* buffer, importer::batch_query_response_handler response_handler) { const char *api_key = administration::get_active_ai_service().api_key_public; httplib::SSLClient cli("api.openai.com", 443); @@ -94,7 +94,7 @@ static bool _openAI_batch_query_with_file(const char** queries, size_t query_cou return 1; } -static bool _openAI_query_with_file(const char* query, size_t query_length, char* file_id, char** response) +static bool _openAI_query_with_file(const char* query, size_t query_length, const char* file_id, char** response) { const char *api_key = administration::get_active_ai_service().api_key_public; @@ -133,7 +133,7 @@ static bool _openAI_query_with_file(const char* query, size_t query_length, char return 1; } -static bool _openAI_upload_file(char* file_path, char* file_id, size_t file_id_len) +static bool _openAI_upload_file(const char* file_path, char* file_id, size_t file_id_len) { const char *api_key = administration::get_active_ai_service().api_key_public; const char *filename = strops::get_filename(file_path); diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp index b3fc748..568806a 100644 --- a/src/ui/imgui_extensions.cpp +++ b/src/ui/imgui_extensions.cpp @@ -702,7 +702,7 @@ namespace ImGui return result; } - void ToggleDropdown(bool *buffer, char* option1, char* option2) + void ToggleDropdown(bool *buffer, const char* option1, const char* option2) { const char* items[] = { option1, option2 }; diff --git a/src/ui/ui_earnings.cpp b/src/ui/ui_earnings.cpp index b93bd75..6bd3b98 100644 --- a/src/ui/ui_earnings.cpp +++ b/src/ui/ui_earnings.cpp @@ -62,7 +62,7 @@ void ui::draw_earnings() ImGui::Spacing(); - char* currency_symbol = administration::get_currency_symbol_for_currency(administration::get_default_currency()); + const char* currency_symbol = administration::get_currency_symbol_for_currency(administration::get_default_currency()); if (ImGui::BeginTable("QuarterlyResultsTable", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Hideable)) { @@ -104,10 +104,10 @@ void ui::draw_earnings() if (has_uncategorized_revenue || has_uncategorized_taxes || has_uncategorized_expenses) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::Text("(%s)", locale::get("statement.uncategorized")); - ImGui::TableSetColumnIndex(1); ImGui::Text(""); - ImGui::TableSetColumnIndex(2); ImGui::Text(""); - ImGui::TableSetColumnIndex(3); ImGui::Text(""); - ImGui::TableSetColumnIndex(4); ImGui::Text(""); + ImGui::TableSetColumnIndex(1); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(2); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(3); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(4); ImGui::TextUnformatted(""); } if (has_uncategorized_revenue) { @@ -148,10 +148,10 @@ void ui::draw_earnings() ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_DefaultOpen); - ImGui::TableSetColumnIndex(1); ImGui::Text(""); - ImGui::TableSetColumnIndex(2); ImGui::Text(""); - ImGui::TableSetColumnIndex(3); ImGui::Text(""); - ImGui::TableSetColumnIndex(4); ImGui::Text(""); + ImGui::TableSetColumnIndex(1); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(2); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(3); ImGui::TextUnformatted(""); + ImGui::TableSetColumnIndex(4); ImGui::TextUnformatted(""); if (!toggled) continue; diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index 1e74508..7c9f596 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -33,7 +33,6 @@ static importer::invoice_request* active_import_request = 0; static ui::view_state current_view_state = ui::view_state::LIST_ALL; static invoice active_invoice = {0}; -static invoice selected_for_removal = {0}; static const float sidepanel_width = 200.0f; static billing_item* invoice_items_buffer = 0; diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index 06f1456..49ee697 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -33,7 +33,6 @@ static u32 activity_count; static ui::view_state current_view_state = ui::view_state::LIST_ALL; static invoice active_invoice = {0}; -static invoice selected_for_removal = {0}; static const float sidepanel_width = 200.0f; static billing_item* invoice_items_buffer = 0; diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp index 0fff65d..5d74fa6 100644 --- a/src/ui/ui_main.cpp +++ b/src/ui/ui_main.cpp @@ -177,7 +177,7 @@ void ui::draw_main() ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoCollapse); - char* path = administration::get_file_path(); + const char* path = administration::get_file_path(); if (path == NULL) { ImGui::Text("%s: %s", locale::get("ui.workingOn"), locale::get("ui.unsavedProject")); } diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index c10ca26..854d065 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -264,7 +264,7 @@ static void draw_ai_service_ui() if (ImGui::CollapsingHeader(locale::get("settings.services.ai_service"))) { - char* ai_service_names[AI_PROVIDER_END]; + const char* ai_service_names[AI_PROVIDER_END]; for (u32 i = 0; i < AI_PROVIDER_END; i++) { ai_service_names[i] = importer::get_ai_provider_implementation((ai_provider)i).provider_name; } @@ -355,7 +355,7 @@ static void draw_email_service_ui() { if (ImGui::CollapsingHeader(locale::get("settings.services.email_service"))) { - char* email_service_names[EMAIL_PROVIDER_END]; + const char* email_service_names[EMAIL_PROVIDER_END]; for (u32 i = 0; i < EMAIL_PROVIDER_END; i++) { email_service_names[i] = exporter::get_email_provider_implementation((email_provider)i).provider_name; } diff --git a/src/ui/ui_setup.cpp b/src/ui/ui_setup.cpp index 069c336..6140d5a 100644 --- a/src/ui/ui_setup.cpp +++ b/src/ui/ui_setup.cpp @@ -84,7 +84,7 @@ void ui::draw_setup() } if (ImGui::Button(ICON_FA_FOLDER_PLUS " Create administration", ImVec2(area.x, 0))) { // @locale - if (administration_reader::open_existing(NULL)) { + if (administration_reader::open_new()) { ui::set_state(ui::main_state::UI_SETTINGS); ui::recreate_window_for_main_views(); } @@ -93,7 +93,7 @@ void ui::draw_setup() ImGui::PopStyleVar(); char version_txt[100]; - strops::format(version_txt, sizeof(version_txt), "VERSION: %s %s", config::PROGRAM_VERSION, _DATE_); + strops::format(version_txt, sizeof(version_txt), "VERSION: %s %s", PROGRAM_VERSION, _DATE_); textSize = ImGui::CalcTextSize(version_txt); ImGui::SetCursorPos(ImVec2(5, area.y)); diff --git a/src/ui/ui_tax.cpp b/src/ui/ui_tax.cpp index f4176a6..5280e2a 100644 --- a/src/ui/ui_tax.cpp +++ b/src/ui/ui_tax.cpp @@ -63,7 +63,7 @@ void ui::draw_tax_report() ImGui::Spacing(); - char* currency_symbol = administration::get_currency_symbol_for_currency(administration::get_default_currency()); + const char* currency_symbol = administration::get_currency_symbol_for_currency(administration::get_default_currency()); tax_report report = statement->reports[current_page]; if (ImGui::BeginTable("QuarterlyTaxTable", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Hideable)) @@ -110,7 +110,7 @@ void ui::draw_tax_report() #else ImGui::TableSetColumnIndex(2); if (line.show_net) ImGui::Text("%.2f %s", line.total_net, currency_symbol); - else ImGui::Text(""); + else ImGui::TextUnformatted(""); ImGui::TableSetColumnIndex(3); if (line.show_tax) { @@ -126,7 +126,7 @@ void ui::draw_tax_report() } } } - else ImGui::Text(""); + else ImGui::TextUnformatted(""); #endif if (bold) ImGui::PopFont(); diff --git a/tests/administration_rw_tests.cpp b/tests/administration_rw_tests.cpp index bbf7de5..2a009e4 100644 --- a/tests/administration_rw_tests.cpp +++ b/tests/administration_rw_tests.cpp @@ -144,7 +144,7 @@ TEST _administration_rw_info(void) next_id = administration::get_next_id(); next_sequence_number = administration::get_next_sequence_number(); - ai_service ss = {0}; + ai_service ss; ss.provider = AI_PROVIDER_OPENAI; strops::copy(ss.api_key_public, "123", sizeof(ss.api_key_public)); strops::copy(ss.model_name, "321", sizeof(ss.model_name)); diff --git a/tests/test_helper.cpp b/tests/test_helper.cpp index d9d2335..ada084b 100644 --- a/tests/test_helper.cpp +++ b/tests/test_helper.cpp @@ -10,10 +10,10 @@ #include "administration_reader.hpp" #include "administration_writer.hpp" -char* test_file_path = "build\\test.openbook"; -char* validation_file = "libs\\PEPPOL-EN16931-UBL.sch"; -char* result_file = "build\\invoice_report.xml"; -char* extract_dir = "build\\extracted"; +char* test_file_path = "build/test.openbook"; +char* validation_file = "libs/PEPPOL-EN16931-UBL.sch"; +char* result_file = "build/invoice_report.xml"; +char* extract_dir = "build/extracted"; static contact _create_nl_business() { @@ -177,7 +177,7 @@ static bool _test_peppol_file(char* id) zip_extract(test_file_path, extract_dir, 0, 0); char command[200]; - strops::format(command, 200, "java -jar libs\\schxslt-cli.jar -d %s\\%s.xml -s %s -o %s > NUL 2>&1", + strops::format(command, 200, "java -jar libs/schxslt-cli.jar -d %s/%s.xml -s %s -o %s > /dev/null 2>&1", extract_dir, id, validation_file, result_file); system(command); |
