# ColorPicker

> Escolha de cor por matriz matiz×saturação + slider de brilho.

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

# ColorPicker

`ColorPicker` escolhe uma **cor** por meio de uma matriz 2-D de matiz×saturação mais um slider de brilho. Segue o padrão dos pickers (ver [`Picker`](/docs/ui/widgets/picker)) e devolve um `Integer` ARGB **sem canal alpha**.

> 🟡 · **Pacote:** `dev.crossfly.ui.picker` · **Estende:** `Picker` · **Seleção:** `ColorMatrix` interna

## Quando usar
- Deixar o usuário escolher uma cor (tema, destaque, etiqueta).

## Aparência
Janela em 80%×80% da tela com a matriz matiz×saturação preenchendo o corpo, um slider de brilho, e os botões **Cancel** e **Select** (o Select mostra o hex e é pintado com a própria cor escolhida).

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

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

/** Tela principal executável. Aponte o launcher (classname) e rode: 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 a própria cor escolhida como fundo do botão
      abrir.onAction(c ->
      {
         ColorPicker cp = new ColorPicker(0xFF3366CC);
         cp.show(answer ->
         {
            int argb = 0xFF000000 | (Integer) answer;  // adiciona alpha (cor sem alpha)
            abrir.style(abrir.getStyle().copy().backColor(argb));
         });
      });
      add(LAY_AUTO, abrir);
   }
}
```

> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

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

## Construtores
| Construtor | Descrição |
|---|---|
| `ColorPicker(int defaultColor)` | Cor ARGB inicial exibida ao abrir. |

## Propriedades e personalização
| Membro | Tipo | O que faz |
|---|---|---|
| `choosenColor` | `int` (público) | Cor corrente (RGB sem alpha); `-1` se cancelado. |
| `ColorPicker.selectStr` (estático) | `String` | Prefixo do rótulo do botão Select (`"Select color "`). |

## Callbacks e eventos
| Callback | Quando dispara |
|---|---|
| `show(onAnswer)` | ao confirmar (Select), entrega o `Integer` (RGB sem alpha). |

## Resultado (importante)
`getAnswer()` retorna `Integer` (cor RGB **sem alpha**, mascarada com `& 0x00FFFFFF`), ou `null` se cancelado. O tipo é `Integer` (não `int`) justamente para poder ser `null`.

> ⚠️ **A cor não tem canal alpha.** Aplique `0xFF000000 |` se precisar de uma cor opaca.

## Estados
- **Select** → `answer = choosenColor` e fecha.
- **Cancel** → `answer = null`, `choosenColor = -1` e fecha (o `onAnswer` **não** dispara).

### Usar a cor escolhida como fundo de um botão
```java
ColorPicker cp = new ColorPicker(0xFF3366CC);
cp.show(answer ->
{
   int argb = 0xFF000000 | (Integer) answer;
   botao.style(botao.getStyle().copy().backColor(argb));
});
```

## Boas práticas
- Lembre de **adicionar alpha** (`0xFF000000 |`) ao usar o resultado como cor opaca.
- Faça o cast para `Integer` (não `int`) para não perder a semântica de `null` no cancelamento.

## Erros comuns
- **Usar o resultado sem alpha** — sai transparente (`0x00RRGGBB`).
- **Esperar `onAnswer` no cancelamento** — não dispara (`answer = null`).

## Veja também
- Guia da área: [`ui/`](/docs/ui) · Receitas: [`cookbook/`](/docs/cookbook)
- Base do padrão: [`Picker`](/docs/ui/widgets/picker)
