feat(cpp/framework): extender AppConfig con about, panels, layouts_cb, init_gl_loader

This commit is contained in:
2026-04-28 23:37:23 +02:00
parent c1b1d8fbad
commit 10e0b712ca
3 changed files with 65 additions and 0 deletions
+1
View File
@@ -105,6 +105,7 @@ add_library(fn_framework STATIC
functions/core/panel_menu.cpp
functions/core/layouts_menu.cpp
functions/core/app_menubar.cpp
functions/gfx/gl_loader.cpp
)
target_include_directories(fn_framework PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/framework
+28
View File
@@ -9,7 +9,9 @@
#include "core/icon_font.h"
#include "core/app_settings.h"
#include "core/app_about.h"
#include "core/app_menubar.h"
#include "core/fps_overlay.h"
#include "gfx/gl_loader.h"
#include <GLFW/glfw3.h>
#include <cstdio>
@@ -49,6 +51,17 @@ int run_app(AppConfig config, std::function<void()> render_fn) {
glfwMakeContextCurrent(window);
glfwSwapInterval(config.vsync ? 1 : 0);
// Carga punteros a funciones GL >= 2.0 si la app lo pide. En Linux es
// no-op; en Windows usa wglGetProcAddress (requiere ctx GL activo).
if (config.init_gl_loader) {
if (!fn::gfx::gl_loader_init()) {
fprintf(stderr, "Failed to initialize GL function loader\n");
glfwDestroyWindow(window);
glfwTerminate();
return 1;
}
}
// Setup ImGui
IMGUI_CHECKVERSION();
ImGui::CreateContext();
@@ -63,6 +76,14 @@ int run_app(AppConfig config, std::function<void()> render_fn) {
// fuentes. Si no existe el .ini, los defaults se aplican.
fn_ui::settings_load();
// Registra info de la ventana About si la app la proveyo en AppConfig.
if (config.about.name != nullptr) {
fn_ui::about_window_set_info(
config.about.name,
config.about.version ? config.about.version : "",
config.about.description ? config.about.description : "");
}
// Texto vectorial (Karla / Roboto / DroidSans / Cousine, segun settings)
// + iconos Tabler mergeados al mismo tamaño en el mismo ImFont.
fn_ui::load_fonts_from_settings();
@@ -127,6 +148,13 @@ int run_app(AppConfig config, std::function<void()> render_fn) {
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// Menubar canonica (View / Layouts / Settings / About) si la app la
// configuro en AppConfig. Se renderiza ANTES del render_fn para que
// el render_fn pueda hacer DockSpaceOverViewport debajo.
if (config.panels != nullptr || config.layouts_cb != nullptr) {
fn_ui::app_menubar(config.panels, config.panel_count, config.layouts_cb);
}
render_fn();
// Ventana de Settings (no-op si esta cerrada).
+36
View File
@@ -1,7 +1,24 @@
#pragma once
#include <cstddef>
#include <functional>
// Forward declarations para evitar incluir headers pesados aqui. Las
// definiciones reales viven en cpp/functions/core/*.h y se incluyen desde
// app_base.cpp.
namespace fn_ui {
struct PanelToggle;
struct LayoutCallbacks;
// Info estatica para la ventana About. Si name != nullptr, fn::run_app
// llama about_window_set_info(name, version, description) tras settings_load().
struct AppAboutInfo {
const char* name = nullptr;
const char* version = nullptr;
const char* description = nullptr;
};
}
namespace fn {
// Modos de tema para run_app.
@@ -22,6 +39,25 @@ struct AppConfig {
float bg_r = 0.102f; // fn_tokens::colors::bg (dark.7 #1A1B1E)
float bg_g = 0.106f;
float bg_b = 0.118f;
// About window. Si about.name != nullptr, run_app llama
// fn_ui::about_window_set_info(name, version, description) tras settings_load().
fn_ui::AppAboutInfo about{};
// Paneles toggleables del menubar. Si panels != nullptr y panel_count > 0,
// run_app llama fn_ui::app_menubar(panels, panel_count, layouts_cb) cada frame
// ANTES de render_fn().
const fn_ui::PanelToggle* panels = nullptr;
std::size_t panel_count = 0;
// Callbacks de layouts persistentes. Si layouts_cb != nullptr, run_app
// llama fn_ui::app_menubar(panels, panel_count, layouts_cb) cada frame.
fn_ui::LayoutCallbacks* layouts_cb = nullptr;
// Si true, run_app llama fn::gfx::gl_loader_init() tras crear el contexto
// GL y antes del primer frame. Necesario para apps que llaman gl* directo
// en Windows (en Linux es no-op).
bool init_gl_loader = false;
};
// Run an ImGui application. The render_fn is called every frame