diff options
Diffstat (limited to 'src/views/contacts.cpp')
| -rw-r--r-- | src/views/contacts.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/views/contacts.cpp b/src/views/contacts.cpp new file mode 100644 index 0000000..de5e766 --- /dev/null +++ b/src/views/contacts.cpp @@ -0,0 +1,162 @@ +#include <stdio.h> + +#include "views.hpp" +#include "imgui.h" +#include "../administration.hpp" + +typedef enum { + VIEW, + EDIT, + CREATE, + INSPECT, +} contact_view_state; + +contact_view_state view_state = VIEW; +static int selected_for_removal = -1; // Index in contact list selected for removal. + +static contact edit_contact; + +static void draw_required_tag() +{ + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + const char* text = "required"; + ImVec2 text_pos = ImGui::GetCursorScreenPos(); + ImVec2 text_size = ImGui::CalcTextSize(text); + text_pos.y += text_size.y/4.0f; + + ImVec4 bg_color = ImVec4(0.9f, 0.235f, 0.235f, 0.4f); // Blue background + ImVec4 text_color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // White text + float rounding = 2.0f; + float padding = 2.0f; + + // Background rectangle + ImVec2 bg_min = ImVec2(text_pos.x - padding, text_pos.y - padding); + ImVec2 bg_max = ImVec2(text_pos.x + text_size.x + padding, text_pos.y + text_size.y + padding); + draw_list->AddRectFilled(bg_min, bg_max, ImColor(bg_color), rounding); + + // Foreground text + ImGui::PushStyleColor(ImGuiCol_Text, text_color); + ImGui::TextUnformatted(text); + ImGui::PopStyleColor(); +} + +static void show_edit_contact() +{ + if (ImGui::Button(localize("form.back"))) { + view_state = contact_view_state::VIEW; + memset(&edit_contact, 0, sizeof(contact)); + } + ImGui::Spacing(); + + // Input fields + ImGui::BeginDisabled(); + + ImGui::InputText(localize("contact.form.identifier"), edit_contact.id, IM_ARRAYSIZE(edit_contact.id)); + ImGui::EndDisabled(); + + ImGui::InputTextWithHint(localize("contact.form.fullname"), localize("contact.form.fullname"), edit_contact.name, IM_ARRAYSIZE(edit_contact.name)); + ImGui::SameLine();draw_required_tag(); + + ImGui::InputTextWithHint(localize("contact.form.address1"), localize("contact.form.address1"), edit_contact.address1, IM_ARRAYSIZE(edit_contact.address1)); + ImGui::SameLine();draw_required_tag(); + + ImGui::InputTextWithHint(localize("contact.form.address2"), localize("contact.form.address2"), edit_contact.address2, IM_ARRAYSIZE(edit_contact.address2)); + ImGui::SameLine();draw_required_tag(); + + ImGui::InputTextWithHint(localize("contact.form.taxnumber"), localize("contact.form.taxnumber"), edit_contact.taxid, IM_ARRAYSIZE(edit_contact.taxid)); + ImGui::InputTextWithHint(localize("contact.form.businessnumber"), localize("contact.form.businessnumber"), edit_contact.businessid, IM_ARRAYSIZE(edit_contact.businessid)); + ImGui::InputTextWithHint(localize("contact.form.email"), localize("contact.form.email"), edit_contact.email, IM_ARRAYSIZE(edit_contact.email)); + ImGui::InputTextWithHint(localize("contact.form.phonenumber"), localize("contact.form.phonenumber"), edit_contact.phone_number, IM_ARRAYSIZE(edit_contact.phone_number)); + ImGui::InputTextWithHint(localize("contact.form.bankaccount"), localize("contact.form.bankaccount"), edit_contact.bank_account, IM_ARRAYSIZE(edit_contact.bank_account)); + + bool can_save = strlen(edit_contact.name) > 0 && strlen(edit_contact.address1) > 0 && strlen(edit_contact.address2) > 0; + + if (!can_save) ImGui::BeginDisabled(); + + // Save button + ImGui::Spacing(); + if (ImGui::Button(localize("form.save"))) { + if (view_state == contact_view_state::CREATE) + create_contact(edit_contact); + + else if (view_state == contact_view_state::EDIT) + update_contact(edit_contact); + + memset(&edit_contact, 0, sizeof(contact)); + view_state = contact_view_state::VIEW; + } + + if (!can_save) ImGui::EndDisabled(); +} + +void show_contacts() +{ + if (view_state == contact_view_state::CREATE || view_state == contact_view_state::EDIT) { + show_edit_contact(); + return; + } + + if (ImGui::Button(localize("form.create"))) + { + view_state = contact_view_state::CREATE; + memset(&edit_contact, 0, sizeof(contact)); + snprintf(edit_contact.id, IM_ARRAYSIZE(edit_contact.id), "C/%d", g_administration.next_id); + } + ImGui::Spacing(); + + if (ImGui::BeginTable("TableContacts", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + + ImGui::TableSetupColumn(localize("contact.table.identifier"), ImGuiTableColumnFlags_WidthFixed, 80); + ImGui::TableSetupColumn(localize("contact.table.name"), ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn(localize("contact.table.address"), ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 120); + ImGui::TableHeadersRow(); + + list_iterator_start(&g_administration.contacts); + while (list_iterator_hasnext(&g_administration.contacts)) { + contact c = *(contact *)list_iterator_next(&g_administration.contacts); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); ImGui::Text(c.id); + ImGui::TableSetColumnIndex(1); ImGui::Text(c.name); + ImGui::TableSetColumnIndex(2); ImGui::Text("%s %s", c.address1, c.address2); + + ImGui::TableSetColumnIndex(3); + + char btn_name[20]; + sprintf(btn_name, "%s##%d", localize("form.change"), g_administration.contacts.iter_pos); + if (ImGui::Button(btn_name)) { + edit_contact = c; + view_state = contact_view_state::EDIT; + } + + ImGui::SameLine(); + + // @TODO check to make sure no invoices are connected to this contact. + sprintf(btn_name, "%s##%d", localize("form.delete"), g_administration.contacts.iter_pos); + if (ImGui::Button(btn_name)) { + selected_for_removal = g_administration.contacts.iter_pos; + ImGui::OpenPopup("ConfirmDeletePopup"); + } + } + list_iterator_stop(&g_administration.contacts); + + if (ImGui::BeginPopupModal("ConfirmDeletePopup", nullptr, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoTitleBar)) { + ImGui::Text(localize("form.confirmDelete")); + ImGui::Separator(); + + if (ImGui::Button(localize("form.yes"), ImVec2(120, 0))) { + remove_contact(selected_for_removal-1); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button(localize("form.no"), ImVec2(120, 0))) { + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + + ImGui::EndTable(); + } +}
\ No newline at end of file |
