Les widgets de type Toggle


Table des matières :


Introduction :


Un widget de type Toggle est un bouton (ou une entrée de menu) qui possède deux valeurs: On ou Off. Il peut avoir la forme d'un carré (square) ou d'un diamant (diamond).

Les Toggle widgets possèdent, comme les boutons poussoirs, un label qui peut être de type texte ou bien de type pixmap (un dessin).

On peut grouper plusieurs Toggle widgets pour contrôler leur comportement les uns par rapport aux autres. Motif fournit deux types de Toggle widgets qui réagissent différemment lorsqu'ils sont regroupés :

Le widget de type RadioBox
Un seul de ces widgets peut être sur la position On lorsqu'on en groupe plusieurs. Il y a exclusion mutuelle, lorsqu'un d'entre eux est séléctionné, les autres sont mis sur Off. Ils sont en forme de diamant.

Le widget de type CheckBox
Plusieurs CheckBox peuvent être séléctionnés en même temps. Ils sont en forme de carré.


Bases d'utilisation des Toggle widgets


On crée les Toggle widgets de manière standard : à l'aide des fonctions XmCreateToggleButton() ou encore XtVaCreateManagedWidget() avec comme classe de widget xmToggleButtonWidgetClass... etc...

Ressources les plus importantes :

XmNindicatorType
On positionnera cette ressource avec la valeur XmN_OF_MANY pour créer un CheckBox widget ou bien avec la valeur XmONE_OF_MANY pour créer un RadioBox widget.

XmNindicatorOn
Mettre à True pour positionner le widget sur On (valeur par défaut = False).

XmNindicatorSize
Taille de l'indicateur (diamant ou carré), en pixels.

XmNlabelType
Deux valeurs possibles : XmSTRING (défaut) ou XmPIXMAP selon que le label est textuel ou graphique.

XmLabelString
Le texte du label, de type XmString

XmNPixmap
Pixmap du widget lorsqu'il n'est pas séléctionné (uniquement si la ressource XmNlabelType vaut XmPIXMAP).

XmNselectedPixmap
Pixmap du widget lorsqu'il est séléctionné (uniquement si la ressource XmNlabelType vaut XmPIXMAP).

XmNselectColour
Couleur de l'indicateur du widget séléctionné. De type Pixel

Le Pixmap est un type X standard. Pour charger un pixmap on utilisera la fonction XmGetPixmap().

Callbacks des Toggle widgets

On précise la fonction de callback en positionnant la ressource XmNvalueChangedCallback.

La fonction de Callbacks d'un widget de type Toggle est standard :



   toggle_cbk(Widget w, XtPointerData data, XmToggleCallbackStruct *cbk)


Le champ set de la structure XmToggleCallbackStruct permet de savoir si le widget est séléctionné ou non. Avec l'exemple ci-dessus, si cbk->set vaut True alors le widget w est séléctionné.


Petit programme d'exemple : toggle.c




#include <Xm/Xm.h>
#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>

/*--------------------------*/
main(int argc, char **argv)
/*--------------------------*/
{
  Widget toplevel, rowcol, toggle1, toggle2;
  XtAppContext app;
  void toggle1_cbk(), toggle2_cbk();

  toplevel = XtVaAppInitialize(&app, "Toggle", NULL, 0,
			       &argc, argv, NULL, NULL);

  rowcol = XtVaCreateWidget("rowcol",
			    xmRowColumnWidgetClass, toplevel, 
			    XmNwidth, 300,
			    XmNheight, 200,
			    NULL);


  toggle1 = XtVaCreateManagedWidget("Dolby ON/OFF",
				    xmToggleButtonWidgetClass, rowcol, NULL);
        
  XtAddCallback(toggle1, XmNvalueChangedCallback, 
		toggle1_cbk, NULL);
    
  toggle2 = XtVaCreateManagedWidget("Dolby B/C",
				    xmToggleButtonWidgetClass, rowcol, NULL);
        
  XtAddCallback(toggle2, XmNvalueChangedCallback, 
		toggle2_cbk, NULL);
  XtManageChild(rowcol);
  XtRealizeWidget(toplevel);
  XtAppMainLoop(app);
}

/*-------------------------------------------------------*/
void toggle1_cbk(Widget widget, XtPointer client_data,
		 XmToggleButtonCallbackStruct *state)
/*-------------------------------------------------------*/
{  
  printf("%s: %s\n", XtName(widget), 
	 state->set? "on" : "off");
}

/*-------------------------------------------------------*/
void toggle2_cbk(Widget widget, XtPointer client_data, 
XmToggleButtonCallbackStruct *state)
/*-------------------------------------------------------*/
{ 
  printf("%s: %s\n", XtName(widget), state->set? "B" : "C");
}



Grouper des Toggle widgets automatiquement


On peut regrouper "à la main" des RadioBox ou des CheckBox widgets dans une RowCOlumn ou une Form, comme dans le programme d'exemple toggle.c.

Motif propose cependant des fonctions de convénience effectuant ce travail : XmCreateSimpleRadioBox() et XmCreateSimpleCheckBox(). Il en existe d'autres...

Ces fonctions permettent de créer plusieurs Toggle widgets d'un seul coup. Il sont automatiquement rassemblés dans une RowColumn, et la plupars de leurs ressources, comme XmNindicatorType, sont positionnées par la fonction de convénience.

Ces fonctions sont trés pratiques mais ne permettent pas de tout faire.


michel.buffa@essi.fr