Object +-- Widget +-- Container +-- Box +-- HBox +-- Combo
Une liste de choix est un widget plutôt simple qui n'est qu'en fait qu'une collection d'autres widgets. Du point de vue de l'utilisateur, le widget consiste en une entrée texte avec un menu déroulant dans lequel l'utilisateur peut choisir une entrée prédéfinie. Par ailleurs, l'utilisateur peut taper un texte différent dans la boîte.
L'extrait suivant de la structure qui définie une liste de choix identifie plusieurs de ses composants :
Gtk::Combo -> hbox -> entry -> button -> popup -> popwin -> list . . .
Comme vous pouvez le voir, une liste de choix est composée de deux parties : une entrée texte et une liste.
Tout d'abord, pour créer une liste de choix :
$combo = new Gtk::Combo();
Maintenant, si vous voulez déclarer une chaîne de caractères dans l'entrée texte de la liste de choix, cela se fait en manipulant directement le widget Entrée :
$combo->entry->set_text( "Ma chaîne." );
Pour déclarer les valeurs de la liste déroulante, utiliser la fonction :
$combo->set_popdown_strings( @strings );
Avant de faire ça, vous devez créer la liste des chaînes de caractères que vous voulez. N'importe quelle expression Perl, qui peut être considérée comme une liste peut être utilisée en argument. Les liste encadrées par une apostrophe et celles encadrées par des guillemets sont les plus communes. Pour en ajouter à la liste, utiliser :
$combo->list = ( $combo->list, "ajout1", "ajout2", ... );
Comme il est suggéré précédemment, tout ce qu'on peut faire à une liste Perl (ce qui est beaucoup), on peut le faire à une liste de choix. Voici un bout de code typique pour créer un ensemble d'options :
@list = ( "Chaîne1", "Chaîne2", "Chaîne3" ); $combo->set_popdown_strings( @list );
Ou, si vous préférez compresser le code :
$combo->set_popdown_strings( "Chaîne1", "Chaîne2", "Chaîne3" );
A ce moment, vous avez créé une liste de choix qui fonctionne. Il y a quelques aspects de son comportement que vous pouvez changer. Ils sont accomplis avec les fonctions :
$combo->set_use_arrows( $use_arrows );
Ou $use_arrows est une valeur vraie ou fausse. Cela ne mentionne pas
la liste mais plutôt remplace le contenu actuel de l'entrée texte avec l'élément
suivant de la liste (précèdent ou suivant en fonction des flèches qui vous avez
utilisées au clavier). On fait cela en cherchant dans la liste l'item correspondant
à l'entrée texte et en sélectionnant l'item précédent/suivant. Habituellement,
les flèches sont utilisées pour changer l'élément actif (vous pouvez toujours
le faire avec TAB). Noter que quand l'item courant est le dernier de la liste,
quand vous pressez la flèche vers le bas, vous changez l'élément actif ( de
même s'il s'agit du premier élément).
Si la valeur courante de l'entrée texte n'est pas dans la liste, la fonction
set_use_arrows() est indisponible.
Si vous voulez que les flèches haut/bas tournent en rond dans l'ensemble des choix, si ce n'est que cela limite les valeurs de la liste, utilisez :
$combo->set_use_arrows_always( $use_arrows );
Cela rendra complètement indisponible l'utilisation des flèches pour changer l'élément actif.
Pour déterminer si GTK cherche les entrées en prenant en compte les différentes formes d'un même mot ou non, utiliser :
$combo->set_case_sensitive( $case );
On l'utilise quand la liste de choix doit trouver une valeur dans la liste à
partir de l'entrée texte. Ce complément peut se faire de manière sensible ou
insensible, en fonction de l'usage de cette fonction. La liste de choix peut
aussi compléter simplement l'entrée courant si l'utilisateur utilise la combinaison
de touche MOD-1 et ``TAB''. MOD-1 est souvent la touche ``Alt'' selon xmodmap.
Noter toutefois que certains windows managers utilise également cette combinaison
ce qui supprime son usage pour GTK.
Si vous voulez spécifier si la valeur entrée doit ou non être l'un des éléments de la liste, vous pouvez le faire avec :
$combo->set_value_in_list( $must_match, $ok_if_empty );
Si $must_match est une valeur vraie alors la valeur entrée doit être
dans la liste. $ok_if_empty est une valeur vraie ou fausse qui détermine
si une valeur vide est acceptable.
Si l'un des éléments de la liste n'est pas un simple label, vous devez dire à GTK de quel label il s'agit. Vous utilisez alors :
$combo->set_item_string( $item, $Chaîne );
$item est l'élément de la liste que vous voulez déclarer et $Chaîne
est le label. Sans cela, GTK ne saura pas quoi mettre dans l'entrée texte.
Vous pouvez empêcher la liste de choix de montrer la liste déroulante quand l'entrée texte émet un signal ``activé'' en utilisant :
$combo->disable_activate();
Cela peut être utile si vous voulez que la touche ``Entrée'' termine le dialogue. Dans la plupart des cas cependant, vous devriez le laisser se débrouiller tout seul.
Maintenant que nous avons une liste de choix, qui ressemble à quelque chose
et qui se comporte comme on le veut, tout ce qui reste à savoir est comment
obtenir les informations de la liste de choix. C'est relativement direct. La
plupart du temps, on ne se préoccupe que de l'entrée texte. On y accède simplement
avec combo->entry. Les deux principales choses que vous voudrez en faire
seront d'y attacher un signal ``activé'' qui indiquera que le touche ``Entrée''
a été pressée, et de lire le texte. La première étape est réalisée par :
$combo->entry->signal_connect( "activate", \&callback );
Lire le texte à n'importe quel moment est tout simplement fait par le fonction :
$combo->entry->get_text();