diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/administration.cpp | 28 | ||||
| -rw-r--r-- | src/administration_writer.cpp | 6 | ||||
| -rw-r--r-- | src/locales/en.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_contacts.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_earnings.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_expenses.cpp | 21 | ||||
| -rw-r--r-- | src/ui/ui_invoices.cpp | 21 | ||||
| -rw-r--r-- | src/ui/ui_main.cpp | 119 | ||||
| -rw-r--r-- | src/ui/ui_projects.cpp | 4 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 6 | ||||
| -rw-r--r-- | src/ui/ui_start.cpp | 50 |
11 files changed, 187 insertions, 80 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index ab72647..d463cec 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -394,6 +394,18 @@ static s32 administration_create_sequence_number() // Setup functions. // ======================= +void administration_create_empty(char* save_file) +{ + strops_copy(g_administration.path, save_file, sizeof(g_administration.path)); + strops_copy(g_administration.program_version, PROGRAM_VERSION, sizeof(g_administration.program_version)); + administration_company_info_set(administration_contact_create_empty()); + + administration_create_default_tax_brackets(); + administration_create_default_cost_centers(); + + //administration_create_debug_data(); +} + void administration_create() { STOPWATCH_START; @@ -408,12 +420,6 @@ void administration_create() list_init(&g_administration.cost_centers); strops_copy(g_administration.path, "", sizeof(g_administration.path)); strops_copy(g_administration.program_version, PROGRAM_VERSION, sizeof(g_administration.program_version)); - - administration_create_default_tax_brackets(); - administration_create_default_cost_centers(); - - administration_create_debug_data(); - //administration_writer_save_all_async(); log_add("Setup took %.3fms.", STOPWATCH_TIME); @@ -441,6 +447,16 @@ void administration_destroy() // Other functions. // ======================= +bool administration_is_loaded() +{ + return strcmp(g_administration.path, "") != 0; +} + +bool administration_can_create_invoices() +{ + return administration_contact_is_valid(g_administration.company_info); +} + char* administration_get_default_currency() { return g_administration.default_currency; diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index 6a0aba3..3dd6e3f 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -278,7 +278,7 @@ bool administration_writer_save_invoice_blocking(invoice inv) strops_replace(billing_item_file_content, billing_item_buf_length, "{{CURRENCY}}", inv.currency); strops_replace(billing_item_file_content, billing_item_buf_length, "{{LINE_ID}}", bi.id); - strops_replace(billing_item_file_content, billing_item_buf_length, "{{ITEM_NAME}}", "XD"); + strops_replace(billing_item_file_content, billing_item_buf_length, "{{ITEM_NAME}}", bi.description); strops_replace(billing_item_file_content, billing_item_buf_length, "{{LINE_TAX_CATEGORY}}", bracket.category_code); strops_replace_float(billing_item_file_content, billing_item_buf_length, "{{LINE_TAX_PERCENT}}", bracket.rate, 2); strops_replace_float(billing_item_file_content, billing_item_buf_length, "{{LINE_AMOUNT}}", bi.net, 2); @@ -412,7 +412,7 @@ bool administration_writer_save_cost_center_blocking(cost_center cost) return result; } -static bool administration_writer_save_all_cost_centers_blocking() +bool administration_writer_save_all_cost_centers_blocking() { bool result = 1; u32 num_costcenters = administration_cost_center_count(); @@ -459,7 +459,7 @@ bool administration_writer_save_tax_bracket_blocking(country_tax_bracket bracket return result; } -static bool administration_writer_save_all_tax_brackets_blocking() +bool administration_writer_save_all_tax_brackets_blocking() { //// Get all data. u32 num_brackets = administration_tax_bracket_count(); diff --git a/src/locales/en.cpp b/src/locales/en.cpp index 0fe0a00..7b0821a 100644 --- a/src/locales/en.cpp +++ b/src/locales/en.cpp @@ -4,6 +4,10 @@ locale_entry en_locales[] = { // General UI strings. {"ui.unsavedProject", "[unsaved project]"}, {"ui.workingOn", "Working on"}, + {"ui.invoiceRequirementP1", "Company info ↗"}, + {"ui.invoiceRequirementP2", "needs to be completed before adding invoices."}, + {"ui.next", "Next >>"}, + {"ui.prev", "<< Prev"}, // Status strings. {"status.saved", "[Saved to disk]"}, diff --git a/src/ui/ui_contacts.cpp b/src/ui/ui_contacts.cpp index ca73ac3..e1e9d5e 100644 --- a/src/ui/ui_contacts.cpp +++ b/src/ui/ui_contacts.cpp @@ -207,7 +207,7 @@ static void draw_contact_list() ImGui::SameLine(); bool enable_prev = current_page > 0; if (!enable_prev) ImGui::BeginDisabled(); - if (ImGui::Button("<< Prev") && current_page > 0) current_page--; + if (ImGui::Button(localize("ui.prev")) && current_page > 0) current_page--; if (!enable_prev) ImGui::EndDisabled(); ImGui::SameLine(); @@ -217,7 +217,7 @@ static void draw_contact_list() ImGui::SameLine(); bool enable_next = current_page < max_page-1; if (!enable_next) ImGui::BeginDisabled(); - if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++; + if (ImGui::Button(localize("ui.next")) && current_page < max_page-1) current_page++; if (!enable_next) ImGui::EndDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_earnings.cpp b/src/ui/ui_earnings.cpp index aed31f4..f85a54c 100644 --- a/src/ui/ui_earnings.cpp +++ b/src/ui/ui_earnings.cpp @@ -29,7 +29,7 @@ void ui_draw_earnings() bool enable_prev = current_page > 0; if (!enable_prev) ImGui::BeginDisabled(); - if (ImGui::Button("<< Prev") && current_page > 0) current_page--; + if (ImGui::Button(localize("ui.prev")) && current_page > 0) current_page--; if (!enable_prev) ImGui::EndDisabled(); ImGui::SameLine(); @@ -38,7 +38,7 @@ void ui_draw_earnings() ImGui::SameLine(); bool enable_next = current_page < max_page-1; if (!enable_next) ImGui::BeginDisabled(); - if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++; + if (ImGui::Button(localize("ui.next")) && current_page < max_page-1) current_page++; if (!enable_next) ImGui::EndDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_expenses.cpp b/src/ui/ui_expenses.cpp index bb23ba9..6c02a74 100644 --- a/src/ui/ui_expenses.cpp +++ b/src/ui/ui_expenses.cpp @@ -339,6 +339,23 @@ static void draw_expense_form(invoice* buffer, bool viewing_only = false) static void ui_draw_expenses_list() { + if (!administration_can_create_invoices()) { + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 102, 204, 255)); // blue + ImGui::Text(localize("ui.invoiceRequirementP1")); + ImGui::PopStyleColor(); + + if (ImGui::IsItemHovered()) { + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + ui_set_state(main_state::UI_SETTINGS); + } + } + + ImGui::SameLine(); + ImGui::Text(localize("ui.invoiceRequirementP2")); + return; + } + const u32 items_per_page = 50; static s32 current_page = 0; @@ -366,7 +383,7 @@ static void ui_draw_expenses_list() ImGui::SameLine(); bool enable_prev = current_page > 0; if (!enable_prev) ImGui::BeginDisabled(); - if (ImGui::Button("<< Prev") && current_page > 0) current_page--; + if (ImGui::Button(localize("ui.prev")) && current_page > 0) current_page--; if (!enable_prev) ImGui::EndDisabled(); ImGui::SameLine(); @@ -376,7 +393,7 @@ static void ui_draw_expenses_list() ImGui::SameLine(); bool enable_next = current_page < max_page-1; if (!enable_next) ImGui::BeginDisabled(); - if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++; + if (ImGui::Button(localize("ui.next")) && current_page < max_page-1) current_page++; if (!enable_next) ImGui::EndDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index d64147f..146d298 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -369,6 +369,23 @@ static void draw_invoice_form(invoice* buffer, bool viewing_only = false) static void ui_draw_invoices_list() { + if (!administration_can_create_invoices()) { + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 102, 204, 255)); // blue + ImGui::Text(localize("ui.invoiceRequirementP1")); + ImGui::PopStyleColor(); + + if (ImGui::IsItemHovered()) { + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + ui_set_state(main_state::UI_SETTINGS); + } + } + + ImGui::SameLine(); + ImGui::Text(localize("ui.invoiceRequirementP2")); + return; + } + const u32 items_per_page = 50; static s32 current_page = 0; @@ -396,7 +413,7 @@ static void ui_draw_invoices_list() ImGui::SameLine(); bool enable_prev = current_page > 0; if (!enable_prev) ImGui::BeginDisabled(); - if (ImGui::Button("<< Prev") && current_page > 0) current_page--; + if (ImGui::Button(localize("ui.prev")) && current_page > 0) current_page--; if (!enable_prev) ImGui::EndDisabled(); ImGui::SameLine(); @@ -406,7 +423,7 @@ static void ui_draw_invoices_list() ImGui::SameLine(); bool enable_next = current_page < max_page-1; if (!enable_next) ImGui::BeginDisabled(); - if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++; + if (ImGui::Button(localize("ui.next")) && current_page < max_page-1) current_page++; if (!enable_next) ImGui::EndDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp index 61c4784..bc02243 100644 --- a/src/ui/ui_main.cpp +++ b/src/ui/ui_main.cpp @@ -2,23 +2,11 @@ #include "imgui.h" #include "administration.hpp" #include "locales.hpp" +#include "tinyfiledialogs.h" +#include "administration_writer.hpp" -typedef enum -{ - INVOICES = 0, - EXPENSES = 1, - CONTACTS = 2, - REPORT_RESULTS = 3, - REPORT_TAX = 4, - PROJECTS = 5, - SETTINGS = 6, - LOG = 7, - - END -} dashboard_view_state; - -static dashboard_view_state dashboard_state = dashboard_view_state::END; -void (*drawcalls[dashboard_view_state::END])(void) = { +static main_state ui_state = main_state::UI_END; +void (*drawcalls[main_state::UI_END])(void) = { ui_draw_invoices, ui_draw_expenses, ui_draw_contacts, @@ -27,9 +15,10 @@ void (*drawcalls[dashboard_view_state::END])(void) = { ui_draw_projects, ui_draw_settings, ui_draw_log, + ui_draw_start, }; -void (*setupcalls[dashboard_view_state::END])(void) = { +void (*setupcalls[main_state::UI_END])(void) = { ui_setup_invoices, ui_setup_expenses, ui_setup_contacts, @@ -38,9 +27,10 @@ void (*setupcalls[dashboard_view_state::END])(void) = { ui_setup_projects, ui_setup_settings, 0, + 0, }; -void (*destroycalls[dashboard_view_state::END])(void) = { +void (*destroycalls[main_state::UI_END])(void) = { ui_destroy_invoices, ui_destroy_expenses, 0, @@ -49,33 +39,36 @@ void (*destroycalls[dashboard_view_state::END])(void) = { 0, ui_destroy_settings, 0, + 0, }; -static void set_dashboard_state(dashboard_view_state state) +void ui_set_state(main_state state) { - if (dashboard_state != dashboard_view_state::END && destroycalls[dashboard_state]) destroycalls[dashboard_state](); - dashboard_state = state; - if (setupcalls[dashboard_state]) setupcalls[dashboard_state](); + if (ui_state != main_state::UI_END && destroycalls[ui_state]) destroycalls[ui_state](); + ui_state = state; + if (setupcalls[ui_state]) setupcalls[ui_state](); } +void create_new_administration(); + void ui_draw_main() { - if (dashboard_state == dashboard_view_state::END) set_dashboard_state(dashboard_view_state::INVOICES); + if (ui_state == main_state::UI_END) ui_set_state(main_state::UI_START); // @localize if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu("File")) { - if (ImGui::MenuItem("Open", "Ctrl+O")) { /* Handle Open */ } - if (ImGui::MenuItem("Save", "Ctrl+S")) { /* Handle Save */ } + if (ImGui::MenuItem("New")) { create_new_administration(); } + if (ImGui::MenuItem("Open")) { /* Handle Save */ } ImGui::EndMenu(); } if (ImGui::BeginMenu("Help")) { - if (ImGui::MenuItem("Event Log")) { set_dashboard_state(dashboard_view_state::LOG); } + if (ImGui::MenuItem("Event Log")) { ui_set_state(main_state::UI_LOG); } ImGui::EndMenu(); } @@ -89,47 +82,53 @@ void ui_draw_main() 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); - { - // Navigation buttons with custom styling - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); // Transparent background - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); // Reduce spacing between buttons - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 0.0f)); - - float buttonWidth = sidePanelWidth; - - if (ImGui::Button(localize("nav.invoices"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::INVOICES); - if (ImGui::Button(localize("nav.expenses"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::EXPENSES); - if (ImGui::Button(localize("nav.contacts"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::CONTACTS); - - static bool reports_opened = true; - if (ImGui::Button(localize("nav.reports"), ImVec2(buttonWidth, 24))) reports_opened = !reports_opened; - if (reports_opened) + if (ui_state != main_state::UI_START) { + // Side panel + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGui::Begin("SidePanel", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(20.0f, 0.0f)); - if (ImGui::Button(localize("nav.reports.results"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::REPORT_RESULTS); - if (ImGui::Button(localize("nav.reports.tax"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::REPORT_TAX); - ImGui::PopStyleVar(); + // Navigation buttons with custom styling + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); // Transparent background + ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); // Reduce spacing between buttons + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 0.0f)); + + float buttonWidth = sidePanelWidth; + + if (ImGui::Button(localize("nav.invoices"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_INVOICES); + if (ImGui::Button(localize("nav.expenses"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_EXPENSES); + if (ImGui::Button(localize("nav.contacts"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_CONTACTS); + + static bool reports_opened = true; + if (ImGui::Button(localize("nav.reports"), ImVec2(buttonWidth, 24))) reports_opened = !reports_opened; + if (reports_opened) + { + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(20.0f, 0.0f)); + if (ImGui::Button(localize("nav.reports.results"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_REPORT_RESULTS); + if (ImGui::Button(localize("nav.reports.tax"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_REPORT_TAX); + ImGui::PopStyleVar(); + } + + if (ImGui::Button(localize("nav.projects"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_PROJECTS); + if (ImGui::Button(localize("nav.settings"), ImVec2(buttonWidth, 24))) ui_set_state(main_state::UI_SETTINGS); + + ImGui::PopStyleColor(1); + ImGui::PopStyleVar(3); } + ImGui::End(); + ImGui::PopStyleVar(); - if (ImGui::Button(localize("nav.projects"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::PROJECTS); - if (ImGui::Button(localize("nav.settings"), ImVec2(buttonWidth, 24))) set_dashboard_state(dashboard_view_state::SETTINGS); - - ImGui::PopStyleColor(1); - ImGui::PopStyleVar(3); + ImGui::SetNextWindowPos(ImVec2(sidePanelWidth, menuBarHeight)); + ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x - sidePanelWidth, io.DisplaySize.y - menuBarHeight - statusBarHeight)); + } + else { + ImGui::SetNextWindowPos(ImVec2(0, 0)); + ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, io.DisplaySize.y - statusBarHeight)); } - ImGui::End(); - ImGui::PopStyleVar(); - - ImGui::SetNextWindowPos(ImVec2(sidePanelWidth, menuBarHeight)); - ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x - sidePanelWidth, io.DisplaySize.y - menuBarHeight - statusBarHeight)); // Main content ImGui::Begin("AccountingMainWindow", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); - if (drawcalls[dashboard_state]) drawcalls[dashboard_state](); + if (drawcalls[ui_state]) drawcalls[ui_state](); ImGui::End(); // Status bar. diff --git a/src/ui/ui_projects.cpp b/src/ui/ui_projects.cpp index ca9b845..d736cf5 100644 --- a/src/ui/ui_projects.cpp +++ b/src/ui/ui_projects.cpp @@ -102,7 +102,7 @@ static void draw_project_list() ImGui::SameLine(); bool enable_prev = current_page > 0; if (!enable_prev) ImGui::BeginDisabled(); - if (ImGui::Button("<< Prev") && current_page > 0) current_page--; + if (ImGui::Button(localize("ui.prev")) && current_page > 0) current_page--; if (!enable_prev) ImGui::EndDisabled(); ImGui::SameLine(); @@ -111,7 +111,7 @@ static void draw_project_list() ImGui::SameLine(); bool enable_next = current_page < max_page-1; if (!enable_next) ImGui::BeginDisabled(); - if (ImGui::Button("Next >>") && current_page < max_page-1) current_page++; + if (ImGui::Button(localize("ui.next")) && current_page < max_page-1) current_page++; if (!enable_next) ImGui::EndDisabled(); ImGui::Spacing(); diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 1746111..77d2a45 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -18,6 +18,8 @@ country_tax_bracket* tax_brackets = 0; u32 cost_center_count; cost_center* cost_centers = 0; +static int select_company_tab = 0; + void ui_destroy_settings() { free(tax_brackets); @@ -26,6 +28,7 @@ void ui_destroy_settings() void ui_setup_settings() { + select_company_tab = 1; company_info = administration_company_info_get(); tax_bracket_count = administration_tax_bracket_count(); @@ -339,8 +342,9 @@ void ui_draw_settings() { if (ImGui::BeginTabBar("SettingsTabBar")) { - if (ImGui::BeginTabItem(localize("settings.table.company"))) + if (ImGui::BeginTabItem(localize("settings.table.company"), nullptr, select_company_tab == 1 ? ImGuiTabItemFlags_SetSelected : 0)) { + select_company_tab = 0; draw_contact_form(&company_info); // Save button. diff --git a/src/ui/ui_start.cpp b/src/ui/ui_start.cpp new file mode 100644 index 0000000..f1377ec --- /dev/null +++ b/src/ui/ui_start.cpp @@ -0,0 +1,50 @@ +#include "ui.hpp" +#include "imgui.h" +#include "administration.hpp" +#include "locales.hpp" +#include "tinyfiledialogs.h" +#include "administration_writer.hpp" + +void create_new_administration() +{ + // @localize + char const * lFilterPatterns[1] = { "*.openbook" }; + char* save_path = tinyfd_saveFileDialog("Select destination", NULL, 1, lFilterPatterns, NULL); + + if (!save_path) return; + + administration_create_empty(save_path); + + administration_writer_save_all_cost_centers_blocking(); + administration_writer_save_all_tax_brackets_blocking(); + administration_writer_save_all_administration_info_blocking(); + + ui_set_state(main_state::UI_SETTINGS); +} + +void ui_draw_start() +{ + // Get the window size + ImVec2 windowSize = ImGui::GetContentRegionAvail(); + + // Calculate half the width for each button + ImVec2 buttonSize(windowSize.x * 0.5f, windowSize.y); + + ImGui::Columns(2, nullptr, false); // 2 columns, no border + + // Left button + if (ImGui::Button("Create", buttonSize)) + { + create_new_administration(); + } + + ImGui::NextColumn(); + + // Right button + if (ImGui::Button("Load", buttonSize)) + { + // Handle Load action + } + + ImGui::Columns(1); // Reset columns +}
\ No newline at end of file |
