summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-11-01 16:29:25 +0100
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-11-01 16:29:25 +0100
commit887d5f9f8d1309134c72b1f35afc7d007a5c64aa (patch)
tree77802f7526be4c76efbb80742f3f04df79a9b3b1 /src/ui
parenta2918b9724a65ba147cfafc6bcf8d410a647330b (diff)
refactor invoice views
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/imgui_extensions.cpp7
-rw-r--r--src/ui/ui_invoices.cpp143
-rw-r--r--src/ui/ui_main.cpp2
-rw-r--r--src/ui/ui_settings.cpp3
4 files changed, 80 insertions, 75 deletions
diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp
index f3b9ff8..a90549f 100644
--- a/src/ui/imgui_extensions.cpp
+++ b/src/ui/imgui_extensions.cpp
@@ -67,6 +67,8 @@ namespace ImGui
ImGui::BeginDisabled();
bool result = ImGui::Button("", CalcButtonSize(label));
+ ImVec2 oldPos = ImGui::GetCursorScreenPos();
+
float radius = 10.0f;
ImVec2 p_min = ImGui::GetItemRectMin();
ImVec2 p_max = ImGui::GetItemRectMax();
@@ -77,9 +79,12 @@ namespace ImGui
const ImVec4 col = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
const ImVec4 bg = ImGui::GetStyleColorVec4(ImGuiCol_Button);
ImGui::LoadingIndicatorCircle(radius, bg, col, 6, 4.0f);
-
ImGui::EndDisabled();
ImGui::PopID();
+
+ ImGui::SetCursorScreenPos(oldPos);
+ ImGui::SameLine();
+ ImGui::Dummy(ImVec2(0, 0));
return result;
}
diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp
index ebf84d4..0e81259 100644
--- a/src/ui/ui_invoices.cpp
+++ b/src/ui/ui_invoices.cpp
@@ -29,6 +29,7 @@
static ui::view_state current_view_state = ui::view_state::LIST_ALL;
static invoice active_invoice = {0};
static invoice selected_for_removal = {0};
+static const float sidepanel_width = 200.0f;
static billing_item* invoice_items_buffer = 0;
@@ -306,22 +307,35 @@ static void draw_invoices_list()
ImGui::Spacing();
- if (ImGui::BeginTable("TableInvoices", 7, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
+ if (ImGui::BeginTable("TableInvoices", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
ImGui::TableSetupColumn(locale::get("invoice.table.invoicenumber"), ImGuiTableColumnFlags_WidthFixed, 130);
ImGui::TableSetupColumn(locale::get("invoice.table.customer"));
ImGui::TableSetupColumn(locale::get("invoice.table.addressee"));
- ImGui::TableSetupColumn(locale::get("invoice.table.issuedat"));
- ImGui::TableSetupColumn(locale::get("invoice.table.total"));
- ImGui::TableSetupColumn(locale::get("invoice.table.status"));
- ImGui::TableSetupColumn("");
- ImGui::TableHeadersRow();
+ ImGui::TableSetupColumn(locale::get("invoice.table.issuedat"), ImGuiTableColumnFlags_WidthFixed, 90);
+ ImGui::TableSetupColumn(locale::get("invoice.table.total"), ImGuiTableColumnFlags_WidthFixed, 90);
+ ImGui::TableSetupColumn(locale::get("invoice.table.status"), ImGuiTableColumnFlags_WidthFixed, 90);
+ ImGui::TableHeadersRow();
for (u32 i = 0; i < invoice_count; i++) {
invoice c = invoice_list[i];
ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::Text(c.sequential_number);
+ ImGui::TableSetColumnIndex(0);
+
+ ImGui::PushID(i);
+ ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap;
+ bool selected = false;
+ if (ImGui::Selectable("##invisible_selectable", selected, selectable_flags, ImVec2(0, ImGui::GetFrameHeight()-4.0f)))
+ {
+ active_invoice = c;
+ current_view_state = ui::view_state::VIEW_EXISTING;
+ }
+ ImGui::SetItemAllowOverlap();
+ ImGui::SameLine();
+ ImGui::PopID();
+
+ ImGui::Text(c.sequential_number);
if (administration::invoice_is_valid(&c) != A_ERR_SUCCESS)
{
@@ -340,54 +354,19 @@ static void draw_invoices_list()
ImGui::TableSetColumnIndex(3); ImGui::Text(buf);
ImGui::TableSetColumnIndex(4); ImGui::Text("%.2f %s", c.total, c.currency);
ImGui::TableSetColumnIndex(5); ImGui::Text("%s", locale::get(administration::invoice_get_status_string(&c)));
- ImGui::TableSetColumnIndex(6);
-
- char btn_name[20];
- strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.view"), i);
- if (ImGui::Button(btn_name)) {
- active_invoice = c;
- current_view_state = ui::view_state::VIEW_EXISTING;
- }
ImGui::SameLine();
-
- if (c.status == invoice_status::INVOICE_CONCEPT)
- {
- strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.change"), i);
- if (ImGui::Button(btn_name)) {
- active_invoice = administration::invoice_create_copy(&c); // We create a copy because of billing item list pointers.
- current_view_state = ui::view_state::EDIT_EXISTING;
- }
-
- ImGui::SameLine();
- strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.delete"), i);
- if (ImGui::Button(btn_name)) {
- selected_for_removal = c;
- ImGui::OpenPopup("ConfirmDeletePopup");
- }
- }
- }
-
- // Confirmation popup before contact is deleted definitively.
- if (ImGui::BeginPopupModal("ConfirmDeletePopup", nullptr, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoTitleBar)) {
- ImGui::Text(locale::get("form.confirmDelete"));
- ImGui::Separator();
-
- if (ImGui::Button(locale::get("form.yes"), ImVec2(120, 0))) {
- administration::invoice_remove(&selected_for_removal);
- ImGui::CloseCurrentPopup();
- }
- ImGui::SameLine();
- if (ImGui::Button(locale::get("form.no"), ImVec2(120, 0))) {
- ImGui::CloseCurrentPopup();
- }
- ImGui::EndPopup();
}
ImGui::EndTable();
}
}
+static void _reset_to_invoice_view()
+{
+ current_view_state = ui::view_state::VIEW_EXISTING;
+}
+
static void _reset_to_default_view()
{
current_view_state = ui::view_state::LIST_ALL;
@@ -398,25 +377,28 @@ static void _reset_to_default_view()
static void draw_invoice_update()
{
if (ImGui::Button(locale::get("form.back"), true, false)) {
- _reset_to_default_view();
+ current_view_state = ui::view_state::VIEW_EXISTING;
+ }
+
+ { // Save button
+ bool can_save = administration::invoice_is_valid(&active_invoice) == A_ERR_SUCCESS;
+ if (!can_save) ImGui::BeginDisabled();
+ ImGui::SameLine();
+ if (ImGui::Button(locale::get("form.save"), true)) {
+ administration_writer::set_write_completed_event_callback(_reset_to_invoice_view);
+ administration::invoice_update(&active_invoice);
+ }
+ if (!can_save) ImGui::EndDisabled();
}
ImGui::Spacing();
ImGui::Separator(3.0f);
ImGui::Spacing();
+ float availableWidth = ImGui::GetContentRegionAvail().x;
+ ImGui::BeginChild("##invoicePanel", ImVec2(availableWidth - sidepanel_width, 0), ImGuiChildFlags_None);
draw_invoice_form(&active_invoice);
-
- bool can_save = administration::invoice_is_valid(&active_invoice) == A_ERR_SUCCESS;
- if (!can_save) ImGui::BeginDisabled();
-
- ImGui::Spacing();
- if (ImGui::Button(locale::get("form.save"), true)) {
- administration_writer::set_write_completed_event_callback(_reset_to_default_view);
- administration::invoice_update(&active_invoice);
- }
-
- if (!can_save) ImGui::EndDisabled();
+ ImGui::EndChild();
}
static void draw_invoice_create()
@@ -425,22 +407,25 @@ static void draw_invoice_create()
_reset_to_default_view();
}
+ { // Save button
+ bool can_save = administration::invoice_is_valid(&active_invoice) == A_ERR_SUCCESS;
+ if (!can_save) ImGui::BeginDisabled();
+ ImGui::SameLine();
+ if (ImGui::Button(locale::get("form.save"), true)) {
+ administration_writer::set_write_completed_event_callback(_reset_to_invoice_view);
+ administration::invoice_add(&active_invoice);
+ }
+ if (!can_save) ImGui::EndDisabled();
+ }
+
ImGui::Spacing();
ImGui::Separator(3.0f);
ImGui::Spacing();
+ float availableWidth = ImGui::GetContentRegionAvail().x;
+ ImGui::BeginChild("##invoicePanel", ImVec2(availableWidth - sidepanel_width, 0), ImGuiChildFlags_None);
draw_invoice_form(&active_invoice);
-
- bool can_save = administration::invoice_is_valid(&active_invoice) == A_ERR_SUCCESS;
- if (!can_save) ImGui::BeginDisabled();
-
- ImGui::Spacing();
- if (ImGui::Button(locale::get("form.save"), true)) {
- administration_writer::set_write_completed_event_callback(_reset_to_default_view);
- administration::invoice_add(&active_invoice);
- }
-
- if (!can_save) ImGui::EndDisabled();
+ ImGui::EndChild();
}
static void draw_invoice_view()
@@ -451,6 +436,13 @@ static void draw_invoice_view()
ImGui::SameLine();
+ if (ImGui::Button(locale::get("form.change"))) {
+ active_invoice = administration::invoice_create_copy(&active_invoice); // We create a copy because of billing item list pointers.
+ current_view_state = ui::view_state::EDIT_EXISTING;
+ }
+
+ ImGui::SameLine();
+
ImGui::PushItemWidth(100.0f);
if (ImGui::BeginCombo("##Send", locale::get("ui.sendAs")))
{
@@ -483,7 +475,18 @@ static void draw_invoice_view()
ImGui::Separator(3.0f);
ImGui::Spacing();
+ float availableWidth = ImGui::GetContentRegionAvail().x;
+ ImGui::BeginChild("##invoicePanel", ImVec2(availableWidth - sidepanel_width, 0), ImGuiChildFlags_None);
draw_invoice_form(&active_invoice, true);
+ ImGui::EndChild();
+
+ ImGui::SameLine();
+ ImGui::SeparatorEx(1 << 1, 3.0f);
+ ImGui::SameLine();
+
+ ImGui::BeginChild("##historyPanel", ImVec2(sidepanel_width, 0), ImGuiChildFlags_None);
+ // Sidepanel
+ ImGui::EndChild();
}
void ui::draw_invoices()
diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp
index 6d55177..67d678f 100644
--- a/src/ui/ui_main.cpp
+++ b/src/ui/ui_main.cpp
@@ -92,7 +92,7 @@ void ui::draw_main()
float sidePanelWidth = 120.0f;
ImGui::SetNextWindowPos(ImVec2(0, menuBarHeight));
ImGui::SetNextWindowSize(ImVec2(sidePanelWidth, io.DisplaySize.y - menuBarHeight - statusBarHeight));
-
+
// Side panel
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
ImGui::Begin("SidePanel", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse);
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index 076f231..c458260 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -131,9 +131,6 @@ static void _cost_center_update_callback()
{
is_editing_cost_center = false;
is_adding_cost_center = false;
-
- administration::cost_center_update(new_cost_center);
-
memops::zero(&new_cost_center, sizeof(new_cost_center));
ui::destroy_settings();