diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-08-03 19:22:36 +0200 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-08-03 19:22:36 +0200 |
| commit | 853bbb3752a5fa2f58ef456ffb6e3a552e13cb11 (patch) | |
| tree | ce49a533f82a42a65fa6a4771a7b8fbfe33798cf /src/views | |
initial commit
Diffstat (limited to 'src/views')
| -rw-r--r-- | src/views/contacts.cpp | 162 | ||||
| -rw-r--r-- | src/views/dashboard.cpp | 65 | ||||
| -rw-r--r-- | src/views/views.hpp | 6 |
3 files changed, 233 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 diff --git a/src/views/dashboard.cpp b/src/views/dashboard.cpp new file mode 100644 index 0000000..16d31c4 --- /dev/null +++ b/src/views/dashboard.cpp @@ -0,0 +1,65 @@ +#include "views.hpp" + +#include "imgui.h" + +void show_dashboard() +{ + if (ImGui::BeginMainMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Open", "Ctrl+O")) { /* Handle Open */ } + if (ImGui::MenuItem("Save", "Ctrl+S")) { /* Handle Save */ } + + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } + + ImGuiIO& io = ImGui::GetIO(); + float menuBarHeight = ImGui::GetFrameHeight(); + float statusBarHeight = 26.0f; + ImGui::SetNextWindowPos(ImVec2(0, menuBarHeight)); + ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, io.DisplaySize.y - menuBarHeight - statusBarHeight)); + + ImGui::Begin("AccountingMainWindow", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); + + ImGui::AlignTextToFramePadding(); + const char* names[3] = { "Incoming", "Outgoing", "Contacts" }; + void (*drawcalls[3])(void) = { show_contacts, show_contacts, show_contacts }; + + if (ImGui::BeginTabBar("mainNavigationTabBar", 0)) + { + for (int n = 0; n < IM_ARRAYSIZE(names); n++) + if (ImGui::BeginTabItem(names[n], 0, ImGuiTabItemFlags_None)) + { + ImGui::Spacing(); + drawcalls[n](); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + + ImGui::End(); + + // Status bar. + ImGui::SetNextWindowPos(ImVec2(0, io.DisplaySize.y - statusBarHeight)); + ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, statusBarHeight)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10, 3)); + ImGui::Begin("StatusBar", nullptr, + ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoBringToFrontOnFocus | + ImGuiWindowFlags_NoCollapse); + + ImGui::Text("Working on: []"); + ImGui::SameLine(); + ImGui::Text("Status: []"); + + ImGui::End(); + ImGui::PopStyleVar(); +}
\ No newline at end of file diff --git a/src/views/views.hpp b/src/views/views.hpp new file mode 100644 index 0000000..adefea2 --- /dev/null +++ b/src/views/views.hpp @@ -0,0 +1,6 @@ +#pragma once + +#include "../locales/locales.hpp" + +void show_dashboard(); +void show_contacts();
\ No newline at end of file |
