Un menu déroulant dans Director 

Pour réaliser un menu déroulant du meilleur effet (!), nous nous proposons d'utiliser un champs texte dont nous modifierons le contenu via Lingo.

Notre travail commence avec la création d'un champs texte sur la scène. Rappelons que ceci peut-être fait directement à l'aide de l'outil champs placé dans la palette des outils au coté des formes. Ce champs contiendra le texte intitulé de notre menu soit "Édition".

Nous souhaitons améliorer l'aspect de ce champs, il nous est possible sans passer par Lingo, de modifier sa couleur de fond. Le texte doit impérativement être sélectionné, comme si l'on changeait SA couleur, afin que nous puissions effectuer notre choix en pressant sur le deuxième carré échantillon dans la palette des outils. Ceci étant fait, on aurait tord de croire que les champs texte de Director n'admettent pas d'autre enrichissement. Seulement maintenant il faut utiliser Lingo :

On ouvre la fenêtre message afin d'y saisir les commandes que l'on veut voir exécuter immédiatement. Ici pour améliorer l'ordinaire du men, nous modifier plusieurs propriétés des champs.

set the dropshadow of member "monchamps" to 1

cette propriété permet d'attacher une ombre au texte d'un acteur champs dont le décalage est en l'occurrence de 1 pixel. Ce ne peut être utile que si le texte est de couleur claire. Plus utile est la commande suivante ;

set the boxdropshadow of member "monchamps" to 2

Ici c'est le champs lui-même qui se voit doté d'une ombre orientée vers le bas et la droite. Enfin si l'on veut que le champs soit délimité par une bordure :

set the border of member 2 to 1

Nous pouvons nous préoccuper maintenant de programmer l'apparition du menu.

Nous avons un premier besoin : Quand l'utilisateur presse sur l'intitulé d'un menu déroulant, il fait apparaître son contenu. Nous attachons au champs sur la scène le script suivant qui d'abord modifie son contenu à la volée.

 

on mouseDown

set X to " Édition" & return & " Copier" & return & " Couper" & return & " Coller" & return & " Effacer" & return & " Tout sélectionner"

put X into field 1

end

on mouseUp

put " Édition" into field 1

end

 

En l'état, si on lance l'animation notre script permet déjà de tester cette utilisation particulière des champs pour créer un menu. Rien pourtant ne se passe quand l'utilisateur glisse à l'intérieur du menu pour faire un choix. Nous reprenons donc le premier gestionnaire (on mouseDown) :

on mouseDown

set X to " Édition" & return & " Copier" & return & " Couper" & return & " Coller" & return & " Effacer" & return & " Tout sélectionner"

put X into field 1

-- Nous devons tout le temps que la souris est enfoncée
-- noter le choix de l'utilisateur et s'il est changé, mettre
-- la commande du menu (i.e. la ligne du champs) en
-- surbrillance.
-- on crée deux variables chargé de noter les choix :

set CHOIXPRECEDENT to 0
set CHOIXACTUEL to 0

-- tant que la souris est enfoncée

repeat while the stilldown

if the mousecast = 1 then

-- mais enfoncée au dessus du champs (acteur 1 ici) :
set CHOIXACTUEL to the mouseline

else

set CHOIXACTUEL to 0

end if

 

-- la variable CHOIXACTUEL stocke donc la position
-- changeante de la souris
-- Nous souhaitons mettre en surbrillance la ligne
-- correspondante du champs
-- mais ceci ne doit être fait qu'à chaque changement
-- de position à l'intérieur du menu !

-- donc
-- si la position est nouvelle
if CHOIXACTUEL <> CHOIXPRECEDENT then

-- et si on est dans le menu !
if CHOIXACTUEL > 0 then

hilite line CHOIXACTUEL of field 1

end if

-- on prend acte du changement de position
-- pour la prochain fois
set CHOIXPRECEDENT to CHOIXACTUEL

end if

end repeat
end

 

on mouseUp

put " Édition" into field 1

end

 

Annexe

Comment peut-on redimensionner un champs via Lingo ?

Impossible ? On le dit mais essayez plutôt ceci :

set the rect of member 1 to rect( getat(the rect of member 1, 1), getat(the rect of member 1, 2), getat(the rect of member 1, 3) + 20, getat(the rect of member 1, 4) )

Quand il est question d'un champs, seule la troisième valeur de la propriété the rect of member peut être modifiée.

Une formulation plus élégante de la même solution ?

set the rect of member 1 to (the rect of member 1) + rect(0,0,20,0)