A acção de arrastar e largar é uma acção padrão nas interfaces dos computadores. No caso de caixas de listagem, é necessário premir a tecla “Alt” para mover vários itens simultaneamente. Ou antes “era” porque, a partir de 4D v19 R7, isto já não é de todo um requisito!
LISTA DE CAIXAS Possibilidades de Arrastar e Soltar
Uma interface mais fácil de utilizar
Esta operação exigiu a premir a tecla “alt” no teclado por razões técnicas e históricas para mover vários elementos simultaneamente. Esta obrigação é agora uma coisa do passado. Trata-se de uma melhoria de fácil utilização porque este novo comportamento está muito próximo do utilizado pelo MacOS ou Windows para gerir ficheiros e pastas. Os utilizadores não ficarão confusos, e esta acção será muito natural!
E se…
Se os utilizadores de aplicações existentes estiverem habituados a premir a tecla alt enquanto arrastam, não há nada com que se preocupar. O arrastar e largar funcionará exactamente da mesma forma. A tecla alt será ignorada, a menos que se programe algo para a ter em conta para qualquer outro fim (ex: se a tecla alt estiver em baixo, a cópia em vez de apenas mover).
Primeira Conclusão
O novo comportamento é mais fácil de utilizar porque imita sistemas operativos, e a maioria das aplicações funcionam. Poderíamos parar aqui, mas aproveitemos esta oportunidade para recordar alguns princípios de como funcionam as caixas de listagem, as suas propriedades, e os eventos que podem ser tratados. Se estiver interessado, vamos continuar!
Modos de selecção. Multi-selecção. e eventos
Três modos de selecção possíveis
As caixas de listagem têm três modos de selecção determinados por uma propriedade da lista de propriedades.
- Nenhuma
- Único
- Múltiplos
Dois modos de multi-selecção possíveis.
A selecção de vários elementos é possível usando as teclas do teclado.
- Mantendo premida a tecla shift, é possível criar uma selecção contínua(ex: De “Chloe” a “Mike”)
- Ao segurar a chave Ctrl( chaveCmd em macOS), pode criar uma selecção descontínua(ex: “Albert” e “John” e “Mike” e “Peter”)
Três eventos
Três eventos podem ser geridos durante o “arrastar e largar”.
- on beginning drag over
- on drag over
- on drop
Nota importante: Estes eventos só serão desencadeados se as definições das acções de arrastar e deixar cair forem definidas à medida.
1 – O primeiro (on beginning drag over) é accionado quando o arrastamento começa na caixa de listagem “fonte”. Neste ponto, é necessário preparar “o próximo passo”, ou seja, olhar para o que é seleccionado e armazená-lo de alguma forma. Isto pode ser dentro da prancheta ou de uma variável de forma, por exemplo. Note-se que este evento é desencadeado apenas uma vez.
If (Form event code=On Begin Drag Over)
$drag:=New object
// (…) put what you need in Form.drag object
// put the object in a BLOB
VARIABLE TO BLOB($drag; $blob)
// and send the object to the PasteBoard with any signature (xxxx)
APPEND DATA TO PASTEBOARD("xxxx"; $blob)
End if
2 – A segunda (on drag over) é accionada ao pairar sobre uma caixa de listagem, mas apenas quando foi precedida por um arrastamento no início ou se algo mais pode ser deixado na caixa de listagem.
Não é obrigatório considerar este evento, mas é benéfico porque permite recusar uma possível “queda” que poderia ocorrer mais tarde.
Como fazer isto? Basta olhar para o conteúdo do que é susceptível de ser deixado cair. Se estiver de acordo com o que pode ser deixado cair, devolva 0 (zero) em $0. Caso contrário, devolva -1 (menos um), então a queda será recusada (e não será gerado nenhum evento “on drop”).
If (Form event code=On Drag Over)
If (Pasteboard data size("xxxx")<=0)
$0:=-1 //reject anything that does NOT contains what is expected
Else
$0:=0
End if
End if
3 – Finalmente, a terceira (on the drop) é gerada, como o seu nome indica, no momento em que uma “gota” é efectivamente executada na caixa de listagem “alvo” (que pode ser a mesma que a fonte).
A partir daí, é possível testar em que posição a queda foi feita e realizar as operações necessárias, dependendo do conteúdo a ser largado. Não se esqueça que a queda não é necessariamente a consequência lógica de um arrastamento de outra caixa de listagem (ou da própria caixa de listagem). Pode também ser um elemento externo, mesmo externo à aplicação, tal como um ficheiro ou uma pasta do ambiente do sistema.
if(Form event code=On Drop)
// read pasteboard content
GET PASTEBOARD DATA("xxxx"; $blob)
BLOB TO VARIABLE($blob; $drag)
// do what you need to do with the object you got
(…)
end if
Conclusão
Toda esta informação é coberta na amostra do HDI, que o convidamos a descarregar para ver uma implementação prática.
Feliz codificação!