Les widgets de type Scale


Table des matières :


Introduction :


Les widgets de type Scale permettent à l'utilisateur d'entrer des valeurs numériques dans un programme à l'aide d'ascenseurs. Voici un exemple de Scale widget :


Bases d'utilisation des widgets de type Scale


Pour créer un Scale widget on utilisera par exemple une de ces fonctions : XmCreateScale() ou encore XtVaCreateManagedWidget() avec comme classe de widget xmScaleWidgetClass. Il existe encore d'autres manières mais à ce stade du cours vous devriez les connaîtres ou mieux les deviner.

Les ressources les plus intéressantes des Scale widgets sont :

XmNmaximum
La plus grande valeur sélectionnable par l'utilisateur (lorsque l'ascenseur est en butée).

XmNminimum
La plus petite valeur sélectionnable par l'utilisateur (lorsque l'ascenseur est en butée).

XmNorientation
Deux valeurs possibles selon que l'on désire un ascenseur horizontal ou vertical : XmHORIZONTAL et XmVERTICAL.

XmNtitleString
Le label affiché au-dessus de l'ascenseur (facultatif), de type XmString.

XmNdecimalPoints
La valeur renvoyée par un Scale widget est toujours un entier (0 par défaut). En positionnant cette ressource, on peut donner à l'utilisateur l'impression qu'il choisit en déplaçant l'ascenseur une valeur décimale. Par exemple si on choisit comme intervalle [0, 1000] (à l'aide des ressources XmNminimum et XmNmaximum) et que l'on positionne XmNdecimalPoints avec la valeur 2, l'intervalle affiché sera égal à [0.00, 10.00].



   C'est au programmeur de faire attention à effectuer la division 
   par 100 et la conversion int -> float ou double.


XmNshowValue
Deux valeurs possibles : True ou False selon que l'on désire que la valeur correspondant à la position de l'ascenseur soit affichée dans le Scale widget ou pas.

XmNvalue
La valeur courante correspondant à la position de l'ascenseur. De type int.

XmNprocessingDirection
Plusieurs valeurs possibles : XmMAX_ON_TOP, XmMAX_ON_BOTTOM, XmMAX_ON_LEFT ou encore XmMAX_ON_RIGHT. Cette ressource indique oú va se trouver la valeur maximale sélectionnable. Seulement deux valeurs sont possibles selon que le widget est vertical ou horizontal.


Fonctions de callback des Scale widgets


Il existe deux types de callback pour les Scale widgets :

  1. XmNvalueChangedCallback : la fonction de callback est appelée lorsque la valeur correspondant à la position de l'ascenseur a changé (l'utilisateur a déplacé le curseur).

  2. XmNdragCallback : le callback est appelé de manière continue lors du déplacement de l'ascenseur. Attention, ceci peut affecter les performances de l'application si le traitement effectué dans la fonction de callback est consommateur de Cpu.

La fonction de callback d'un Scale widget est standard :



   scale_cbk(Widget w, XtPointerData data, XmScaleCallbackStruct *cbk)


Le champ value de la structure XmScaleCallbackStruct *cbk contient la valeur courante (un int) correspondant à la position du curseur.


Petit programme d'exemple : scale.c


ce petit programme simule une interface pour règler le volume sonore d'une quelconque application musicale du type xaudio, etc...

L'exécutable se trouve dans :

    /home/profs/cours/minfo/motif/scale/scale



#include  <Xm/Xm.h>
#include <Xm/Scale.h>

/*--------------------------*/
main(int argc, char **argv)
/*--------------------------*/
{   
  Widget        top_wid, scale;
  XmString      title;
  XtAppContext  app;
  void          scale_cbk();


  top_wid = XtVaAppInitialize(&app, "Scale", NULL, 0,
			      &argc, argv, NULL, NULL);
        
  title = XmStringCreateSimple("Volume sonore");

  scale = XtVaCreateManagedWidget("scale",
				  xmScaleWidgetClass, top_wid,
				  XmNtitleString,   title,
				  XmNorientation,    XmHORIZONTAL,
				  XmNmaximum,       11,
				  XmNdecimalPoints, 0,
				  XmNshowValue,     True,
				  XmNwidth,         200,
				  XmNheight,        100,
				  NULL);

       
  XtAddCallback(scale,XmNvalueChangedCallback, scale_cbk, 
		NULL);
 
  XtRealizeWidget(top_wid);
  XtAppMainLoop(app);
}

/*--------------------------------------------------*/
void scale_cbk(Widget widget, int data, 
               XmScaleCallbackStruct *scale_struct)
/*--------------------------------------------------*/
{    
  if (scale_struct->value < 4)
    printf("Le volume sonore est trop bas (%d)\n", 
	   scale_struct->value);
  else if (scale_struct->value < 7)
    printf("le volume sonore est Ok (%d)\n",
	   scale_struct->value);

    
  else
    if (scale_struct->value < 10)
      printf("Le volume sonore est fort (%d)\n",
	     scale_struct->value);
    else /* Volume == 11 */
      printf("le volume sonore est vraiment trop fort (%d)\n",
	     scale_struct->value);       
}



Changer le look d'un Scale widget


Le document The MOTIF Style Guide suggère d'utiliser des petits marqueurs pour décorer l'echelle des valeurs des Scale widgets et ainsi leur donner l'allure de "règles". Voici un exemple :

Chaque marqueur est un widget de type Separator qui aura pour père le Scale widget. Voici les modifications que l'on pourrait apporter au programme d'exemple précédent pour qúil ressemble à la figure ci-dessus :



   #include <Xm/SeparatoG.h>
   
   Widget ...,tics[11];
   .
   .
   /* Création des marqueurs le long de l'axe horizontal */
   for (i=0; i < 11; ++i ) {  
     n=0;
     XtSetArg(args[n], XmNseparatorType, XmSINGLE_LINE); n++;
     XtSetArg(args[n], XmNorientation, XmVERTICAL); n++;
     XtSetArg(args[n], XmNwidth, 10); n++;
     XtSetArg(args[n], XmNheight, 5); n++;
     tics[i] = XmCreateSeparatorGadget(scale, "|", 
				       args, n);
   }
   XtManageChildren(tics, 11);
   .
   .


L'exécutable correspondant à cette modification se trouve dans :

    /home/profs/cours/minfo/motif/scale/scale1


michel.buffa@essi.fr