summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-09-12 18:21:53 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-09-12 18:21:53 +0200
commit5159a53e58cd4b3652ce6255856d50e15c275f80 (patch)
tree736d854c472cea59ae919cdc824730819787d4d0
parentabf01f657d068aa6b22ab962cbe01b88f3b5f7ea (diff)
startup views & new administration setup
-rw-r--r--include/administration.hpp3
-rw-r--r--include/administration_writer.hpp4
-rw-r--r--include/ui.hpp32
-rw-r--r--src/administration.cpp28
-rw-r--r--src/administration_writer.cpp6
-rw-r--r--src/locales/en.cpp4
-rw-r--r--src/ui/ui_contacts.cpp4
-rw-r--r--src/ui/ui_earnings.cpp4
-rw-r--r--src/ui/ui_expenses.cpp21
-rw-r--r--src/ui/ui_invoices.cpp21
-rw-r--r--src/ui/ui_main.cpp119
-rw-r--r--src/ui/ui_projects.cpp4
-rw-r--r--src/ui/ui_settings.cpp6
-rw-r--r--src/ui/ui_start.cpp50
14 files changed, 219 insertions, 87 deletions
diff --git a/include/administration.hpp b/include/administration.hpp
index e270475..9df4335 100644
--- a/include/administration.hpp
+++ b/include/administration.hpp
@@ -331,6 +331,7 @@ typedef struct
// =======================
void administration_create();
void administration_destroy();
+void administration_create_empty(char* save_file);
// Other functions.
// =======================
@@ -341,6 +342,8 @@ void administration_company_info_set(contact data);
void administration_create_income_statement(income_statement* statement);
char* administration_get_currency_symbol_from_currency(char* code);
char* administration_get_default_currency();
+bool administration_can_create_invoices();
+bool administration_is_loaded();
// Contact functions.
// =======================
diff --git a/include/administration_writer.hpp b/include/administration_writer.hpp
index b46927f..fa5f0db 100644
--- a/include/administration_writer.hpp
+++ b/include/administration_writer.hpp
@@ -14,4 +14,8 @@ bool administration_writer_save_tax_bracket_blocking(country_tax_bracket bracket
bool administration_writer_save_contact_blocking(contact c);
bool administration_writer_save_invoice_blocking(invoice inv);
+bool administration_writer_save_all_administration_info_blocking();
+bool administration_writer_save_all_tax_brackets_blocking();
+bool administration_writer_save_all_cost_centers_blocking();
+
bool administration_writer_save_all_async(); \ No newline at end of file
diff --git a/include/ui.hpp b/include/ui.hpp
index 7bbdd5a..6364c55 100644
--- a/include/ui.hpp
+++ b/include/ui.hpp
@@ -12,6 +12,21 @@
typedef enum
{
+ UI_INVOICES = 0,
+ UI_EXPENSES = 1,
+ UI_CONTACTS = 2,
+ UI_REPORT_RESULTS = 3,
+ UI_REPORT_TAX = 4,
+ UI_PROJECTS = 5,
+ UI_SETTINGS = 6,
+ UI_LOG = 7,
+ UI_START = 8,
+
+ UI_END
+} main_state;
+
+typedef enum
+{
LIST,
EDIT,
CREATE,
@@ -30,14 +45,16 @@ typedef struct
extern ImFont* fontBold;
-void ui_helper_draw_required_tag();
+void ui_helper_draw_required_tag();
+
+ui_status ui_get_status();
+void ui_set_status_loading(bool loading);
+void ui_set_status_error(const char* txt);
+void ui_set_status_ex(const char* txt, int color);
+void ui_set_status(const char* txt);
+void ui_draw_status();
-void ui_set_status_loading(bool loading);
-void ui_set_status_error(const char* txt);
-void ui_set_status_ex(const char* txt, int color);
-void ui_set_status(const char* txt);
-ui_status ui_get_status();
-void ui_draw_status();
+void ui_set_state(main_state state);
void ui_draw_main();
void ui_draw_contacts();
@@ -47,6 +64,7 @@ void ui_draw_settings();
void ui_draw_expenses();
void ui_draw_earnings();
void ui_draw_log();
+void ui_draw_start();
void ui_setup_invoices();
void ui_setup_contacts();
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