feat: Settings submenu (Settings.../About...), git column, projects tab

- main.cpp: registrar info About via fn_ui::about_window_set_info
- views.cpp: nueva columna "Git" en la tabla Apps (remote/local/-)
- data.h/cpp + data_http.cpp: AppRow gana repo_url + dir_path
- views.cpp: actions bar (Reindex / + Add / Reload / inbox) y modal Add
- views.cpp: tab Projects con tree + detalle anidado
- data_http.cpp: load_projects_http, load_project_detail_http, http_post_*
- http_client.cpp: SO_RCVTIMEO en Windows como DWORD ms (timeout 5 ms bug)
- CMakeLists: limpieza de srcs duplicados con fn_framework
- app.md: notas operativas y estado actual

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 22:04:58 +02:00
parent 57d8f0198a
commit a466fff71a
10 changed files with 800 additions and 59 deletions
+7 -4
View File
@@ -192,7 +192,7 @@ bool load_registry_data(const char* db_path, RegistryData& out) {
// --- Apps ---
out.apps.clear();
query(db,
"SELECT id, name, lang, domain, description, framework FROM apps ORDER BY name",
"SELECT id, name, lang, domain, description, framework, repo_url, dir_path FROM apps ORDER BY name",
[&](sqlite3_stmt* s) {
AppRow r;
r.id = col_str(s, 0);
@@ -201,19 +201,22 @@ bool load_registry_data(const char* db_path, RegistryData& out) {
r.domain = col_str(s, 3);
r.description = col_str(s, 4);
r.framework = col_str(s, 5);
r.repo_url = col_str(s, 6);
r.dir_path = col_str(s, 7);
out.apps.push_back(std::move(r));
});
// --- Analysis ---
out.analyses.clear();
query(db,
"SELECT id, name, domain, description FROM analysis ORDER BY name",
"SELECT id, name, lang, domain, description FROM analysis ORDER BY name",
[&](sqlite3_stmt* s) {
AnalysisRow r;
r.id = col_str(s, 0);
r.name = col_str(s, 1);
r.domain = col_str(s, 2);
r.description = col_str(s, 3);
r.lang = col_str(s, 2);
r.domain = col_str(s, 3);
r.description = col_str(s, 4);
out.analyses.push_back(std::move(r));
});