summaryrefslogtreecommitdiff
path: root/src/views
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-08-03 19:22:36 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-08-03 19:22:36 +0200
commit853bbb3752a5fa2f58ef456ffb6e3a552e13cb11 (patch)
treece49a533f82a42a65fa6a4771a7b8fbfe33798cf /src/views
initial commit
Diffstat (limited to 'src/views')
-rw-r--r--src/views/contacts.cpp162
-rw-r--r--src/views/dashboard.cpp65
-rw-r--r--src/views/views.hpp6
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