LIST BOXES – Dites adieu à la touche Alt !

L’action glisser-déposer est une action standard dans les interfaces informatiques. Dans le cas des list boxes, il faut appuyer sur la touche Alt pour déplacer plusieurs éléments simultanément. Ou plutôt il « fallait » car, à partir de 4D v19 R7, ce n’est plus du tout une nécessité !

LIST BOXES Drad and Drop 

Une interface plus conviviale

Cette opération nécessitait d’appuyer sur la touche Alt du clavier (pour des raisons techniques et historiques) pour déplacer plusieurs éléments simultanément. Cette obligation appartient désormais au passé. Il s’agit d’une amélioration conviviale car ce nouveau comportement est très proche de celui utilisé par macOS ou Windows pour gérer les fichiers et les dossiers. Les utilisateurs ne seront pas désorientés, et cette action sera très naturelle !

Et si…

Si les utilisateurs d’applications existantes ont l’habitude d’appuyer sur la touche alt pendant le glisser-déposer, il n’y a aucune raison de s’inquiéter. Le glisser-déposer fonctionnera exactement de la même manière. La touche alt sera ignorée, à moins que vous ne programmiez quelque chose pour la prendre en compte dans un autre but (ex : si la touche alt est enfoncée, une copie sera effectuée au lieu d’un simple déplacement).

Première conclusion

Ce nouveau comportement est plus convivial car il imite les systèmes d’exploitation, et le comportement de la plupart des applications. Nous pourrions nous arrêter ici, mais profitons de l’occasion pour rappeler quelques principes de fonctionnement des list boxes, leurs propriétés, et les événements qui peuvent être gérés. Si cela vous intéresse, continuons !

Les modes de sélection, la Multi-sélection et événements

Trois modes de sélection possibles

Les list boxes disposent de trois modes de sélection déterminés par une propriété de la liste de propriétés.

  • Aucun
  • Unique
  • Multiple

 

Deux modes de sélection multiple.

La sélection de plusieurs éléments est possible en utilisant les touches du clavier .

  • En maintenant la touche shift enfoncée, vous pouvez créer une sélection continue (ex : de « Chloé » à « Mike »).
  • En maintenant la touche Ctrl (touche Cmd sur macOS), vous pouvez créer une sélection discontinue (ex : « Albert », « John », « Mike » et « Peter »).

 

Trois événements

Trois événements peuvent être gérés lors du « glisser-déposer ».

  • on begin drag over
  • on drag over
  • on drop

 

blank

Remarque importante : ces événements ne seront déclenchés que si les paramètres d’actions pour le « draggable » et le « droppable » sont définis comme personnalisés.

blank

1 – Le premier (on begin drag over) est déclenché lorsque le glisser-déposer commence dans la zone de liste « source ». À ce stade, il est nécessaire de préparer « l’étape suivante », c’est-à-dire de regarder ce qui est sélectionné et de le stocker d’une manière ou d’une autre. Cela peut être dans le presse-papiers ou dans une variable de formulaire, par exemple. Notez que cet événement n’est déclenché qu’une seule fois.

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 – Le second événement (on drag over) est déclenché au survol d’une list box, mais seulement s’il a été précédé d’un on begin drag over ou si quelque chose d’autre peut être déposé sur la list box.

Il n’est pas obligatoire de prendre en compte cet événement, mais il est utile car il permet de refuser un éventuel « drop » qui pourrait se produire plus tard.

Comment faire ? Il suffit de regarder le contenu de ce qui est susceptible d’être déposé. Si vous êtes d’accord avec ce qui peut être déposé, retournez 0 (zéro) dans $0. Sinon, retournez -1 (moins un), alors le dépôt sera refusé (et aucun événement « on drop » ne sera généré)

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 – Enfin, la troisième événement (on drop) est généré, comme son nom l’indique, au moment où un « drop » est effectivement effectué sur la list box « cible » (qui peut être la même que la source).

Dès lors, vous pouvez tester à quelle position le dépôt a été effectué et effectuer les opérations nécessaires en fonction du contenu à déposer. N’oubliez pas que le dépôt n’est pas nécessairement la conséquence logique d’un glisser d’une autre list box (ou de la list box elle-même). Il peut également s’agir d’un élément externe, voire extérieur à l’application, comme un fichier ou un dossier de l’environnement système.

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

Conclusion

Toutes ces informations sont couvertes dans la base HDI, que nous vous invitons à télécharger pour voir une implémentation pratique.

Bonne programmation !

Roland Lannuzel
- Product Owner & 4D Expert - Après avoir étudié l'électronique, Roland s'est lancé dans l'informatique industrielle en tant que développeur et consultant, créant des solutions pour les clients avec une variété de bases de données et de technologies. À la fin des années 80, il est tombé amoureux de 4D et l'a utilisé pour écrire des applications commerciales, notamment des systèmes de comptabilité, de facturation et de messagerie électronique. Il a rejoint la société en 1997 et a contribué à la conception de spécifications, d'outils de test et de démonstrations, ainsi qu'à la formation et à la présentation de la communauté 4D lors de nombreuses conférences. Il continue à façonner activement l'avenir de 4D en définissant de nouvelles fonctionnalités et des outils de développement de bases de données.