refactor(shaders_lab): migrar layouts inline a layout_storage publico
Sustituye ~30 lineas de cableado manual de save/load/list/delete contra
layout_storage_sqlite por dos llamadas a la nueva API publica:
g_layouts = fn_ui::layout_storage_open("shaders_lab.db");
fn_ui::layout_storage_make_callbacks(g_layouts, g_layout_cb);
El blob pendiente lo gestiona el storage (layout_storage_apply_pending).
on_reset se override para ademas re-mostrar los paneles de shaders_lab.
La tabla ui_layouts heredada queda intacta — la nueva API usa
imgui_layouts en la misma BD.
This commit is contained in:
@@ -16,8 +16,8 @@ add_imgui_app(shaders_lab
|
|||||||
${CMAKE_SOURCE_DIR}/functions/gfx/dag_node_previews.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/dag_node_previews.cpp
|
||||||
${CMAKE_SOURCE_DIR}/functions/gfx/shaderlab_db.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/shaderlab_db.cpp
|
||||||
${CMAKE_SOURCE_DIR}/functions/gfx/code_to_generator.cpp
|
${CMAKE_SOURCE_DIR}/functions/gfx/code_to_generator.cpp
|
||||||
# fps_overlay, panel_menu, layouts_menu, app_menubar ya viven en fn_framework
|
# fps_overlay, panel_menu, layouts_menu, app_menubar, layout_storage ya
|
||||||
${CMAKE_SOURCE_DIR}/functions/core/layout_storage_sqlite.cpp
|
# viven en fn_framework.
|
||||||
)
|
)
|
||||||
target_include_directories(shaders_lab PRIVATE
|
target_include_directories(shaders_lab PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
#include "core/panel_menu.h"
|
#include "core/panel_menu.h"
|
||||||
#include "core/layouts_menu.h"
|
#include "core/layouts_menu.h"
|
||||||
#include "core/app_menubar.h"
|
#include "core/app_menubar.h"
|
||||||
#include "core/layout_storage_sqlite.h"
|
#include "core/layout_storage.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
@@ -71,9 +71,10 @@ static bool g_show_functions = true;
|
|||||||
static bool g_show_generated = true;
|
static bool g_show_generated = true;
|
||||||
|
|
||||||
// ── Layouts (named ImGui ini snapshots persisted in shaders_lab.db) ───────
|
// ── Layouts (named ImGui ini snapshots persisted in shaders_lab.db) ───────
|
||||||
|
// El storage opaco encapsula la BD y el blob pendiente. Los callbacks
|
||||||
|
// envuelven save/apply/delete/reset y se pasan a app_menubar tal cual.
|
||||||
|
static fn_ui::LayoutStorage* g_layouts = nullptr;
|
||||||
static fn_ui::LayoutCallbacks g_layout_cb;
|
static fn_ui::LayoutCallbacks g_layout_cb;
|
||||||
static std::string g_pending_layout_blob; // applied at start of next frame
|
|
||||||
static std::string g_pending_layout_name; // becomes active_name after apply
|
|
||||||
|
|
||||||
// ── Save-as-generator modal state ─────────────────────────────────────────
|
// ── Save-as-generator modal state ─────────────────────────────────────────
|
||||||
static bool g_save_modal_open = false;
|
static bool g_save_modal_open = false;
|
||||||
@@ -222,13 +223,8 @@ static void load_user_generators_into_catalog() {
|
|||||||
static void render() {
|
static void render() {
|
||||||
// Apply pending layout BEFORE any ImGui::Begin this frame.
|
// Apply pending layout BEFORE any ImGui::Begin this frame.
|
||||||
// (LoadIniSettingsFromMemory must happen before windows are submitted.)
|
// (LoadIniSettingsFromMemory must happen before windows are submitted.)
|
||||||
if (!g_pending_layout_blob.empty()) {
|
std::string applied = fn_ui::layout_storage_apply_pending(g_layouts);
|
||||||
ImGui::LoadIniSettingsFromMemory(g_pending_layout_blob.c_str(),
|
if (!applied.empty()) g_layout_cb.active_name = applied;
|
||||||
g_pending_layout_blob.size());
|
|
||||||
g_layout_cb.active_name = g_pending_layout_name;
|
|
||||||
g_pending_layout_blob.clear();
|
|
||||||
g_pending_layout_name.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g_canvas_code.initialized) fn::gfx::canvas_init(g_canvas_code);
|
if (!g_canvas_code.initialized) fn::gfx::canvas_init(g_canvas_code);
|
||||||
if (!g_canvas_dag.initialized) fn::gfx::canvas_init(g_canvas_dag);
|
if (!g_canvas_dag.initialized) fn::gfx::canvas_init(g_canvas_dag);
|
||||||
@@ -412,37 +408,20 @@ int main() {
|
|||||||
load_user_generators_into_catalog();
|
load_user_generators_into_catalog();
|
||||||
ensure_dag_default();
|
ensure_dag_default();
|
||||||
|
|
||||||
// Layout persistence on the same shaders_lab.db connection.
|
// Layout persistence: handle opaco que crea su propia tabla
|
||||||
sqlite3* db = fn::gfx::shaderlab_db_handle();
|
// imgui_layouts en shaders_lab.db (CREATE IF NOT EXISTS, no toca la
|
||||||
fn_ui::layout_storage_init(db);
|
// tabla ui_layouts heredada). Cualquier app del registry puede usar
|
||||||
|
// este patron.
|
||||||
|
g_layouts = fn_ui::layout_storage_open("shaders_lab.db");
|
||||||
|
fn_ui::layout_storage_make_callbacks(g_layouts, g_layout_cb);
|
||||||
|
|
||||||
g_layout_cb.list = [db]() {
|
// Override de on_reset: ademas de limpiar el INI, re-mostrar todos
|
||||||
return fn_ui::layout_storage_list(db);
|
// los paneles especificos de shaders_lab.
|
||||||
};
|
|
||||||
g_layout_cb.on_apply = [db](const std::string& name) {
|
|
||||||
std::string blob = fn_ui::layout_storage_load_blob(db, name);
|
|
||||||
if (!blob.empty()) {
|
|
||||||
g_pending_layout_blob = std::move(blob);
|
|
||||||
g_pending_layout_name = name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
g_layout_cb.on_save = [db](const std::string& name) {
|
|
||||||
size_t size = 0;
|
|
||||||
const char* blob = ImGui::SaveIniSettingsToMemory(&size);
|
|
||||||
if (blob && size > 0) {
|
|
||||||
fn_ui::layout_storage_save(db, name, std::string(blob, size));
|
|
||||||
g_layout_cb.active_name = name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
g_layout_cb.on_delete = [db](const std::string& name) {
|
|
||||||
fn_ui::layout_storage_delete(db, name);
|
|
||||||
if (g_layout_cb.active_name == name) g_layout_cb.active_name.clear();
|
|
||||||
};
|
|
||||||
g_layout_cb.on_reset = []() {
|
g_layout_cb.on_reset = []() {
|
||||||
// Default reset: open every panel and clear active layout marker.
|
|
||||||
// The actual dock layout is whatever ImGui rebuilt on first launch.
|
|
||||||
g_show_code = g_show_dag = g_show_canvas_c = g_show_canvas_d =
|
g_show_code = g_show_dag = g_show_canvas_c = g_show_canvas_d =
|
||||||
g_show_controls = g_show_functions = g_show_generated = true;
|
g_show_controls = g_show_functions = g_show_generated = true;
|
||||||
|
ImGui::LoadIniSettingsFromMemory("", 0);
|
||||||
|
ImGui::GetIO().WantSaveIniSettings = true;
|
||||||
g_layout_cb.active_name.clear();
|
g_layout_cb.active_name.clear();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -456,6 +435,7 @@ int main() {
|
|||||||
fn::gfx::canvas_destroy(g_canvas_dag);
|
fn::gfx::canvas_destroy(g_canvas_dag);
|
||||||
fn::gfx::dag_node_editor_destroy();
|
fn::gfx::dag_node_editor_destroy();
|
||||||
fn::gfx::dag_previews_destroy();
|
fn::gfx::dag_previews_destroy();
|
||||||
|
fn_ui::layout_storage_close(g_layouts);
|
||||||
fn::gfx::shaderlab_db_close();
|
fn::gfx::shaderlab_db_close();
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user