Drag and Drop
This commit is contained in:
@@ -284,3 +284,41 @@ exceto `GerenciandoLayouts` e `Analisando`.
|
||||
- `ResultadoPendente` é o tipo intermediário entre a thread de análise e a UI.
|
||||
|
||||
**Não bloquear a thread principal da UI.** Qualquer operação lenta deve usar `Task`.
|
||||
|
||||
---
|
||||
|
||||
## 11. Drag-and-drop de arquivos
|
||||
|
||||
O iced 0.13 expõe eventos de janela para drag-and-drop via `iced::window::Event`.
|
||||
O projeto os captura através de `App::subscription()` registrado em `main.rs`.
|
||||
|
||||
### Eventos capturados
|
||||
|
||||
| Evento iced | Mensagem emitida | Efeito |
|
||||
|---|---|---|
|
||||
| `window::Event::FileDropped(path)` | `Message::ArquivoSolto(path)` | Processa o arquivo como se fosse selecionado via botão |
|
||||
| `window::Event::FileHovered(_)` | `Message::ArquivoEmHover` | Liga `App.arquivo_em_hover = true` |
|
||||
| `window::Event::FilesHoveredLeft` | `Message::ArquivoHoverSaiu` | Liga `App.arquivo_em_hover = false` |
|
||||
|
||||
### Subscription
|
||||
|
||||
`App::subscription()` em `app.rs` usa `iced::event::listen_with` para filtrar apenas
|
||||
os três eventos acima. Está registrado em `main.rs` via `.subscription(App::subscription)`.
|
||||
|
||||
### Estado de hover
|
||||
|
||||
O campo `App.arquivo_em_hover: bool` é `true` enquanto um arquivo está sendo arrastado
|
||||
sobre a janela. A tela `screens/import.rs` usa esse campo para alterar visualmente a
|
||||
`drop_zone`: borda mais brilhante (`a: 0.9`) e mais espessa (`width: 2.0`) durante o hover.
|
||||
|
||||
### Fluxo de processamento
|
||||
|
||||
`Message::ArquivoSolto` chama `self.processar_arquivo_selecionado(caminho)` — o mesmo
|
||||
método chamado pelo botão de seleção de arquivo. O comportamento é idêntico: validação
|
||||
de extensão, leitura de abas (XLSX) ou preview (CSV), e transição de estado.
|
||||
|
||||
### Como estender
|
||||
|
||||
Para adicionar suporte a drag-and-drop em outras telas (ex: importar layout JSON por
|
||||
drag), basta verificar `App.estado` dentro do arm `Message::ArquivoSolto` antes de
|
||||
chamar `processar_arquivo_selecionado`, e desviar conforme necessário.
|
||||
|
||||
Reference in New Issue
Block a user