#include "ui.hpp" #include "imgui.h" #include "administration.hpp" #include "locales.hpp" #include "tinyfiledialogs.h" #include "administration_writer.hpp" #include "administration_reader.hpp" 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, ui_draw_earnings, 0, ui_draw_projects, ui_draw_settings, ui_draw_log, ui_draw_start, }; void (*setupcalls[main_state::UI_END])(void) = { ui_setup_invoices, ui_setup_expenses, ui_setup_contacts, ui_setup_earnings, 0, ui_setup_projects, ui_setup_settings, 0, 0, }; void (*destroycalls[main_state::UI_END])(void) = { ui_destroy_invoices, ui_destroy_expenses, 0, ui_destroy_earnings, 0, 0, ui_destroy_settings, 0, 0, }; void ui_set_state(main_state 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 ui_draw_main() { 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("New")) { administration_reader_open_new(); } if (ImGui::MenuItem("Open")) { /* Handle Save */ } ImGui::EndMenu(); } if (ImGui::BeginMenu("Help")) { if (ImGui::MenuItem("Event Log")) { ui_set_state(main_state::UI_LOG); } ImGui::EndMenu(); } ImGui::EndMainMenuBar(); } ImGuiIO& io = ImGui::GetIO(); float menuBarHeight = ImGui::GetFrameHeight(); float statusBarHeight = 26.0f; float sidePanelWidth = 120.0f; ImGui::SetNextWindowPos(ImVec2(0, menuBarHeight)); ImGui::SetNextWindowSize(ImVec2(sidePanelWidth, io.DisplaySize.y - menuBarHeight - statusBarHeight)); 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); { // 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(); 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)); } // Main content ImGui::Begin("AccountingMainWindow", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); if (drawcalls[ui_state]) drawcalls[ui_state](); 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); char* path = administration_file_path_get(); if (strlen(path) == 0) { ImGui::Text("%s: %s", localize("ui.workingOn"), localize("ui.unsavedProject")); } else { ImGui::Text("%s: %s", localize("ui.workingOn"), administration_file_path_get()); } ImGui::SameLine(); ui_draw_status(); ImGui::End(); ImGui::PopStyleVar(); }