diff options
Diffstat (limited to 'src/ui/ui_settings.cpp')
| -rw-r--r-- | src/ui/ui_settings.cpp | 172 |
1 files changed, 152 insertions, 20 deletions
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 7854be3..c2c34b9 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -38,25 +38,39 @@ void ui_setup_settings() static void ui_draw_vat_rates() { + static bool is_adding_item = false; + static country_tax_bracket new_tax_bracket; + + static bool is_editing_item = false; + static u32 editing_item_index = 0; + if (ImGui::BeginTable("TableVatRates", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { ImGui::TableSetupColumn(localize("settings.vat.table.country"), ImGuiTableColumnFlags_WidthFixed, 140); ImGui::TableSetupColumn(localize("settings.vat.table.rates")); + // Used to generate headers for each individual country. char prev_country[3]; prev_country[0] = 0; for (u32 i = 0; i < tax_bracket_count; i++) { country_tax_bracket c = tax_brackets[i]; + // Set to false for shared rates. + bool can_be_modified = true; + + // Check for fixed rates shared accross countries. if (strcmp(c.country_code, "00") == 0) { - strops_copy(prev_country, c.country_code, 3); + strops_copy(prev_country, c.country_code, 3); + can_be_modified = false; } + // Generate headers per country. else if (strcmp(c.country_code, prev_country) != 0) - { + { strops_copy(prev_country, c.country_code, 3); + // Empty row. ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::Text(""); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(69, 69, 69, 255)); @@ -67,13 +81,108 @@ static void ui_draw_vat_rates() char locale_buf[20]; snprintf(locale_buf, sizeof(locale_buf), "country.%s", c.country_code); - ImGui::TableSetColumnIndex(0); ImGui::Text(localize(locale_buf)); + ImGui::TableSetColumnIndex(0); + ImGui::Text(localize(locale_buf)); + + // If not adding an item already, show + button next to country name. + if (!is_adding_item) + { + ImGui::SameLine(); + char btn_name[20]; + snprintf(btn_name, sizeof(btn_name), "+##%d",i); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0)); + if (ImGui::Button(btn_name, ImVec2(20,20))) { + is_adding_item = true; + is_editing_item = false; + memset(&new_tax_bracket, 0, sizeof(new_tax_bracket)); + strops_copy(new_tax_bracket.country_code, c.country_code, 3); + } + ImGui::PopStyleVar(); + } + ImGui::TableSetColumnIndex(1); ImGui::Text(""); } + // Column 1: description of tax bracket. Is only displayed on shared tax brackets for clarity. ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); ImGui::Text(localize(c.description)); - ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f%%", c.rate); + ImGui::TableSetColumnIndex(0); + ImGui::Text(can_be_modified ? "" : localize(c.description)); + + + // Column 2: When editing, show input for new rate. Else we display the stored rate and check for modify request. + ImGui::TableSetColumnIndex(1); + if (is_editing_item && editing_item_index == i) + { + ImGui::InputFloat("##Rate", &new_tax_bracket.rate, 1.0f, 5.0f, "%.2f"); + + if (new_tax_bracket.rate < 0.0f) new_tax_bracket.rate = 0.0f; + if (new_tax_bracket.rate > 100.0f) new_tax_bracket.rate = 100.0f; + + ImGui::SameLine(); + if (ImGui::Button(localize("form.save"))) { + is_editing_item = false; + is_adding_item = false; + + administration_update_tax_bracket(new_tax_bracket); + + ui_destroy_settings(); + ui_setup_settings(); + } + + ImGui::SameLine(); + if (ImGui::Button(localize("form.cancel"))) { + is_editing_item = false; + is_adding_item = false; + memset(&new_tax_bracket, 0, sizeof(new_tax_bracket)); + } + } + else + { + ImGui::Text("%.2f%%", c.rate); + + if (can_be_modified && ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + is_editing_item = true; + is_adding_item = false; + editing_item_index = i; + new_tax_bracket = c; + } + } + + // When adding a new entry it is displayed at the bottom of the list of the country we are adding to. + // Check for end of list (for last country in the list), or check if next country differs from current country. + // If it is different we have reached the end of the list for the current country. + if (i == tax_bracket_count-1 || (i < tax_bracket_count-1 && strcmp(tax_brackets[i+1].country_code, c.country_code) != 0)) + { + if (is_adding_item && strcmp(new_tax_bracket.country_code, prev_country) == 0) + { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); ImGui::Text(""); + ImGui::TableSetColumnIndex(1); + ImGui::InputFloat("##Rate", &new_tax_bracket.rate, 1.0f, 5.0f, "%.2f"); + + if (new_tax_bracket.rate < 0.0f) new_tax_bracket.rate = 0.0f; + if (new_tax_bracket.rate > 100.0f) new_tax_bracket.rate = 100.0f; + + ImGui::SameLine(); + if (ImGui::Button(localize("form.save"))) { + is_editing_item = false; + is_adding_item = false; + + administration_add_tax_bracket(new_tax_bracket); + + ui_destroy_settings(); + ui_setup_settings(); + } + + ImGui::SameLine(); + if (ImGui::Button(localize("form.cancel"))) { + is_editing_item = false; + is_adding_item = false; + memset(&new_tax_bracket, 0, sizeof(new_tax_bracket)); + } + } + } } ImGui::EndTable(); @@ -97,14 +206,18 @@ static void ui_draw_cost_centers() cost_center c = cost_centers[i]; ImGui::TableNextRow(); + + // Column 1: Code of cost center. ImGui::TableSetColumnIndex(0); ImGui::Text(c.code); - ImGui::TableSetColumnIndex(1); - + + // Column 2: When editing, show inputs for new description. Else show stored description and check for modify request. + ImGui::TableSetColumnIndex(1); if (is_editing_item && editing_item_index == i) { - ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description)); - bool is_desc_valid = administration_verify_cost_center_description(new_cost_center.description); + if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); + ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description)); + if (!is_desc_valid) ImGui::PopStyleColor(); if (!is_desc_valid) ImGui::BeginDisabled(); ImGui::SameLine(); @@ -113,37 +226,48 @@ static void ui_draw_cost_centers() is_adding_item = false; administration_update_cost_center(new_cost_center); + memset(&new_cost_center, 0, sizeof(new_cost_center)); ui_destroy_settings(); ui_setup_settings(); } if (!is_desc_valid) ImGui::EndDisabled(); + + ImGui::SameLine(); + if (ImGui::Button(localize("form.cancel"))) { + is_editing_item = false; + is_adding_item = false; + memset(&new_cost_center, 0, sizeof(new_cost_center)); + } } else { ImGui::Text(localize(c.description)); - } - if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) - { - is_editing_item = true; - is_adding_item = false; - editing_item_index = i; - new_cost_center = c; - } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + is_editing_item = true; + is_adding_item = false; + editing_item_index = i; + new_cost_center = c; + } + } } + // When adding a new item. Show inputs for code and description, check validity, and handle save/cancel. + // Form for new entry is displayed at bottom of list. if (is_adding_item) { ImGui::TableNextRow(); bool is_code_valid = administration_verify_cost_center_code(new_cost_center.code); - if (!is_code_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(255, 0, 0, 64)); - ImGui::TableSetColumnIndex(0); ImGui::InputText("##Code", new_cost_center.code, IM_ARRAYSIZE(new_cost_center.code)); + if (!is_code_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); + ImGui::TableSetColumnIndex(0); ImGui::InputText("##Code", new_cost_center.code, IM_ARRAYSIZE(new_cost_center.code), + ImGuiInputTextFlags_CharsUppercase|ImGuiInputTextFlags_CharsNoBlank); if (!is_code_valid) ImGui::PopStyleColor(); bool is_desc_valid = administration_verify_cost_center_description(new_cost_center.description); - if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(255, 0, 0, 64)); + if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255)); ImGui::TableSetColumnIndex(1); ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description)); if (!is_desc_valid) ImGui::PopStyleColor(); @@ -161,11 +285,19 @@ static void ui_draw_cost_centers() ui_setup_settings(); } if (!can_save) ImGui::EndDisabled(); + + ImGui::SameLine(); + if (ImGui::Button(localize("form.cancel"))) { + is_adding_item = false; + is_editing_item = false; + memset(&new_cost_center, 0, sizeof(new_cost_center)); + } } ImGui::EndTable(); } + // If not adding a new item already, show create button at bottom of list. if (!is_adding_item && ImGui::Button(localize("form.create"))) { is_adding_item = true; |
