TUTORIEL FLASH 
MX 2004 : personnaliser les menus contextuels (2)
Dans ce second volet, des menus plus précis pour certains éléments, et l'ajout conditionnel d'options. (20/10/2004)

Nous continuons ici sur la lancée de notre article sur la personnalisation des menus contextuels. Après avoir abordé la construction d'un menu pour l'ensemble de l'application Flash, nous allons personnaliser notre approche.

Flash MX 2004 permet en effet non seulement de créer un menu contextuel global, mais également des menus plus précis pour certains éléments graphiques. Par ailleurs, certaines options peuvent être ajoutée de manière conditionnelle...

Trois éléments possibles
L'attribut .menu, nécessaire pour assigner un menu contextuel à un élément graphique, est disponible pour trois classes d'éléments : MovieClip, Button et TextField. C'est ce dernier qui nous allons voir ici.
Reprenons le code de notre article précédent : nous y avons construit un ensemble de deux images-clés possédant chacun un menu contextuel envoyant la tête de lecture à l'autre image-clé.
A partir de cette base, ajoutez un champ textuel simple sur la première image-clé, et baptisé-le de manière très originale "champ", et disposant d'un variable "champTexte1". Ouvrez ensuite la fenêtre des Actions et opérez-y quelques ajouts :

stop();
reculer = function () {
  nextFrame();
  };

remplir = function() {
  champTexte1 = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce sem. Nulla porttitor faucibus metus. Nam sodales felis non elit. Phasellus pharetra massa sit amet arcu. Vivamus ultricies. Mauris eros mi, egestas in, volutpat in, pulvinar vitae, lorem.";
  }


monMenu = new ContextMenu();
monMenu.hideBuiltInItems();
options1 = new ContextMenuItem("Page suivante", reculer);
monMenu.customItems.push(options1);
_root.menu = monMenu;

txtMenu = new ContextMenu();
txtMenu.hideBuiltInItems();
options1 = new ContextMenuItem("Page suivante", reculer);
options2 = new ContextMenuItem("Remplir avec 'Lorem Ipsum...'", remplir);
txtMenu.customItems.push(options1);
txtMenu.customItems.push(options2);
champ1.menu = txtMenu;

Nous avons ici ajouté une fonction (remplir()) qui permet de remplir un champ avec un texte prédéfini (en l'occurrence, le séculaire "Lorem ipsum...").
Parce que nous voulons que cet élément ne s'affiche que pour le menu attaché à champ1, nous avons construit le menu txtMenu, et y avons placé notre option (qui appelle remplir()). De plus, parce que nous voulons quand même que l'utilisateur puisse avoir accès au menu général (contenant l'option "Page Suivante"), nous avons ajouté à txtMenu cette option présente dans monMenu.

Poser une condition
Il est également possible de construire dynamiquement le contenu d'un menu, en fonction de ce qui se trouve sur la scène (ou de l'état de l'objet auquel appartient le menu). Pour cela, nous faisons appel à la méthode onSelect de l'objet ContextMenu(). Complétons notre exemple :

stop();
reculer = function () {
  nextFrame();
  };

remplir = function () {
  champTexte1 = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce sem. Nulla porttitor faucibus metus. Nam sodales felis non elit. Phasellus pharetra massa sit amet arcu. Vivamus ultricies. Mauris eros mi, egestas in, volutpat in, pulvinar vitae, lorem.";
  };

vider = function () {
  champTexte1 = "";
  };


vider();

monMenu = new ContextMenu();
monMenu.hideBuiltInItems();
options1 = new ContextMenuItem("Page suivante", reculer);
monMenu.customItems.push(options1);
_root.menu = monMenu;

txtMenu = new ContextMenu();
txtMenu.hideBuiltInItems();
options1 = new ContextMenuItem("Page suivante", reculer);
txtMenu.customItems.push(options1);
options2 = new ContextMenuItem("Remplir avec 'Lorem Ipsum...'", remplir, true);
txtMenu.customItems.push(options2);
options3 = new ContextMenuItem("Vider", vider, true);
txtMenu.customItems.push(options3);


txtMenu.onSelect = function() {
  options3.visible = false;
  options2.visible = false;
  if (champTexte1.length >= 1) {
    options3.visible = true;
  } else {
    options2.visible = true;
  }
};


champ1.menu = txtMenu;


Nous avons ajouté l'option "Vider", qui appelle la fonction du même nom et place une chaîne vide dans notre champ texte (donc, le vide).
Notre but ensuite est de proposer "Remplir avec 'Lorem Ipsum'..." quand le champ est vide, et "Vider" quand il contient du texte. Pour cela nous utilisons donc la méthode .onSelect, au sein de laquelle, après s'être assuré que les deux options ne sont pas affichées, nous testons la longueur de la chaîne contenue dans champTexte1, et affichant l'élément idoine.
Pour s'assurer de ne pas obtenir une longueur undefined, nous vidons directement le champ au lancement de l'application.

  Forum

Réagissez dans les forums de JDN Développeurs

Construire un menu contextuel et dynamique est donc extrêmement simple dans l'environnement Flash. On pourra même envisager de coupler cela avec un langage côté serveur, qui pourrait produire le contenu du menu en fonction de l'activité de l'utilisateur. Une voie à suivre.

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages