feat(cpp/core): parallel_for thread pool + slider widget

parallel_for_cpp_core: ThreadPool reutilizable con parallel_for(begin, end, fn)
y parallel_for_chunks(begin, end, fn(tid, lo, hi)). Captura excepciones del
worker y las relanza en el caller. Pareja CPU del despacho GPU para Monte
Carlo multi-core cuando dispatch GPU no compensa.

slider_cpp_core: wrapper de ImGui::SliderFloat/Int/Double con label muted
arriba, tokens (primary grab), full-width. Variantes float, float_log
(logaritmico), int, double. Para los calculadores que tienen 15-30 sliders
cada uno y se beneficia del estilo consistente.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-04 11:52:50 +02:00
parent 7b0384c804
commit ea899daa14
6 changed files with 436 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
---
name: slider
kind: function
lang: cpp
domain: core
version: "1.0.0"
purity: impure
signature: "bool slider_float(const char* label, float* v, float min, float max, const char* fmt); bool slider_float_log(...); bool slider_int(const char* label, int* v, int min, int max, const char* fmt); bool slider_double(const char* label, double* v, double min, double max, const char* fmt)"
description: "Slider ImGui con label muted arriba, estilo acorde con fn_tokens (radius, border, primary grab). Variantes float, float_log (logaritmico), int, double. Equivalente al <Slider> de Mantine / fn_library."
tags: [imgui, slider, ui, tokens, mantine, core]
uses_functions: ["tokens_cpp_core"]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [imgui.h, cstdio]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/slider.cpp"
framework: imgui
params:
- name: label
desc: "Texto del label (mostrado en text_muted arriba). Tambien se usa como id ImGui (concatenado con ##)."
- name: value
desc: "Pointer al valor; mutado in-place si el usuario lo cambia."
- name: min_v
desc: "Limite inferior."
- name: max_v
desc: "Limite superior."
- name: fmt
desc: "printf-format para el value display. Float default '%.3f'; int default '%d'."
output: "Renderiza label + slider full-width. Devuelve true si el valor cambio este frame."
---
# slider
Slider canonico para los calculadores. Cada calculadora del set tiene 15-30 sliders; tener uno consistente con tokens y full-width acelera el desarrollo y mantiene la identidad visual.
## Patron tipico
```cpp
static float prob = 0.2f;
if (fn_ui::slider_float("Probabilidad de hit", &prob, 0.0f, 1.0f, "%.3f")) {
recalculate();
}
static float sigma = 0.1f;
fn_ui::slider_float_log("Proposal sigma (log)", &sigma, 0.001f, 10.0f, "%.4f");
static int n_chains = 4;
fn_ui::slider_int("Numero de cadenas", &n_chains, 1, 16);
static double mu = 0.0;
fn_ui::slider_double("Mu", &mu, -10.0, 10.0, "%.6f");
```
## Estilo
Usa `fn_tokens::colors::primary` para el grab (mismo color que `button` primary). Background `bg`, border `border`, radius `sm`. Coincide con la identidad de `text_input` y demas widgets `core`.
## Notas
- `slider_double` down-castea a float internamente (ImGui no expone SliderDouble). Si tu rango requiere fp64 usa `text_input` con parsing manual.
- El label es tambien el id ImGui — duplicar labels en el mismo frame causa colision (ImGui asigna ids unicos basados en label). Si necesitas dos sliders con el mismo nombre visible, agregar un sufijo distinto (ej. "Mu##chain1" / "Mu##chain2").
- Para multi-value (vec2/vec3) — no incluido aqui; usar 2/3 sliders separados o ImGui::SliderFloat2/3 directamente.