summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-09-13 08:54:05 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-09-13 08:54:05 +0200
commitfb1ae39f1abe0dd0335489451e09a24e2336e606 (patch)
tree8bd482a824c11b67581679e6a445a39e11b607e7
parent5159a53e58cd4b3652ce6255856d50e15c275f80 (diff)
handle file saving through administration callbacks
-rw-r--r--docs/CHANGES.rst5
-rw-r--r--include/administration.hpp23
-rw-r--r--include/administration_reader.hpp3
-rw-r--r--include/administration_writer.hpp11
-rw-r--r--include/config.hpp1
-rw-r--r--src/administration.cpp109
-rw-r--r--src/administration_reader.cpp27
-rw-r--r--src/administration_writer.cpp55
-rw-r--r--src/ui/ui_contacts.cpp29
-rw-r--r--src/ui/ui_expenses.cpp22
-rw-r--r--src/ui/ui_invoices.cpp21
-rw-r--r--src/ui/ui_main.cpp5
-rw-r--r--src/ui/ui_projects.cpp12
-rw-r--r--src/ui/ui_settings.cpp30
-rw-r--r--src/ui/ui_start.cpp35
15 files changed, 234 insertions, 154 deletions
diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst
index 80d676e..d7ab498 100644
--- a/docs/CHANGES.rst
+++ b/docs/CHANGES.rst
@@ -24,8 +24,11 @@ v0.1 (master)
- Create/read/update contacts
- Create/read/update projects
+- Create/read/update invoices & expenses
- Create/read/update VAT rates
- Create/read/update cost centers
- Generate default VAT rates
- Generate default cost centers
-- Archive invoices in Peppol BIS 3.0 format. \ No newline at end of file
+- Reading & writing administration files
+- Archive invoices in Peppol BIS 3.0 format.
+- Quarterly income statement reports \ No newline at end of file
diff --git a/include/administration.hpp b/include/administration.hpp
index 9df4335..b971e2c 100644
--- a/include/administration.hpp
+++ b/include/administration.hpp
@@ -307,6 +307,15 @@ typedef struct
quarterly_report quarters[MAX_LEN_INCOME_STATEMENT_REPORT_QUARTERS];
} income_statement;
+// Administration callback functions.
+typedef void (*data_changed_event)();
+typedef void (*data_deleted_event)(char id[MAX_LEN_ID]);
+typedef void (*invoice_changed_event)(invoice* invoice);
+typedef void (*contact_changed_event)(contact* contact);
+typedef void (*taxbracket_changed_event)(country_tax_bracket* bracket);
+typedef void (*costcenter_changed_event)(cost_center* cost_center);
+typedef void (*project_changed_event)(project* project);
+
typedef struct
{
contact company_info; // Company info used for invoices. User cannot create invoices when this is empty/invalid.
@@ -333,9 +342,19 @@ void administration_create();
void administration_destroy();
void administration_create_empty(char* save_file);
+// Callback functions.
+// =======================
+void administration_set_data_changed_event_callback(data_changed_event ev);
+void administration_set_data_deleted_event_callback(data_deleted_event ev);
+void administration_set_invoice_changed_event_callback(invoice_changed_event ev);
+void administration_set_contact_changed_event_callback(contact_changed_event ev);
+void administration_set_taxbracket_changed_event_callback(taxbracket_changed_event ev);
+void administration_set_costcenter_changed_event_callback(costcenter_changed_event ev);
+void administration_set_project_changed_event_callback(project_changed_event ev);
+
// Other functions.
// =======================
-administration* administration_get();
+administration* administration_get(); // TODO get rid of this and make indivual getters and setters
char* administration_file_path_get();
contact administration_company_info_get();
void administration_company_info_set(contact data);
@@ -343,7 +362,7 @@ void administration_create_income_statement(income_statement* statement);
char* administration_get_currency_symbol_from_currency(char* code);
char* administration_get_default_currency();
bool administration_can_create_invoices();
-bool administration_is_loaded();
+bool administration_has_save_path();
// Contact functions.
// =======================
diff --git a/include/administration_reader.hpp b/include/administration_reader.hpp
new file mode 100644
index 0000000..528cc40
--- /dev/null
+++ b/include/administration_reader.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+bool administration_reader_open_new(); \ No newline at end of file
diff --git a/include/administration_writer.hpp b/include/administration_writer.hpp
index fa5f0db..317739f 100644
--- a/include/administration_writer.hpp
+++ b/include/administration_writer.hpp
@@ -4,18 +4,17 @@
#define ADMIN_FILE_INFO "info.xml"
+// Setup functions.
bool administration_writer_create();
void administration_writer_destroy();
+bool administration_writer_start_new();
+
+// Individual entity writing.
bool administration_writer_delete_entry(char* id);
-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);
+// Archiving functions.
bool administration_writer_save_all_administration_info_blocking();
bool administration_writer_save_all_tax_brackets_blocking();
bool administration_writer_save_all_cost_centers_blocking();
-
bool administration_writer_save_all_async(); \ No newline at end of file
diff --git a/include/config.hpp b/include/config.hpp
index 88fd041..a0f11c0 100644
--- a/include/config.hpp
+++ b/include/config.hpp
@@ -1,5 +1,6 @@
#pragma once
+// major.minor.patch
#define PROGRAM_VERSION "0.1.0"
#include "stdint.h"
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