From 0d70098dd5b704f2953c63f0c827b46b11935b81 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Thu, 8 Jan 2026 17:40:15 +0100 Subject: setup window --- src/administration_reader.cpp | 2 ++ src/main_linux.cpp | 69 ++++++++++++++++++++++++++++++++++--------- src/ui/ui_main.cpp | 16 +++++++++- src/ui/ui_setup.cpp | 41 +++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 15 deletions(-) create mode 100644 src/ui/ui_setup.cpp (limited to 'src') diff --git a/src/administration_reader.cpp b/src/administration_reader.cpp index 2c94028..a5f2449 100644 --- a/src/administration_reader.cpp +++ b/src/administration_reader.cpp @@ -47,6 +47,8 @@ bool administration_reader::open_existing(char* file_path) if (!file_path) return false; } + if (!tinyfd_fileExists(file_path)) return false; + STOPWATCH_START; administration::create_from_file(file_path); diff --git a/src/main_linux.cpp b/src/main_linux.cpp index 1d05aff..e605659 100644 --- a/src/main_linux.cpp +++ b/src/main_linux.cpp @@ -33,27 +33,47 @@ #pragma comment(lib, "legacy_stdio_definitions") #endif +static GLFWwindow* window = 0; +static bool redo_window = 0; + +void ui::recreate_window_for_main_views() +{ + redo_window = 1; +} + static void glfw_error_callback(int error, const char* description) { fprintf(stderr, "GLFW Error %d: %s\n", error, description); } -// Main code -int main(int argc, char** argv) +static void _create_window(bool is_setup_window) { - glfwSetErrorCallback(glfw_error_callback); - if (!glfwInit()) - return 1; + if (window) { + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + glfwDestroyWindow(window); + } - // Create window with graphics context float main_scale = ImGui_ImplGlfw_GetContentScaleForMonitor(glfwGetPrimaryMonitor()); // Valid on GLFW 3.3+ only - GLFWwindow* window = glfwCreateWindow((int)(1280 * main_scale), (int)(800 * main_scale), "OpenBooks", nullptr, nullptr); + int windowWidth = (int)(1280 * main_scale); + int windowHeight = (int)(800 * main_scale); + + if (is_setup_window) { + glfwWindowHint(GLFW_RESIZABLE, false); + windowWidth = (int)(800 * main_scale); + windowHeight = (int)(500 * main_scale); + } + else { + glfwWindowHint(GLFW_RESIZABLE, true); + } + + window = glfwCreateWindow(windowWidth, windowHeight, "OpenBooks", nullptr, nullptr); if (window == nullptr) - return 1; + return; glfwMakeContextCurrent(window); glfwSwapInterval(1); // Enable vsync - // Setup Dear ImGui context IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; @@ -77,19 +97,35 @@ int main(int argc, char** argv) io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Regular.ttf"); ui::fontBold = io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Bold.ttf"); ui::fontBig = io.Fonts->AddFontFromFileTTF("/home/aldrik/Projects/open-books/build/Roboto-Bold.ttf", 30); - - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); +} - timer_lib_initialize(); - administration_writer::create(); +// Main code +int main(int argc, char** argv) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; if (argc < 2) { administration::create_default(""); + _create_window(true); } else { - administration_reader::open_existing(argv[1]); + if (administration_reader::open_existing(argv[1])) { + _create_window(false); + ui::set_state(ui::main_state::UI_INVOICES); + } + else { + _create_window(true); + } } + + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + timer_lib_initialize(); + administration_writer::create(); + while (!glfwWindowShouldClose(window)) { glfwPollEvents(); @@ -118,6 +154,11 @@ int main(int argc, char** argv) glfwMakeContextCurrent(window); glfwSwapBuffers(window); + + if (redo_window) { + _create_window(false); + redo_window = 0; + } } administration_writer::save_activities_blocking(); diff --git a/src/ui/ui_main.cpp b/src/ui/ui_main.cpp index dde0882..0aad2ec 100644 --- a/src/ui/ui_main.cpp +++ b/src/ui/ui_main.cpp @@ -32,6 +32,7 @@ void (*drawcalls[ui::main_state::UI_END])(void) = { ui::draw_projects, ui::draw_settings, ui::draw_log, + ui::draw_setup, }; void (*setupcalls[ui::main_state::UI_END])(void) = { @@ -43,6 +44,7 @@ void (*setupcalls[ui::main_state::UI_END])(void) = { ui::setup_projects, ui::setup_settings, 0, + ui::setup_setup, }; void (*destroycalls[ui::main_state::UI_END])(void) = { @@ -54,6 +56,7 @@ void (*destroycalls[ui::main_state::UI_END])(void) = { 0, ui::destroy_settings, 0, + ui::destroy_setup, }; void ui::set_state(ui::main_state state) @@ -65,7 +68,18 @@ void ui::set_state(ui::main_state state) void ui::draw_main() { - if (ui_state == ui::main_state::UI_END) ui::set_state(ui::main_state::UI_INVOICES); + if (ui_state == ui::main_state::UI_END) ui::set_state(ui::main_state::UI_SETUP); + + if (ui_state == ui::main_state::UI_SETUP) { + ImGuiIO& io = ImGui::GetIO(); + ImGui::SetNextWindowPos(ImVec2(0, 0)); + ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, io.DisplaySize.y)); + + ImGui::Begin("AccountingMainWindow", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse); + if (drawcalls[ui_state]) drawcalls[ui_state](); + ImGui::End(); + return; + } if (ImGui::BeginMainMenuBar()) { diff --git a/src/ui/ui_setup.cpp b/src/ui/ui_setup.cpp new file mode 100644 index 0000000..4f4a120 --- /dev/null +++ b/src/ui/ui_setup.cpp @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2025 Aldrik Ramaekers +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "ui.hpp" +#include "imgui.h" +#include "locales.hpp" +#include "administration_writer.hpp" +#include "administration_reader.hpp" + +void ui::draw_setup() +{ + if (ImGui::Button("Load administration")) { + if (administration_reader::open_existing(NULL)) { + ui::set_state(ui::main_state::UI_SETTINGS); + ui::recreate_window_for_main_views(); + } + } +} + +void ui::setup_setup() +{ + +} + +void ui::destroy_setup() +{ + +} \ No newline at end of file -- cgit v1.2.3-70-g09d2