summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/administration_writer.cpp39
-rw-r--r--src/ui/imgui_extensions.cpp65
-rw-r--r--src/ui/ui_expenses.cpp4
-rw-r--r--src/ui/ui_invoices.cpp14
-rw-r--r--src/ui/ui_settings.cpp8
5 files changed, 102 insertions, 28 deletions
diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp
index ef604b1..8304e5c 100644
--- a/src/administration_writer.cpp
+++ b/src/administration_writer.cpp
@@ -32,12 +32,19 @@
static mtx_t _save_file_mutex;
static bool _is_writing = false;
static write_completed_event _write_completed_ev = 0;
+static bool _last_write_result = false;
bool administration_writer::is_writing()
{
return _is_writing;
}
+bool administration_writer::last_write_result()
+{
+ return _last_write_result;
+}
+
+
void administration_writer::set_write_completed_event_callback(write_completed_event ev)
{
_write_completed_ev = ev;
@@ -48,7 +55,7 @@ static void on_administration_data_changed()
_is_writing = true;
auto* func = new auto([]() {
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::save_administration_info_blocking();
_is_writing = false;
if (_write_completed_ev) _write_completed_ev();
@@ -71,8 +78,8 @@ static void on_administration_data_deleted(char id[MAX_LEN_ID])
auto* func = new auto([](void* arg) {
char* id = (char*)arg;
- administration_writer::delete_entry(id);
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::delete_entry(id);
+ _last_write_result = administration_writer::save_administration_info_blocking();
memops::unalloc(arg);
_is_writing = false;
@@ -97,8 +104,8 @@ static void on_invoice_changed(invoice* inv)
auto* func = new auto([](void* arg) {
invoice* inv = (invoice*)arg;
- administration_writer::save_invoice_blocking(*inv);
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::save_invoice_blocking(*inv);
+ _last_write_result = administration_writer::save_administration_info_blocking();
administration::invoice_destroy(inv);
_is_writing = false;
@@ -122,8 +129,8 @@ static void on_contact_changed_changed(contact* cc)
auto* func = new auto([](void* arg) {
contact* cc = (contact*)arg;
- administration_writer::save_contact_blocking(*cc);
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::save_contact_blocking(*cc);
+ _last_write_result = administration_writer::save_administration_info_blocking();
memops::unalloc(arg);
_is_writing = false;
@@ -147,8 +154,8 @@ static void on_taxrate_changed_changed(tax_rate* rate)
auto* func = new auto([](void* arg) {
tax_rate* rate = (tax_rate*)arg;
- administration_writer::save_tax_rate_blocking(*rate);
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::save_tax_rate_blocking(*rate);
+ _last_write_result = administration_writer::save_administration_info_blocking();
memops::unalloc(arg);
_is_writing = false;
@@ -172,7 +179,7 @@ static void on_costcenter_changed_changed(cost_center* cc)
auto* func = new auto([](void* arg) {
cost_center* cc = (cost_center*)arg;
- administration_writer::save_cost_center_blocking(*cc);
+ _last_write_result = administration_writer::save_cost_center_blocking(*cc);
memops::unalloc(arg);
_is_writing = false;
@@ -196,8 +203,8 @@ static void on_project_changed_changed(project* pp)
auto* func = new auto([](void* arg) {
project* pp = (project*)arg;
- administration_writer::save_project_blocking(*pp);
- administration_writer::save_administration_info_blocking();
+ _last_write_result = administration_writer::save_project_blocking(*pp);
+ _last_write_result = administration_writer::save_administration_info_blocking();
memops::unalloc(arg);
_is_writing = false;
@@ -287,6 +294,10 @@ bool administration_writer::delete_entry(const char* id)
static bool write_to_zip(const char* entry_to_replace, char* orig_content, int final_length)
{
+ #if SIMULATE_WRITE_FAILURE
+ return 0;
+ #endif
+
mtx_lock(&_save_file_mutex);
bool result = 1;
@@ -302,9 +313,9 @@ static bool write_to_zip(const char* entry_to_replace, char* orig_content, int f
zip_close(zip_write);
- #if WRITE_DELAY_SEC != 0
+ #if SIMULATE_SLOW_DISK
struct timespec time;
- time.tv_sec = WRITE_DELAY_SEC;
+ time.tv_sec = 1;
time.tv_nsec = 0;
thrd_sleep(&time, NULL);
#endif
diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp
index 05eeb7b..8673f53 100644
--- a/src/ui/imgui_extensions.cpp
+++ b/src/ui/imgui_extensions.cpp
@@ -60,12 +60,19 @@ namespace ImGui
bool Button(const char* label, bool block_while_writing_to_disk, bool show_loading_indicator_while_blocked)
{
+ ImGui::PushID(label);
+
+ ImGuiID id = ImGui::GetID(label);
+ static ImGuiID active_id = -1;
+ static bool show_status = false;
+ static double status_time;
+
if (block_while_writing_to_disk)
{
if (administration_writer::is_writing())
{
- if (show_loading_indicator_while_blocked) {
- ImGui::PushID(label);
+ // Only show indicator on activated button.
+ if (show_loading_indicator_while_blocked && active_id == id) {
ImGui::BeginDisabled();
bool result = ImGui::Button("", CalcButtonSize(label));
@@ -82,12 +89,12 @@ namespace ImGui
const ImVec4 bg = ImGui::GetStyleColorVec4(ImGuiCol_Button);
ImGui::LoadingIndicatorCircle(radius, bg, col, 6, 4.0f);
ImGui::EndDisabled();
- ImGui::PopID();
ImGui::SetCursorScreenPos(oldPos);
ImGui::SameLine();
ImGui::Dummy(ImVec2(0, 0));
+ ImGui::PopID();
return result;
}
else
@@ -95,16 +102,66 @@ namespace ImGui
ImGui::BeginDisabled();
bool result = ImGui::Button(label);
ImGui::EndDisabled();
+ ImGui::PopID();
return result;
}
}
else
{
- return ImGui::Button(label);
+ bool result = false;
+
+ if (active_id == id && !show_status) {
+ show_status = true;
+ status_time = ImGui::GetTime();
+ }
+
+ if (active_id == id && show_status) {
+ ImGui::BeginDisabled();
+
+ ImGuiStyle& style = ImGui::GetStyle();
+ ImVec2 framePadding = style.FramePadding;
+ ImVec2 textSize = ImGui::CalcTextSize(label, 0, true);
+ float padding = framePadding.x; // Adjust based on your design
+ float buttonWidth = textSize.x + 2 * padding;
+
+ if (administration_writer::last_write_result())
+ {
+ ImGui::PushStyleColor(ImGuiCol_Text, config::colors::COLOR_SUCCESS);
+ result = ImGui::Button("√", ImVec2(buttonWidth, 0));
+ ImGui::PopStyleColor();
+ }
+ else
+ {
+ ImGui::PushStyleColor(ImGuiCol_Text, config::colors::COLOR_ERROR);
+ result = ImGui::Button("X", ImVec2(buttonWidth, 0));
+ ImGui::PopStyleColor();
+ }
+
+
+ ImGui::EndDisabled();
+ ImGui::PopID();
+
+ if (ImGui::GetTime() - status_time > 1.0) {
+ show_status = false;
+ active_id = -1;
+ }
+
+ return result;
+ }
+ else {
+ bool result = ImGui::Button(label);
+ if (result) {
+ active_id = id;
+ show_status = false;
+ }
+ ImGui::PopID();
+ return result;
+ }
}
}
else
{
+ ImGui::PopID();
return ImGui::Button(label);
}
}
diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp
index 3ea31e1..82d7426 100644
--- a/src/ui/ui_expenses.cpp
+++ b/src/ui/ui_expenses.cpp
@@ -37,7 +37,7 @@ static invoice selected_for_removal = {0};
static const float sidepanel_width = 200.0f;
static billing_item* invoice_items_buffer = 0;
-void draw_invoice_items_form(invoice* invoice, bool outgoing = true);
+void draw_invoice_items_form(invoice* invoice, bool outgoing = true, bool viewing_only = false);
static void _reload_activities()
{
@@ -153,7 +153,7 @@ static void draw_expense_form(invoice* buffer, bool viewing_only = false)
administration::invoice_set_currency(buffer, buffer->currency);
}
- draw_invoice_items_form(buffer, false);
+ draw_invoice_items_form(buffer, false, viewing_only);
if (viewing_only) ImGui::EndDisabled();
}
diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp
index eb04af4..3e48d00 100644
--- a/src/ui/ui_invoices.cpp
+++ b/src/ui/ui_invoices.cpp
@@ -65,7 +65,7 @@ void ui::setup_invoices()
invoice_items_buffer = (billing_item*)memops::alloc(sizeof(billing_item) * invoice_items_count);
}
-void draw_invoice_items_form(invoice* invoice, bool outgoing)
+void draw_invoice_items_form(invoice* invoice, bool outgoing, bool viewing_only = false)
{
billing_item* buffer = invoice_items_buffer;
u32 invoice_items = administration::billing_item_get_all_for_invoice(invoice, buffer);
@@ -76,7 +76,7 @@ void draw_invoice_items_form(invoice* invoice, bool outgoing)
ImGui::TableSetupColumn(locale::get("invoice.table.amount"), ImGuiTableColumnFlags_WidthFixed, 80);
ImGui::TableSetupColumn(locale::get("invoice.table.description"));
ImGui::TableSetupColumn(locale::get("invoice.table.price"), ImGuiTableColumnFlags_WidthFixed, 100);
- ImGui::TableSetupColumn(locale::get("invoice.table.discount"), ImGuiTableColumnFlags_WidthFixed, 100);
+ ImGui::TableSetupColumn(locale::get("invoice.table.discount"), ImGuiTableColumnFlags_WidthFixed, 110);
ImGui::TableSetupColumn(locale::get("invoice.table.net"), ImGuiTableColumnFlags_WidthFixed, 100);
ImGui::TableSetupColumn(locale::get("invoice.table.tax%"), ImGuiTableColumnFlags_WidthFixed, 120);
ImGui::TableSetupColumn(locale::get("invoice.table.tax"), ImGuiTableColumnFlags_WidthFixed, 100);
@@ -94,9 +94,11 @@ void draw_invoice_items_form(invoice* invoice, bool outgoing)
ImGui::PushID(i);
ImGui::TableSetColumnIndex(0);
- if (ImGui::Button("X"))
- {
- administration::billing_item_remove_from_invoice(invoice, item);
+ if (!viewing_only) {
+ if (ImGui::Button("X"))
+ {
+ administration::billing_item_remove_from_invoice(invoice, item);
+ }
}
ImGui::TableSetColumnIndex(1);
@@ -259,7 +261,7 @@ static void draw_invoice_form(invoice* buffer, bool viewing_only = false)
administration::invoice_set_currency(buffer, buffer->currency);
}
- draw_invoice_items_form(buffer, true);
+ draw_invoice_items_form(buffer, true, viewing_only);
if (viewing_only) ImGui::EndDisabled();
}
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index fb02738..defe119 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -327,7 +327,9 @@ static void draw_ai_service_ui()
ImGui::EndDisabled();
}
- if (ImGui::Button(locale::get("form.save"), true)) {
+ char id[100];
+ strops::format(id, 100, "%s##ai", locale::get("form.save"));
+ if (ImGui::Button(id, true)) {
administration_writer::set_write_completed_event_callback(0);
administration::set_ai_service(new_ai_service);
}
@@ -358,7 +360,9 @@ static void draw_email_service_ui()
ImGui::InputTextWithHint(locale::get("settings.services.email_service.pubkey"),
locale::get("settings.services.email_service.pubkey"), new_email_service.api_key, sizeof(new_email_service.api_key));
- if (ImGui::Button(locale::get("form.save"), true)) {
+ char id[100];
+ strops::format(id, 100, "%s##email", locale::get("form.save"));
+ if (ImGui::Button(id, true)) {
administration_writer::set_write_completed_event_callback(0);
administration::set_email_service(new_email_service);
}