summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@mailbox.org>2026-01-03 15:38:13 +0100
committerAldrik Ramaekers <aldrik@mailbox.org>2026-01-03 15:38:13 +0100
commit66a918a4621f1ecb828e68eac94fdb34852e9570 (patch)
tree48a4bd4b3545a8379ffb74cd79b03243dcb4629f
parent83a9739b3aff75cf767db687bd531fa5283e0e72 (diff)
ui improvements
-rw-r--r--TODO5
-rw-r--r--include/config.hpp2
-rw-r--r--src/administration.cpp2
-rw-r--r--src/ui/ui_earnings.cpp2
-rw-r--r--src/ui/ui_expenses.cpp3
-rw-r--r--src/ui/ui_invoices.cpp3
-rw-r--r--src/ui/ui_main.cpp43
-rw-r--r--src/ui/ui_settings.cpp9
-rw-r--r--src/ui/ui_tax.cpp2
9 files changed, 51 insertions, 20 deletions
diff --git a/TODO b/TODO
index b3908a8..13b66da 100644
--- a/TODO
+++ b/TODO
@@ -2,16 +2,17 @@ TODO:
Fix:
- When reloading view, lock main thread as the freeing might cause a crash
-- reload invoice when backing out of edit mode. Unsaved changed are not undone atm.
+- reload invoice when backing out of edit mode. Unsaved changed are not undone atm
Refactor:
-- Refactor zip writing to be faster
+- Refactor zip writing to be faster (Windows is slow)
Testing:
- write tests for strops.hpp
- write tests that check error handling for corrupt files. (e.g. references to tax rates, project and cost center that failed to load)
Features:
+- Refactor contact and project UI to be like invoice & expenses
- Timeline for invoice modifications (e.g. edited, status changed, paid)
- When creating a new openbooks file, user should only be able to set company info before anything else.
- Show AI balance available in settings page
diff --git a/include/config.hpp b/include/config.hpp
index defb972..75932fd 100644
--- a/include/config.hpp
+++ b/include/config.hpp
@@ -30,7 +30,7 @@
#define u64 uint64_t
#define SIMULATE_EMAIL 1
-#define SIMULATE_SLOW_DISK 1
+#define SIMULATE_SLOW_DISK 0
#define SIMULATE_WRITE_FAILURE 0
namespace config {
diff --git a/src/administration.cpp b/src/administration.cpp
index 6e7d2f1..44438ff 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -227,7 +227,7 @@ void administration::create_empty(char* save_file)
void administration::create_default(char* save_file)
{
administration::create_empty(save_file);
- create_default_cost_centers();
+ if (!strops::empty(save_file)) create_default_cost_centers();
}
// Other functions.
diff --git a/src/ui/ui_earnings.cpp b/src/ui/ui_earnings.cpp
index cb6c848..afe0210 100644
--- a/src/ui/ui_earnings.cpp
+++ b/src/ui/ui_earnings.cpp
@@ -32,6 +32,8 @@ void ui::setup_earnings()
void ui::destroy_earnings()
{
memops::unalloc(statement);
+
+ statement = 0;
}
void ui::draw_earnings()
diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp
index 7f8d1cc..45a0646 100644
--- a/src/ui/ui_expenses.cpp
+++ b/src/ui/ui_expenses.cpp
@@ -54,6 +54,9 @@ void ui::destroy_expenses()
{
memops::unalloc(invoice_items_buffer);
memops::unalloc(activity_buffer);
+
+ invoice_items_buffer = 0;
+ activity_buffer = 0;
}
void ui::setup_expenses()
diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp
index 519544b..e9af66e 100644
--- a/src/ui/ui_invoices.cpp
+++ b/src/ui/ui_invoices.cpp
@@ -52,6 +52,9 @@ void ui::destroy_invoices()
{
memops::unalloc(invoice_items_buffer);
memops::unalloc(activity_buffer);
+
+ invoice_items_buffer = 0;
+ activity_buffer = 0;
}
void ui::setup_invoices()
diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp
index 67d678f..dde0882 100644
--- a/src/ui/ui_main.cpp
+++ b/src/ui/ui_main.cpp
@@ -71,8 +71,14 @@ void ui::draw_main()
{
if (ImGui::BeginMenu(locale::get("ui.menu.file")))
{
- if (ImGui::MenuItem(locale::get("ui.menu.file.new"))) { administration_reader::open_new(); }
- if (ImGui::MenuItem(locale::get("ui.menu.file.open"))) { administration_reader::open_existing(NULL); }
+ if (ImGui::MenuItem(locale::get("ui.menu.file.new"))) {
+ administration_reader::open_new();
+ ui::set_state(ui::main_state::UI_SETTINGS);
+ }
+ if (ImGui::MenuItem(locale::get("ui.menu.file.open"))) {
+ administration_reader::open_existing(NULL);
+ ui::set_state(ui::main_state::UI_SETTINGS);
+ }
ImGui::EndMenu();
}
@@ -105,21 +111,26 @@ void ui::draw_main()
float buttonWidth = sidePanelWidth;
- if (ImGui::Button(locale::get("nav.invoices"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_INVOICES);
- if (ImGui::Button(locale::get("nav.expenses"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_EXPENSES);
- if (ImGui::Button(locale::get("nav.contacts"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_CONTACTS);
-
- static bool reports_opened = true;
- ImGui::Button(locale::get("nav.reports"), ImVec2(buttonWidth, 24));
- if (reports_opened)
- {
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(20.0f, 0.0f));
- if (ImGui::Button(locale::get("nav.reports.results"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_REPORT_RESULTS);
- if (ImGui::Button(locale::get("nav.reports.tax"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_REPORT_TAX);
- ImGui::PopStyleVar();
+ if (administration::company_info_is_valid()) {
+ if (ImGui::Button(locale::get("nav.invoices"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_INVOICES);
+ if (ImGui::Button(locale::get("nav.expenses"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_EXPENSES);
+ if (ImGui::Button(locale::get("nav.contacts"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_CONTACTS);
+
+ static bool reports_opened = true;
+ ImGui::Button(locale::get("nav.reports"), ImVec2(buttonWidth, 24));
+ if (reports_opened)
+ {
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(20.0f, 0.0f));
+ if (ImGui::Button(locale::get("nav.reports.results"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_REPORT_RESULTS);
+ if (ImGui::Button(locale::get("nav.reports.tax"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_REPORT_TAX);
+ ImGui::PopStyleVar();
+ }
+
+ if (ImGui::Button(locale::get("nav.projects"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_PROJECTS);
+ }
+ else {
+ if (ui_state != ui::main_state::UI_SETTINGS) ui::set_state(ui::main_state::UI_SETTINGS);
}
-
- if (ImGui::Button(locale::get("nav.projects"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_PROJECTS);
if (ImGui::Button(locale::get("nav.settings"), ImVec2(buttonWidth, 24))) ui::set_state(ui::main_state::UI_SETTINGS);
ImGui::PopStyleColor(1);
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index d41affa..0d3a210 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -24,6 +24,7 @@
#include "countries.hpp"
#include "administration.hpp"
#include "administration_writer.hpp"
+#include "administration_reader.hpp"
static contact company_info;
@@ -41,6 +42,9 @@ void ui::destroy_settings()
{
memops::unalloc(tax_rates);
memops::unalloc(cost_centers);
+
+ tax_rates = 0;
+ cost_centers = 0;
}
void ui::setup_settings()
@@ -394,6 +398,11 @@ void ui::draw_settings()
if (!can_save) ImGui::BeginDisabled();
ImGui::Spacing();
if (ImGui::Button(locale::get("form.save"), true)) {
+
+ if (administration::get_file_path() == NULL) {
+ administration_reader::open_new();
+ }
+
administration_writer::set_write_completed_event_callback(_write_company_info_callback);
administration::company_info_set(company_info);
}
diff --git a/src/ui/ui_tax.cpp b/src/ui/ui_tax.cpp
index a89bd7a..1b1e374 100644
--- a/src/ui/ui_tax.cpp
+++ b/src/ui/ui_tax.cpp
@@ -33,6 +33,8 @@ void ui::setup_tax_report()
void ui::destroy_tax_report()
{
memops::unalloc(statement);
+
+ statement = 0;
}
void ui::draw_tax_report()