diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/administration.cpp | 109 | ||||
| -rw-r--r-- | src/administration_reader.cpp | 27 | ||||
| -rw-r--r-- | src/administration_writer.cpp | 55 | ||||
| -rw-r--r-- | src/ui/ui_contacts.cpp | 29 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 22 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 21 | ||||
| -rw-r--r-- | src/ui/ui_main.cpp | 5 | ||||
| -rw-r--r-- | src/ui/ui_projects.cpp | 12 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 30 | ||||
| -rw-r--r-- | src/ui/ui_start.cpp | 35 |
10 files changed, 200 insertions, 145 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index d463cec..1684442 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -13,6 +13,14 @@ administration g_administration; +data_changed_event data_changed_event_callback = 0; +data_deleted_event data_deleted_event_callback = 0; +invoice_changed_event invoice_changed_event_callback = 0; +contact_changed_event contact_changed_event_callback = 0; +taxbracket_changed_event taxbracket_changed_event_callback = 0; +costcenter_changed_event costcenter_changed_event_callback = 0; +project_changed_event project_changed_event_callback = 0; + static s32 administration_create_id() { return g_administration.next_id; @@ -27,6 +35,8 @@ static s32 administration_create_id() memcpy(tb->category_code, _code, sizeof(tb->category_code));\ list_append(&g_administration.tax_brackets, tb);\ g_administration.next_id++;\ + if (taxbracket_changed_event_callback) taxbracket_changed_event_callback(tb);\ + if (data_changed_event_callback) data_changed_event_callback();\ } static int compare_tax_countries(const void *a, const void *b) @@ -267,6 +277,8 @@ static void administration_create_default_cost_centers() memcpy(tb->code, _code, sizeof(tb->code));\ list_append(&g_administration.cost_centers, tb);\ g_administration.next_id++;\ + if (costcenter_changed_event_callback) costcenter_changed_event_callback(tb);\ + if (data_changed_event_callback) data_changed_event_callback();\ } ADD_COSTCENTER("costcenter.general_expenses", "GENE"); @@ -392,6 +404,43 @@ static s32 administration_create_sequence_number() return g_administration.next_sequence_number; } +// Callback functions. +// ======================= +void administration_set_data_changed_event_callback(data_changed_event ev) +{ + data_changed_event_callback = ev; +} + +void administration_set_data_deleted_event_callback(data_deleted_event ev) +{ + data_deleted_event_callback = ev; +} + +void administration_set_invoice_changed_event_callback(invoice_changed_event ev) +{ + invoice_changed_event_callback = ev; +} + +void administration_set_contact_changed_event_callback(contact_changed_event ev) +{ + contact_changed_event_callback = ev; +} + +void administration_set_taxbracket_changed_event_callback(taxbracket_changed_event ev) +{ + taxbracket_changed_event_callback = ev; +} + +void administration_set_costcenter_changed_event_callback(costcenter_changed_event ev) +{ + costcenter_changed_event_callback = ev; +} + +void administration_set_project_changed_event_callback(project_changed_event ev) +{ + project_changed_event_callback = ev; +} + // Setup functions. // ======================= void administration_create_empty(char* save_file) @@ -419,8 +468,6 @@ void administration_create() list_init(&g_administration.tax_brackets); list_init(&g_administration.cost_centers); strops_copy(g_administration.path, "", sizeof(g_administration.path)); - strops_copy(g_administration.program_version, PROGRAM_VERSION, sizeof(g_administration.program_version)); - //administration_writer_save_all_async(); log_add("Setup took %.3fms.", STOPWATCH_TIME); } @@ -447,7 +494,7 @@ void administration_destroy() // Other functions. // ======================= -bool administration_is_loaded() +bool administration_has_save_path() { return strcmp(g_administration.path, "") != 0; } @@ -741,6 +788,9 @@ void administration_company_info_set(contact data) { g_administration.company_info = data; strops_copy(g_administration.default_currency, administration_get_default_currency_for_country(g_administration.company_info.address.country_code), MAX_LEN_CURRENCY); + + if (contact_changed_event_callback) contact_changed_event_callback(&data); + if (data_changed_event_callback) data_changed_event_callback(); } administration* administration_get() @@ -760,6 +810,9 @@ bool administration_contact_add(contact data) g_administration.next_id++; + if (contact_changed_event_callback) contact_changed_event_callback(new_contact); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } @@ -780,6 +833,10 @@ bool administration_contact_update(contact data) if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); + + if (contact_changed_event_callback) contact_changed_event_callback(c); + if (data_changed_event_callback) data_changed_event_callback(); + list_iterator_stop(&g_administration.contacts); return true; } @@ -795,9 +852,12 @@ bool administration_contact_remove(contact data) while (list_iterator_hasnext(&g_administration.contacts)) { contact* c = (contact *)list_iterator_next(&g_administration.contacts); - if (strcmp(c->id, data.id) == 0) { + if (strcmp(c->id, data.id) == 0) { list_iterator_stop(&g_administration.contacts); list_delete(&g_administration.contacts, c); + + if (data_deleted_event_callback) data_deleted_event_callback(c->id); + free(c); return true; } @@ -1023,6 +1083,9 @@ bool administration_project_add(project data) g_administration.next_id++; + if (project_changed_event_callback) project_changed_event_callback(new_project); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } @@ -1037,6 +1100,10 @@ bool administration_project_update(project data) if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); list_iterator_stop(&g_administration.projects); + + if (project_changed_event_callback) project_changed_event_callback(c); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } } @@ -1054,6 +1121,9 @@ bool administration_project_remove(project data) if (strcmp(c->id, data.id) == 0) { list_iterator_stop(&g_administration.projects); list_delete(&g_administration.projects, c); + + if (data_deleted_event_callback) data_deleted_event_callback(c->id); + free(c); return true; } @@ -1105,9 +1175,18 @@ u32 administration_tax_bracket_count() bool administration_tax_bracket_add(country_tax_bracket data) { - ADD_BRACKET(data.country_code, data.rate, ""); + country_tax_bracket* tb = (country_tax_bracket*)malloc(sizeof(country_tax_bracket)); + memcpy((void*)tb, (void*)&data, sizeof(country_tax_bracket)); + snprintf(tb->id, sizeof(tb->id), "T/%d", administration_create_id()); + + g_administration.next_id++; + list_attributes_comparator(&g_administration.tax_brackets, compare_tax_countries); list_sort(&g_administration.tax_brackets, -1); + + if (taxbracket_changed_event_callback) taxbracket_changed_event_callback(&data); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } @@ -1153,6 +1232,10 @@ bool administration_tax_bracket_update(country_tax_bracket data) if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); list_iterator_stop(&g_administration.tax_brackets); + + if (taxbracket_changed_event_callback) taxbracket_changed_event_callback(c); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } } @@ -1248,6 +1331,9 @@ bool administration_cost_center_add(cost_center data) g_administration.next_id++; + if (costcenter_changed_event_callback) costcenter_changed_event_callback(tb); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } @@ -1260,6 +1346,10 @@ bool administration_cost_center_update(cost_center data) if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); list_iterator_stop(&g_administration.cost_centers); + + if (costcenter_changed_event_callback) costcenter_changed_event_callback(c); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } } @@ -1377,6 +1467,8 @@ bool administration_invoice_remove(invoice* inv) list_iterator_stop(&g_administration.invoices); administration_destroy_list(&c->billing_items); list_delete(&g_administration.invoices, c); + + if (data_deleted_event_callback) data_deleted_event_callback(c->id); if (inv->is_outgoing) g_administration.invoice_count--; else g_administration.expense_count--; @@ -1476,6 +1568,10 @@ bool administration_invoice_update(invoice* inv) { memcpy(c, inv, sizeof(invoice)); list_iterator_stop(&g_administration.invoices); + + if (invoice_changed_event_callback) invoice_changed_event_callback(c); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } } @@ -1507,6 +1603,9 @@ bool administration_invoice_add(invoice* inv) if (inv->is_outgoing) g_administration.invoice_count++; else g_administration.expense_count++; + if (invoice_changed_event_callback) invoice_changed_event_callback(new_inv); + if (data_changed_event_callback) data_changed_event_callback(); + return true; } diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp new file mode 100644 index 0000000..150c045 --- /dev/null +++ b/src/administration_reader.cpp @@ -0,0 +1,27 @@ +#include <zip.h> +#include <xml.h> +#include <stdlib.h> +#include <threads.h> + +#include "log.hpp" +#include "ui.hpp" +#include "strops.hpp" +#include "administration_writer.hpp" +#include "tinyfiledialogs.h" + +bool administration_reader_open_new() +{ + // @localize + char const * lFilterPatterns[1] = { "*.openbook" }; + char* save_path = tinyfd_saveFileDialog("Select destination", NULL, 1, lFilterPatterns, NULL); + + if (!save_path) return false; + + administration_create_empty(save_path); + + //administration_writer_save_all_cost_centers_blocking(); + //administration_writer_save_all_tax_brackets_blocking(); + //administration_writer_save_all_administration_info_blocking(); + + return true; +} diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index 3dd6e3f..70a18bc 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -9,12 +9,62 @@ #include "ui.hpp" #include "strops.hpp" #include "administration_writer.hpp" +#include "tinyfiledialogs.h" #include "file_templates.hpp" mtx_t _save_file_mutex; +bool administration_writer_save_project_blocking(project project); +bool administration_writer_save_cost_center_blocking(cost_center cost); +bool administration_writer_save_tax_bracket_blocking(country_tax_bracket bracket); +bool administration_writer_save_contact_blocking(contact c); +bool administration_writer_save_invoice_blocking(invoice inv); + +static void on_administration_data_changed() +{ + administration_writer_save_all_administration_info_blocking(); +} + +static void on_administration_data_deleted(char id[MAX_LEN_ID]) +{ + administration_writer_delete_entry(id); +} + +static void on_invoice_changed(invoice* invoice) +{ + administration_writer_save_invoice_blocking(*invoice); +} + +static void on_contact_changed_changed(contact* contact) +{ + administration_writer_save_contact_blocking(*contact); +} + +static void on_taxbracket_changed_changed(country_tax_bracket* bracket) +{ + administration_writer_save_tax_bracket_blocking(*bracket); +} + +static void on_costcenter_changed_changed(cost_center* cost_center) +{ + administration_writer_save_cost_center_blocking(*cost_center); +} + +static void on_project_changed_changed(project* project) +{ + administration_writer_save_project_blocking(*project); +} + bool administration_writer_create() { + administration_set_data_changed_event_callback(on_administration_data_changed); + administration_set_data_deleted_event_callback(on_administration_data_deleted); + administration_set_invoice_changed_event_callback(on_invoice_changed); + administration_set_contact_changed_event_callback(on_contact_changed_changed); + administration_set_taxbracket_changed_event_callback(on_taxbracket_changed_changed); + administration_set_costcenter_changed_event_callback(on_costcenter_changed_changed); + administration_set_project_changed_event_callback(on_project_changed_changed); + return mtx_init(&_save_file_mutex, mtx_plain) == thrd_success; } @@ -54,6 +104,8 @@ static bool administration_writer_entry_exists(char* entry) bool administration_writer_delete_entry(char* id) { + STOPWATCH_START; + bool result = 1; struct zip_t *zip_write = zip_open(administration_file_path_get(), 0, 'a'); if (!zip_write) zip_write = zip_open(administration_file_path_get(), 0, 'w'); @@ -64,6 +116,9 @@ bool administration_writer_delete_entry(char* id) char* indices[1] = {final_path}; if (zip_entries_delete(zip_write, indices, 1) < 0) result = 0; zip_close(zip_write); + + log_add("Deleted entry '%s' in %.3fms.", id, STOPWATCH_TIME); + return result; } diff --git a/src/ui/ui_contacts.cpp b/src/ui/ui_contacts.cpp index e1e9d5e..ed770d9 100644 --- a/src/ui/ui_contacts.cpp +++ b/src/ui/ui_contacts.cpp @@ -275,14 +275,7 @@ static void draw_contact_list() ImGui::Separator(); if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { - if (administration_contact_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")); - } - } + administration_contact_remove(selected_for_removal); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); @@ -309,15 +302,7 @@ static void ui_draw_contacts_create() // Save button ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { - if (administration_contact_add(active_contact)) { - if (administration_writer_save_contact_blocking(active_contact)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } - } - + administration_contact_add(active_contact); current_view_state = view_state::LIST; } if (!can_save) ImGui::EndDisabled(); @@ -336,15 +321,7 @@ static void ui_draw_contacts_update() // Save button ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { - if (administration_contact_update(active_contact)) { - if (administration_writer_save_contact_blocking(active_contact)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } - } - + administration_contact_update(active_contact); current_view_state = view_state::LIST; } if (!can_save) ImGui::EndDisabled(); diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index 6c02a74..808d7fb 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -455,15 +455,7 @@ static void ui_draw_expenses_list() ImGui::Separator(); if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { - 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")); - } - } - + administration_invoice_remove(&selected_for_removal); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); @@ -492,12 +484,6 @@ static void ui_draw_expense_update() ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { administration_invoice_update(&active_invoice); - if (administration_writer_save_invoice_blocking(active_invoice)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } current_view_state = view_state::LIST; @@ -522,12 +508,6 @@ static void ui_draw_expense_create() ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { administration_invoice_add(&active_invoice); - if (administration_writer_save_invoice_blocking(active_invoice)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } current_view_state = view_state::LIST; diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index 146d298..75f46b3 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -488,14 +488,7 @@ static void ui_draw_invoices_list() ImGui::Separator(); if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { - 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")); - } - } + administration_invoice_remove(&selected_for_removal); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); @@ -524,12 +517,6 @@ static void ui_draw_invoice_update() ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { administration_invoice_update(&active_invoice); - if (administration_writer_save_invoice_blocking(active_invoice)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } current_view_state = view_state::LIST; @@ -554,12 +541,6 @@ static void ui_draw_invoice_create() ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { administration_invoice_add(&active_invoice); - if (administration_writer_save_invoice_blocking(active_invoice)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } current_view_state = view_state::LIST; diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp index bc02243..b245d88 100644 --- a/src/ui/ui_main.cpp +++ b/src/ui/ui_main.cpp @@ -4,6 +4,7 @@ #include "locales.hpp" #include "tinyfiledialogs.h" #include "administration_writer.hpp" +#include "administration_reader.hpp" static main_state ui_state = main_state::UI_END; void (*drawcalls[main_state::UI_END])(void) = { @@ -49,8 +50,6 @@ void ui_set_state(main_state state) if (setupcalls[ui_state]) setupcalls[ui_state](); } -void create_new_administration(); - void ui_draw_main() { if (ui_state == main_state::UI_END) ui_set_state(main_state::UI_START); @@ -60,7 +59,7 @@ void ui_draw_main() { if (ImGui::BeginMenu("File")) { - if (ImGui::MenuItem("New")) { create_new_administration(); } + if (ImGui::MenuItem("New")) { administration_reader_open_new(); } if (ImGui::MenuItem("Open")) { /* Handle Save */ } ImGui::EndMenu(); diff --git a/src/ui/ui_projects.cpp b/src/ui/ui_projects.cpp index d736cf5..065e828 100644 --- a/src/ui/ui_projects.cpp +++ b/src/ui/ui_projects.cpp @@ -54,22 +54,10 @@ static void draw_project_form() if (ImGui::Button(localize("form.save"))) { if (current_view_state == view_state::CREATE) { administration_project_add(active_project); - if (administration_writer_save_project_blocking(active_project)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } } else if (current_view_state == view_state::EDIT) { administration_project_update(active_project); - if (administration_writer_save_project_blocking(active_project)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } } current_view_state = view_state::LIST; diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 77d2a45..ae05b1a 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -131,12 +131,6 @@ static void ui_draw_vat_rates() is_adding_item = false; administration_tax_bracket_update(new_tax_bracket); - if (administration_writer_save_tax_bracket_blocking(new_tax_bracket)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } ui_destroy_settings(); ui_setup_settings(); @@ -183,12 +177,6 @@ static void ui_draw_vat_rates() is_adding_item = false; administration_tax_bracket_add(new_tax_bracket); - if (administration_writer_save_tax_bracket_blocking(new_tax_bracket)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } ui_destroy_settings(); ui_setup_settings(); @@ -245,12 +233,6 @@ static void ui_draw_cost_centers() is_adding_item = false; administration_cost_center_update(new_cost_center); - if (administration_writer_save_cost_center_blocking(new_cost_center)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } memset(&new_cost_center, 0, sizeof(new_cost_center)); @@ -306,12 +288,6 @@ static void ui_draw_cost_centers() is_adding_item = false; is_editing_item = false; administration_cost_center_add(new_cost_center); - if (administration_writer_save_cost_center_blocking(new_cost_center)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } ui_destroy_settings(); ui_setup_settings(); @@ -353,12 +329,6 @@ void ui_draw_settings() ImGui::Spacing(); if (ImGui::Button(localize("form.save"))) { administration_company_info_set(company_info); - if (administration_writer_save_contact_blocking(company_info)) { - ui_set_status(localize("status.saved")); - } - else { - ui_set_status_error(localize("status.saveFailed")); - } } if (!can_save) ImGui::EndDisabled(); diff --git a/src/ui/ui_start.cpp b/src/ui/ui_start.cpp index f1377ec..dd7b54d 100644 --- a/src/ui/ui_start.cpp +++ b/src/ui/ui_start.cpp @@ -4,47 +4,26 @@ #include "locales.hpp" #include "tinyfiledialogs.h" #include "administration_writer.hpp" - -void create_new_administration() -{ - // @localize - char const * lFilterPatterns[1] = { "*.openbook" }; - char* save_path = tinyfd_saveFileDialog("Select destination", NULL, 1, lFilterPatterns, NULL); - - if (!save_path) return; - - administration_create_empty(save_path); - - administration_writer_save_all_cost_centers_blocking(); - administration_writer_save_all_tax_brackets_blocking(); - administration_writer_save_all_administration_info_blocking(); - - ui_set_state(main_state::UI_SETTINGS); -} +#include "administration_reader.hpp" void ui_draw_start() { - // Get the window size ImVec2 windowSize = ImGui::GetContentRegionAvail(); - - // Calculate half the width for each button ImVec2 buttonSize(windowSize.x * 0.5f, windowSize.y); - ImGui::Columns(2, nullptr, false); // 2 columns, no border - - // Left button + ImGui::Columns(2, nullptr, false); if (ImGui::Button("Create", buttonSize)) { - create_new_administration(); + if (administration_reader_open_new()) { + ui_set_state(main_state::UI_SETTINGS); + } } ImGui::NextColumn(); - - // Right button if (ImGui::Button("Load", buttonSize)) { - // Handle Load action + } - ImGui::Columns(1); // Reset columns + ImGui::Columns(1); }
\ No newline at end of file |
