#include #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 = localize("form.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(); float widthAvailable = ImGui::GetContentRegionAvail().x; ImGui::SetNextItemWidth(widthAvailable*0.2f); ImGui::InputText(localize("contact.form.identifier"), edit_contact.id, IM_ARRAYSIZE(edit_contact.id)); ImGui::EndDisabled(); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.fullname"), localize("contact.form.fullname"), edit_contact.name, IM_ARRAYSIZE(edit_contact.name)); ImGui::SameLine();draw_required_tag(); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.address1"), localize("contact.form.address1"), edit_contact.address1, IM_ARRAYSIZE(edit_contact.address1)); ImGui::SameLine();draw_required_tag(); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.address2"), localize("contact.form.address2"), edit_contact.address2, IM_ARRAYSIZE(edit_contact.address2)); ImGui::SameLine();draw_required_tag(); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.taxnumber"), localize("contact.form.taxnumber"), edit_contact.taxid, IM_ARRAYSIZE(edit_contact.taxid)); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.businessnumber"), localize("contact.form.businessnumber"), edit_contact.businessid, IM_ARRAYSIZE(edit_contact.businessid)); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.email"), localize("contact.form.email"), edit_contact.email, IM_ARRAYSIZE(edit_contact.email)); ImGui::SetNextItemWidth(widthAvailable*0.5f); ImGui::InputTextWithHint(localize("contact.form.phonenumber"), localize("contact.form.phonenumber"), edit_contact.phone_number, IM_ARRAYSIZE(edit_contact.phone_number)); ImGui::SetNextItemWidth(widthAvailable*0.5f); 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(); } }