feat(framework): cfg.pre_frame hook for apps with own LayoutStorage
Apps que gestionan su propio LayoutStorage (cfg.auto_layouts=false + cfg.layouts_cb=&own_cb) necesitan llamar layout_storage_apply_pending en el momento correcto: despues de ImGui::NewFrame y ANTES de menubar + auto-dockspace + cualquier Begin() del frame. Antes, si la app llamaba apply_pending dentro de render_fn (es decir, mid-frame), ImGui cargaba el INI pero las dock-nodes no se restauraban hasta el siguiente ciclo: las ventanas docked aparecian flotantes. cfg.pre_frame es un std::function<void()> opcional que run_app y run_app_test invocan justo despues de NewFrame, antes del bloque auto_layouts_storage, antes de app_menubar y antes del auto-dockspace. Default null = no-op, sin impacto en apps existentes. Apps con auto_layouts=true (la mayoria) no necesitan tocar nada — el framework ya hace apply_pending en su propio bloque. pre_frame es puramente para apps con layout custom. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -143,11 +143,29 @@ struct AppConfig {
|
||||
// en Windows (en Linux es no-op).
|
||||
bool init_gl_loader = false;
|
||||
|
||||
// Auto-dockspace: si true, run_app llama
|
||||
// ImGui::DockSpaceOverViewport(0, GetMainViewport(), PassthruCentralNode)
|
||||
// ANTES de render_fn() cada frame. Asi cualquier app obtiene un dockspace
|
||||
// central donde re-anclar ventanas flotantes (incl. viewports OS) sin
|
||||
// tocar su render(). Apps con layout custom (shaders_lab) o galerias
|
||||
// (primitives_gallery) pueden poner false para gestionarlo ellas.
|
||||
bool auto_dockspace = true;
|
||||
|
||||
// Logging opcional. Si log.file_path != nullptr, run_app inicializa el
|
||||
// logger global antes del primer frame y lo cierra al exit. La ventana
|
||||
// "Logs..." en el menubar siempre esta disponible (lee del buffer
|
||||
// in-memory aunque no haya archivo).
|
||||
fn_ui::AppLogConfig log{};
|
||||
|
||||
// Hook opcional ejecutado al inicio de cada frame (despues de
|
||||
// ImGui::NewFrame, ANTES de app_menubar y de auto-dockspace). Pensado para
|
||||
// que apps con LayoutStorage propio llamen layout_storage_apply_pending
|
||||
// en el momento correcto: ImGui requiere LoadIniSettingsFromMemory antes
|
||||
// de cualquier Begin() del frame para que las dock-nodes guardadas se
|
||||
// restauren correctamente. Si la app llama LoadIni mid-frame (dentro de
|
||||
// render_fn) las ventanas docked aparecen flotantes hasta el siguiente
|
||||
// ciclo. Default null = no-op.
|
||||
std::function<void()> pre_frame{};
|
||||
};
|
||||
|
||||
// Run an ImGui application. The render_fn is called every frame
|
||||
|
||||
Reference in New Issue
Block a user