gestion des menus
principe:
En mode interaction il existe un
menu OpenGL par défaut
accessible sur clic droit de la souris.
Il est possible de définir des menus déroulant OpenGL en cascade ou dynamiques.
Il est possible aussi de définir des menus programmables de type anyflo.
Note:
menu; (sans paramètres): vide le buffer input char et affiche la fenêtre anyflo
en plein écran.
Menus déroulants de type OpenGL
Menu déroulant simple
La commande interaction menu permet de définir des menus
déroulant en cascade de type OpenGL:
interaction menu("f1 f2 ...")
La case menu apparait en tête du menu déroulant principal (sur clic droite).
Cliquer dessus fait apparaître le menu déroulant f1 f2 ..., cliquer sur la case fi
provoque l´exécution de la fonction anyflo fi().
Sous menus déroulant
interaction menu(">sm1 f1_1 f1_2")
menu(">sm2 f2_1 f2_2")
menu(">sm1 sm2")
La case menu apparait en tête du menu déroulant principal (sur clic dtoite).
Cliquer dessus fait apparaître le menu déroulant sm1 sm2, cliquer sur la case sm1
fait apparaître le sous menu déroulant sm1 f f1_1 f1_2, cliquer sur la case f1_i
provoque l´exécution de la fonction anyflo f1_i().
On peut déclarer des sous menus de sous menus:
interaction
menu(">sm3 f1 f2")
menu(">sm4 f3 f4")
menu(">sm5 f5 f6")
menu(">sm6 f7 f8")
menu(">sm1 sm3 sm4")
menu(">sm2 sm5 sm6")
menu("sm1 sm2 f0")
sm1 et sm2 sont des sous menus de niveau 1, f0 est une fonction.
sm3 et sm4 sont des sous menus de niveau 2 du sous menu sm1.
sm5 et sm6 sont des sous menus de niveau 2 du sous menu sm2.
f1 et f2 sont les fonctions du sous menu sm3.
f3 et f4 sont les fonctions du sous menu sm4.
f5 et f6 sont les fonctions du sous menu sm5.
f7 et f8 sont les fonctions du sous menu sm6.
Voir un exemple dans la fonction menu_cascade.func.
Menus de type anyflo
menu("MEN")func
Returne the names of the fonctions of the menu "MEN".
Génération de menu
menu("MEN")text
Retourne les textes associés aux sous menus du menu "MEN".
menu
menu("MEN")
Retourne la liste des noms des fonctions (ou sous menus) appelés par
le menu MEN.
menu(fff)text(ttt)poi(x,y)
Génère un menu affichable dans la fenêtre graphic:
fff est la liste des noms des fonctiins de la forme:
"f0;>f1;&f2;.f3;!f4;!f5;!f6;=f7;_f8";?f9.
fi est le nom d´une fonction présente en mémoire ou
d´un menu déclaré avant.
>f1 indique que f1 est un sous menu exclusif (qui devra être
déclaré avant). Il devra exister une fonction f1() qui sera
exécutée lors de l´appel à ce sous menu. Lorsqu´un sous menu
exclusif est validé, tous les autres sous menus exclusifs sont invalidés.
&f2 indique que f2 est un sous menu inclusif (qui devra être
déclaré avant). Il devra exister une fonction f2() qui sera
exécutée lors de l´appel à ce sous menu.
.f3 indique que f3 est une fonction bascule (alternativement
on et off).
!f4;!f5;!f6 indique que f4 f5 f6 sont des fonctions exclusives dont une seule est active
(l´activation de l´une d´entre elles désactive les autres).
Il est posible de déclarer plusieurs groupes de fonctions exclusives en
mettant plusieurs ! (jusqu´à 6), par exemple:
!f1;!f2!f3;!!g1;!!g2;!!g3;!!!h1;!!!h2;!!!h3;
=f7 indique que f7 est de type bascule et sera exécutée continuellement
tant qu´elle sera validée.
_f8 indique que f8 est une fonction C.
?f9 indique que f9 est une fonction prioritaire (c´est
à dire qu´elle seule est executée, ce qui permet
d´afficher de nombreuses informations sans empieter sur les autres).
ttt est la liste des noms des cases de la forme "t0;t1;t2;t3;t4;t5;t6".
Il doit y avoir exactement le même nombre de fi et de ti.
ti est le nom apparaissant dans la case i du menu et pouvant être différent du nom
fi de la fonction correspondante.
tti et thi peuvent comporter plusieurs lignes en mettant \n, exemple:
ti=" texte d´une case\n sur 2 lignes".
poi(x,y): est la position du menu.
Un petit cadre gris s´affiche à gauche du menu, cliquer dessus
permet de translater sa position.
Les tailles des cases dépendent de la longueur des textes et de la font.
Options:
Lorsqu´une case est validée les couleurs du texte et du cadre sont inversées.
col(r,v,b): couleur du texte (blanc par défaut).
col(r1,v2,b2, r2,v2,b2, ...): couleur du texte de la case i (blanc par défaut).
frame(r,v,b): cases encadrées en (r,v,b) (blanc par défaut).
frame(r1,v1,b1, r2,v2,b2, ...): case i encadrée en (ri,vi,bi) (blanc par défaut).
exec(c1,...): les cases ci du menu seront
exécutables cycliquement et automatiquement sur ti images (option time).
rectangle(r,v,b): cases pleines de couleur (r,v,b) (noir par défaut).
rectangle(r1,v1,b1, r2,v2,b2, ...): case i pleine de couleur (ri,vi,bi) (noir par défaut).
mouse
mouse(0): lecture non bloquante (par défaut).
mouse(1): lecture bloquante.
mouse(2): lecture à la volée (sans cliquer).
text(th): texte affiché sous une case lorsque la souris passe dessus.
time(t1,...): les cases ci du menu seront
exécutables cycliquement et automatiquement sur ti images (option exec).
Remarques:
exec(c1,...)exec rendent l´exécution immédiate.
frame(r1,v1,b1, r2,v2,b2,rh2, ...), col(r1,v1,b1, r2,v2,b2, ...) de
même que rectangle(r1,v1,b1, r2,v2,b2, ...) permettent de colorer individuellement les cases.
mouse(s1,s2,...) permet d´affecter des modes de saisie.
Afin de forcer des fonctions alternative on peut les déclarer comme des sous menus.
différents sur les cases.
Protocole:
Afin de faciliter la mise au point il est conseillé de suivre le protocole suivant:
donner le même nom à une case et à la fonction correspondante (en majuscules).
appeler MEN le menu principal.
si un sous menu s´appelle SM, appeler SM_XXX les cases et les fonctions
dépendantes.
Les noms des variables externes
commencent par une majuscule.
le premier caractère d´une fonction ne doit pas être un _
(réservé pour les fonctions C).
(Toutes les démos respectent ce protocole).
Voir exemples:
demo1_menu.func
modele_menu.func
modele_menu_fichier_fra.func
modele_menu_fichier_eng.func
modele_multi_menu.func
modele_sous_menu.func
modele_sous_sous_menu.func
Remarque:
Il est conseillé de faire rem menu("M") avant tout changement du nom M
de ce menu, sinon l´ancien nom correspondrait toujours à un menu dont les cases
ne correspondraient pas nécessairement avec des fonctions existantes.
Dans tout les cas ini menu évite les problèmes.
rem menu("m") supprime le menu "m".
ini menu supprime tout les menus.
Rend les menus invisibles.
no menu("SM")
Rend invisible le sous menu SM d´un menu (comme validate menu("SM")=0).
yes menu
Rend les menus visibles (valeur par défaut).
yes menu("SM")
Rend visible le sous menu SM d´un menu (comme validate menu("SM")=1).
validate menu
Validation d´une fonction d´un menu
validate menu("f0")
Retourne la validation de la fonction f0.
validate menu("f0")=v
Modifie cette validation (0: off, 1: on).
inv validate menu("f0")
Inverse cette validation
validate menu("f0")menu("fi")
Retourne la validation de la fonction fi du menu f0.
(>0 si actif, <0 si passif, 0 si neutre).
validate menu("f0")menu("fi")=1
Rend active la fonction fi du menu f0.
validate menu("f0")menu("fi")=0
Rend passive la fonction fi du menu f0.
Remarque: "fi" peut être remplacé par le numéro de la case dans le menu.
inv validate menu("f0")menu("fi") inverse la validation
de la fonction fi du menu f0.
Validation d´un sous-menu d´un menu
validate menu("MEN")menu("SM")=1;
rend actif le sous menu SM du menu MEN
validate menu("MEN")menu("SM")=-1;
rend passif le sous menu SM du menu MEN
ainsi que toutes les fonctions et tous les sous menus de SM.
Remarques:
Dans un sous menu "M_S" d´un menu "M" ce sous menu peut
être référencé par:
menu("M")menu("M_S")
ou par:
menu("M")menu(name func)
puisque name func est le nom de la function actuellement exécutée.
Pour retourner au mode clavier on peut:
Enfoncer la touche escape
Ou appeler dans un menu une fonction du type:
retour()
{
end interaction;
}
2) Les saisie au menu se font en mode bloquant.
Les échelles
Les échelles permettent de saisir des informations graphiques
à la souris:
Valeurs de flottantes ou entières de dimensions 1, 2 ou 3.
Paramètres de couleurs ou de view.
Remarque:
Les saisie sur une échelle se font en mode non bloquant. Il est de la responsabilité de l´utilisateur
de tester si la valeur lue est changée, par exemple:
n=scale("n")poi(-200,0,200,20)coe(0,1,N,0);
if(n!=N){N=n;executer(n);}
executer(n);
ne sera exécuté que si on lit une nouvelle valeur sur l´échelle.
Menu automatique
Certaines fonctions fi d´un menu nnn peuvent être exécutées
cycliquement et automatiquement (même si ce menu est invalidé)
pendant ti images avec la commande exec(f1,f2,...)time(t1,t2,...)menu("nnn")exec.
Exemple:
exec(2,3)time(50,100)menu("MEN_SUB")exec;
lance l´exécution automatique des fonctions numéros 2 et 3 du
sous menu MEN_SUB du menu MEN respectivement 50 et 100 images.
Voir un exemples in test.func.
displ exec
La commande displ exec permet de construire très rapidement un menu simple.
Exemple:
xp=-200,-200;
w=displ exec("cube(1)dim(rand2(10,100));")poi(p)text(1,1)rectangle(0)frame(0,1);
p+=w[0],0;w=displ exec("f()")text(1,1)poi(p)rectangle(0)frame(0,1);
p+=w[0],0;displ exec("interaction STOP")poi(p)text(1,1)rectangle(0)frame(0,1);
Construit un menu de 3 cases exécutables:
La première construit un cube de dimension aléatoire.
La seconde appelle la fonction f()
.
Et la dernière retourne au mode interpréteur.
Voir aussi