# ColorPicker

> Elección de color mediante matriz matiz×saturación + slider de brillo.

Source: https://crossfly.dev/es/docs/ui/widgets/colorpicker — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# ColorPicker

`ColorPicker` elige un **color** mediante una matriz 2-D de matiz×saturación más un slider de brillo. Sigue el patrón de los pickers (ver [`Picker`](/docs/ui/widgets/picker)) y devuelve un `Integer` ARGB **sin canal alpha**.

> 🟡 · **Paquete:** `dev.crossfly.ui.picker` · **Extiende:** `Picker` · **Selección:** `ColorMatrix` interna

## Cuándo usar
- Dejar que el usuario elija un color (tema, resaltado, etiqueta).

## Apariencia
Ventana al 80%×80% de la pantalla con la matriz matiz×saturación rellenando el cuerpo, un slider de brillo, y los botones **Cancel** y **Select** (el Select muestra el hex y se pinta con el propio color elegido).

## Ejemplo completo (copiar, pegar y ejecutar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button abrir = new Button("Escolher cor");
      // Usa el propio color elegido como fondo del botón
      abrir.onAction(c ->
      {
         ColorPicker cp = new ColorPicker(0xFF3366CC);
         cp.show(answer ->
         {
            int argb = 0xFF000000 | (Integer) answer;  // agrega alpha (color sin alpha)
            abrir.style(abrir.getStyle().copy().backColor(argb));
         });
      });
      add(LAY_AUTO, abrir);
   }
}
```

> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutarlos, colócalos en el esqueleto `MainWindow` de arriba.

## Uso básico
```java
ColorPicker cp = new ColorPicker(0xFF3366CC);
cp.show(answer ->
{
   int rgb = (Integer) answer;    // 0x00RRGGBB (sin alpha)
   int argb = 0xFF000000 | rgb;   // agregue alpha para usar como color opaco
   botao.style(botao.getStyle().copy().backColor(argb));
});
```

## Constructores
| Constructor | Descripción |
|---|---|
| `ColorPicker(int defaultColor)` | Color ARGB inicial mostrado al abrir. |

## Propiedades y personalización
| Miembro | Tipo | Qué hace |
|---|---|---|
| `choosenColor` | `int` (público) | Color actual (RGB sin alpha); `-1` si se canceló. |
| `ColorPicker.selectStr` (estático) | `String` | Prefijo de la etiqueta del botón Select (`"Select color "`). |

## Callbacks y eventos
| Callback | Cuándo se dispara |
|---|---|
| `show(onAnswer)` | al confirmar (Select), entrega el `Integer` (RGB sin alpha). |

## Resultado (importante)
`getAnswer()` devuelve `Integer` (color RGB **sin alpha**, enmascarado con `& 0x00FFFFFF`), o `null` si se canceló. El tipo es `Integer` (no `int`) precisamente para poder ser `null`.

> ⚠️ **El color no tiene canal alpha.** Aplica `0xFF000000 |` si necesitas un color opaco.

## Estados
- **Select** → `answer = choosenColor` y cierra.
- **Cancel** → `answer = null`, `choosenColor = -1` y cierra (el `onAnswer` **no** se dispara).

### Usar el color elegido como fondo de un botón
```java
ColorPicker cp = new ColorPicker(0xFF3366CC);
cp.show(answer ->
{
   int argb = 0xFF000000 | (Integer) answer;
   botao.style(botao.getStyle().copy().backColor(argb));
});
```

## Buenas prácticas
- Recuerda **añadir alpha** (`0xFF000000 |`) al usar el resultado como color opaco.
- Haz el cast a `Integer` (no `int`) para no perder la semántica de `null` en la cancelación.

## Errores comunes
- **Usar el resultado sin alpha** — sale transparente (`0x00RRGGBB`).
- **Esperar `onAnswer` en la cancelación** — no se dispara (`answer = null`).

## Ver también
- Guía del área: [`ui/`](/docs/ui) · Recetas: [`cookbook/`](/docs/cookbook)
- Base del patrón: [`Picker`](/docs/ui/widgets/picker)
