diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-09-27 14:23:56 +0200 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2025-09-27 14:23:56 +0200 |
| commit | fa088bb60692ba02d30d39affa9a31d9e2b688e2 (patch) | |
| tree | a2d51585c0f86407709b834bd7a82a5672d2c17b /src | |
| parent | aa7b5ef6ab4f45d2e8e0caa7942db31fc60b3861 (diff) | |
ai service settings
Diffstat (limited to 'src')
| -rw-r--r-- | src/administration.cpp | 13 | ||||
| -rw-r--r-- | src/administration_reader.cpp | 6 | ||||
| -rw-r--r-- | src/administration_writer.cpp | 5 | ||||
| -rw-r--r-- | src/locales/en.cpp | 6 | ||||
| -rw-r--r-- | src/ui/imgui_extensions.cpp | 6 | ||||
| -rw-r--r-- | src/ui/ui_settings.cpp | 41 |
6 files changed, 74 insertions, 3 deletions
diff --git a/src/administration.cpp b/src/administration.cpp index c451f9b..e1405b8 100644 --- a/src/administration.cpp +++ b/src/administration.cpp @@ -305,6 +305,8 @@ void administration_create() list_init(&g_administration.cost_centers); strops_copy(g_administration.path, "", sizeof(g_administration.path)); + memset(&g_administration.ai_service, 0, sizeof(ai_service)); + log_info("Setup took %.3fms.", STOPWATCH_TIME); } @@ -361,6 +363,17 @@ void administration_create_default(char* save_file) // Other functions. // ======================= +ai_service administration_get_ai_service() +{ + return g_administration.ai_service; +} + +void administration_set_ai_service(ai_service provider) +{ + g_administration.ai_service = provider; + if (data_changed_event_callback) data_changed_event_callback(); +} + void administration_set_next_id(s32 nr) { g_administration.next_id = nr; diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp index 9c20a27..b8b4958 100644 --- a/src/administration_reader.cpp +++ b/src/administration_reader.cpp @@ -386,6 +386,12 @@ bool administration_reader_import_administration_info(char* buffer, size_t buffe administration_set_next_id(xml_get_s32(root, "NextId")); administration_set_next_sequence_number(xml_get_s32(root, "NextSequenceNumber")); + ai_service ai_service; + ai_service.provider = (ai_provider)xml_get_s32_x(root, "AIService", "Provider", 0); + xml_get_str_x(root, ai_service.api_key_public, MAX_LEN_API_KEY, "AIService", "PublicKey", 0); + xml_get_str_x(root, ai_service.api_key_private, MAX_LEN_API_KEY, "AIService", "PrivateKey", 0); + administration_set_ai_service(ai_service); + log_info("Loaded administration info in %.3fms. next_id=%d next_sequence_number=%d", STOPWATCH_TIME, administration_get_next_id(), administration_get_next_sequence_number()); diff --git a/src/administration_writer.cpp b/src/administration_writer.cpp index 0cc4cd8..8bcf741 100644 --- a/src/administration_writer.cpp +++ b/src/administration_writer.cpp @@ -785,6 +785,11 @@ bool administration_writer_save_all_administration_info_blocking() strops_replace_int32(file_content, buf_length, "{{NEXT_SEQUENCE_NUMBER}}", administration_get_next_sequence_number()); strops_replace(file_content, buf_length, "{{PROGRAM_VERSION}}", PROGRAM_VERSION); + ai_service ai_service = administration_get_ai_service(); + strops_replace_int32(file_content, buf_length, "{{AI_SERVICE_PROVIDER}}", (s32)ai_service.provider); + strops_replace(file_content, buf_length, "{{AI_SERVICE_PUBLIC_KEY}}", ai_service.api_key_public); + strops_replace(file_content, buf_length, "{{AI_SERVICE_PRIVATE_KEY}}", ai_service.api_key_private); + //// Write to Disk. int final_length = (int)strlen(file_content); if (!xml_parse_document((uint8_t*)file_content, final_length)) result = 0; diff --git a/src/locales/en.cpp b/src/locales/en.cpp index 36b9876..0152928 100644 --- a/src/locales/en.cpp +++ b/src/locales/en.cpp @@ -139,10 +139,16 @@ locale_entry en_locales[] = { {"settings.table.company", "Company"}, {"settings.table.vatrates", "VAT Rates"}, {"settings.table.costcenters", "Cost Centers"}, + {"settings.table.services", "Services"}, {"settings.vat.table.country", "Country"}, {"settings.vat.table.rates", "Rates"}, {"settings.costcenters.table.code", "Code"}, {"settings.costcenters.table.description", "Description"}, + {"settings.services.ai_service", "AI Service"}, + {"settings.services.ai_service.provider", "Provider"}, + + {"settings.services.ai_service.privkey", "Public key"}, + {"settings.services.ai_service.pubkey", "Private key"}, // Invoice/expense strings. {"invoice.form.costcenter", "Cost center"}, diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp index 483f5f6..4dc1fb9 100644 --- a/src/ui/imgui_extensions.cpp +++ b/src/ui/imgui_extensions.cpp @@ -49,12 +49,12 @@ namespace ImGui float widthAvailable = ImGui::GetContentRegionAvail().x; ImGui::SetNextItemWidth(widthAvailable*0.5f); - if (ImGui::Button("Select file...")) + if (ImGui::Button("Select file...")) // @localize { // You can adjust filters, title, default path const char *filterPatterns[] = { "*.png", "*.jpg", "*.pdf", "*" }; const char *file = tinyfd_openFileDialog( - "Choose a file", // dialog title + "Choose a file", // dialog title // @localize NULL, // default path 4, // number of filter patterns filterPatterns, // filter patterns array @@ -77,7 +77,7 @@ namespace ImGui result = true; } ImGui::SameLine(); - ImGui::TextWrapped("Selected: %s", buffer); + ImGui::TextWrapped("Selected: %s", buffer); // @localize } diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index 892e580..1f9fe5a 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -35,6 +35,7 @@ u32 cost_center_count; cost_center* cost_centers = 0; static int select_company_tab = 0; +static ai_service new_service; void ui_destroy_settings() { @@ -54,6 +55,8 @@ void ui_setup_settings() cost_center_count = administration_cost_center_count(); cost_centers = (cost_center*)malloc(cost_center_count * sizeof(cost_center)); administration_cost_center_get_all(cost_centers); + + new_service = administration_get_ai_service(); } static void ui_draw_vat_rates() @@ -330,6 +333,39 @@ static void ui_draw_cost_centers() } } +static void ui_draw_services() +{ + // AI service + if (ImGui::CollapsingHeader(localize("settings.services.ai_service"))) + { + char* services[1] = { + "OpenAI" + }; + + if (ImGui::BeginCombo(localize("settings.services.ai_service.provider"), services[new_service.provider])) + { + for (u32 n = 0; n < 1; n++) + { + bool is_selected = n == (uint32_t)new_service.provider; + if (ImGui::Selectable(services[n], is_selected)) { + new_service.provider = (ai_provider)n; + } + } + ImGui::EndCombo(); + } + + ImGui::InputTextWithHint(localize("settings.services.ai_service.pubkey"), localize("settings.services.ai_service.pubkey"), + new_service.api_key_public, sizeof(new_service.api_key_public)); + + ImGui::InputTextWithHint(localize("settings.services.ai_service.privkey"), localize("settings.services.ai_service.privkey"), + new_service.api_key_private, sizeof(new_service.api_key_private)); + + if (ImGui::Button(localize("form.save"))) { + administration_set_ai_service(new_service); + } + } +} + void ui_draw_settings() { if (ImGui::BeginTabBar("SettingsTabBar")) @@ -360,6 +396,11 @@ void ui_draw_settings() ui_draw_cost_centers(); ImGui::EndTabItem(); } + if (ImGui::BeginTabItem(localize("settings.table.services"))) + { + ui_draw_services(); + ImGui::EndTabItem(); + } ImGui::EndTabBar(); } }
\ No newline at end of file |
