diff options
| author | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-01 17:20:05 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-01 17:20:05 +0100 |
| commit | 3088c3e904c1b4d9cb1ea3ba24f851356f6a2ab9 (patch) | |
| tree | 160a3412ff1486f953dc050ded09f5374e8d7fcd /src | |
| parent | a1d639e963eaad1f8d24d47cd004c22052166978 (diff) | |
feedback on buttons that write to disk
Diffstat (limited to 'src')
| -rw-r--r-- | src/administration_writer.cpp | 39 | ||||
| -rw-r--r-- | src/ui/imgui_extensions.cpp | 65 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 14 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 8 |
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); } |
