LISTA DE CAIXAS – Diga adeus à chave Alt!

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

blank

Nota importante: Estes eventos só serão desencadeados se as definições das acções de arrastar e deixar cair forem definidas à medida.

blank

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!

Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.