Object +-- Widget +-- Editable +-- Entry +-- SpinButton
Les boutons spins sont généralement utilisés pour permettre à l'utilisateur de sélectionner une valeur dans un intervalle de valeurs. Ils consistent en une boite d'entrée texte avec des boutons flèches attachés sur le côté. Cliquer sur l'un des boutons fait varier la valeur sur l'échelle des valeurs disponibles. La boîte entrée peut aussi être éditée directement pour entrer une valeur spécifique.
Le bouton spin permet à la valeur d'être entière ou avec un certain nombre de décimales et d'être incrémentée/décrémentée selon des valeurs configurables. L'action de maintenir un bouton enfoncé peut, optionnellement, se traduire par une accélération de la variation de la valeur en fonction de la durée de la pression.
Le bouton spin utilise les ajustements pour prendre des informations à propos de l'échelle des valeurs que le bouton peut prendre. Rappeler vous que le widget ajustement est créé par la fonction suivante et qui montre les informations qu'elle prend en compte :
. $adj = new Gtk::Adjustment( $value, $lower, $upper, $step_increment, $page_increment, $page_size );
Les attributs de l'ajustement sont utilisés par les boutons spins sont :
$value : valeur initiale pour le bouton spin
$lower : valeur la plus basse
$upper : valeur la plus haute
$step_increment : valeur d'incrément/décrément en pressant le bouton
1 de la souris
$page_increment : valeur d'incrément/décrément en pressant le bouton
2 de la souris
$page_size : inutilisé
En plus, le bouton 3 de la souris peut être utilisé pour sauter directement
à la valeur $upper ou $lower quand on l'utilise pour sélectionner
l'un des boutons.
$spin = new Gtk::SpinButton( $adjustment, $climb_rate, $digits );
L'argument $climb_rate prend une valeur entre 0.0 et 1.0 et indique
la quantité d'accélération du bouton spin. L'argument $digits spécifie
le nombre de décimales que la valeur peut prendre.
Un bouton spin peut être reconfiguré après sa création avec :
$spin->configure( $adjustment, $climb_rate, $digits );
L'ajustement peut être réglé et retrouvé indépendamment un utilisant les deux fonctions :
$spin->set_adjustment( $adjustment ); $spin->get_adjustment();
Le nombre de décimales peut être changé par :
$spin->set_digits( $digits );
La valeur que le bouton spin est en train d'afficher peut être changée par :
$spin->set_value( $value );
La valeur du bouton spin peut être retrouvée sous la forme d'un nombre décimal ou d'un entier à l'aide de :
$spin->get_value_as_float(); $spin->get_value_as_int();
Si vous voulez changer la valeur du bouton spin
$spin->spin( $direction, $increment );
Le paramètre $direction peut prendre les valeurs :
'forward' 'backward' 'page_forward' 'page_backward' 'home' 'end' 'user_defined'
'forward' et 'backward' change la valeur du bouton spin selon
la valeur spécifiée par $increment sauf si $increment vaut 0
auquel cas la valeur est changée à l'aide de la valeur $step_increment
de l'ajustement.
'page_forward' et 'page_backward' change simplement la valeur
du bouton spin selon $increment.
' home' déclare la valeur à la valeur basse de l'ajustement.
'end' déclare la valeur à la valeur haute de l'ajustement.
'user_defined' change la valeur selon une valeur spécifiée par l'utilisateur.
Laissons maintenant les fonctions de réglage et de récupération pour nous intéresser aux fonctions qui agissent sur l'apparence et sur le comportement du bouton spin.
La première de ces fonctions est utilisée pour contraindre la boîte texte du bouton à ne contenir qu'une valeur numérique. Cela empêche l'utilisateur de taper autre chose qu'une valeur numérique.
$spin->set_numeric( $numeric );
Vous pouvez indiquer si le bouton est compris entre la valeur la plus basse et la plus haute.
$spin->set_wrap( $wrap );
Vous pouvez obliger le bouton à arrondir la valeur au plus proche step_increment
qui est déclarée à l'intérieur de l'objet ajustement utilisé par le bouton spin
:
$spin->set_snap_to_ticks( $snap_to_ticks );
Le comportement du bouton peut être modifié par :
$spin->set_update_policy( $policy );
Les valeurs possibles de $policy sont soit 'always' soit 'if_valid'.
Ces valeurs affectent le comportement du bouton quand l'utilisateur écrit la
valeur. Dans le cas de 'if_valid', la valeur du bouton spin ne change
que si le texte d'entrée est une valeur numérique comprise entre les valeurs
spécifiées par l'ajustement. Autrement le texte est effacé et remplacé par la
valeur courante. Dans le cas de 'update_always', on ignore les erreurs
en convertissant le texte en valeur numérique.
L'apparence du bouton spin peut être changé avec :
$spin->set_shadow_type( $shadow_type );
Comme d'habitude, le $shadow_type peut être :
'in' 'out' 'etched_in' 'etched_out'
Vous pouvez demander que le bouton se mette à jour lui-même :
$spin->update();
Il est l'heure de l'exemple.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $spinner1;
my $window;
my $frame;
my $hbox;
my $main_vbox;
my $vbox;
my $vbox2;
my $spinner2;
my $spinner;
my $button;
my $label;
my $val_label;
my $adj;
$window = new Gtk::Window( "toplevel" );
$window->signal_connect( "destroy", sub { Gtk->exit( 0 ); } );
$window->set_title( "Spin Button" );
$main_vbox = new Gtk::VBox( $false, 5 );
$main_vbox->border_width( 10 );
$window->add( $main_vbox );
$frame = new Gtk::Frame( "Not accelerated" );
$main_vbox->pack_start( $frame, $true, $true, 0 );
$vbox = new Gtk::VBox( $false, 0 );
$vbox->border_width( 5 );
$frame->add( $vbox );
# Jour, mois, année spinners
$hbox = new Gtk::HBox( $false, 0 );
$vbox->pack_start( $hbox, $true, $true, 5 );
$vbox2 = new Gtk::VBox( $false, 0 );
$hbox->pack_start( $vbox2, $true, $true, 5 );
$label = new Gtk::Label( "Day :" );
$label->set_alignment( 0, 0.5 );
$vbox2->pack_start( $label, $false, $true, 0 );
$adj = new Gtk::Adjustment( 1.0, 1.0, 31.0, 1.0, 5.0, 0.0 );
$spinner = new Gtk::SpinButton( $adj, 0, 0 );
$spinner->set_wrap( $true );
$spinner->set_shadow_type( 'out' );
$vbox2->pack_start( $spinner, $false, $true, 0 );
$vbox2 = new Gtk::VBox( $false, 0 );
$hbox->pack_start( $vbox2, $true, $true, 5 );
$label = new Gtk::Label( "Month :" );
$label->set_alignment( 0, 0.5 );
$vbox2->pack_start( $label, $false, $true, 0 );
$adj = new Gtk::Adjustment( 1.0, 1.0, 12.0, 1.0, 5.0, 0.0 );
$spinner = new Gtk::SpinButton( $adj, 0, 0 );
$spinner->set_wrap( $true );
$spinner->set_shadow_type( 'etched_in' );
$vbox2->pack_start( $spinner, $false, $true, 0 );
$vbox2 = new Gtk::VBox( $false, 0 );
$hbox->pack_start( $vbox2, $true, $true, 5 );
$label = new Gtk::Label( "Year :" );
$label->set_alignment( 0, 0.5 );
$vbox2->pack_start( $label, $false, $true, 0 );
$adj = new Gtk::Adjustment( 1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0 );
$spinner = new Gtk::SpinButton( $adj, 0, 0 );
$spinner->set_wrap( $false );
$spinner->set_shadow_type( 'in' );
$spinner->set_usize( 55, 0 );
$vbox2->pack_start( $spinner, $false, $true, 0 );
$frame = new Gtk::Frame( "Accelerated" );
$main_vbox->pack_start( $frame, $true, $true, 0 );
$vbox = new Gtk::VBox( $false, 0 );
$vbox->border_width( 5 );
$frame->add( $vbox );
$hbox = new Gtk::HBox( $false, 0 );
$vbox->pack_start( $hbox, $false, $true, 5 );
$vbox2 = new Gtk::VBox( $false, 0 );
$hbox->pack_start( $vbox2, $true, $true, 5 );
$label = new Gtk::Label( "Value :" );
$label->set_alignment( 0, 0.5 );
$vbox2->pack_start( $label, $false, $true, 0 );
$adj = new Gtk::Adjustment( 0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0 );
$spinner1 = new Gtk::SpinButton( $adj, 1.0, 2 );
$spinner1->set_wrap( $true );
$spinner1->set_usize( 100, 0 );
$vbox2->pack_start( $spinner1, $false, $true, 0 );
$vbox2 = new Gtk::VBox( $false, 0 );
$hbox->pack_start( $vbox2, $true, $true, 5 );
$label = new Gtk::Label( "Digits :" );
$label->set_alignment( 0, 0.5 );
$vbox2->pack_start( $label, $false, $true, 0 );
$adj = new Gtk::Adjustment( 2, 1, 5, 1, 1, 0 );
$spinner2 = new Gtk::SpinButton( $adj, 0.0, 0 );
$spinner2->set_wrap( $true );
$adj->signal_connect( "value_changed", \&change_digits, $spinner2 );
$vbox2->pack_start( $spinner2, $false, $true, 0 );
$hbox = new Gtk::HBox( $false, 0 );
$vbox->pack_start( $hbox, $false, $true, 5 );
$button = new Gtk::CheckButton( "Snap to 0.5-ticks" );
$button->signal_connect( "clicked", \&toggle_snap, $spinner1 );
$vbox->pack_start( $button, $true, $true, 0 );
$button->set_active( $true );
$button = new Gtk::CheckButton( "Numeric only input mode" );
$button->signal_connect( "clicked", \&toggle_numeric, $spinner1 );
$vbox->pack_start( $button, $true, $true, 0 );
$button->set_active( $true );
$val_label = new Gtk::Label( "" );
$hbox = new Gtk::HBox( $false, 0 );
$vbox->pack_start( $hbox, $false, $true, 5 );
$button = new Gtk::Button( "Value as Int" );
$button->set_user_data( $val_label );
$button->signal_connect( "clicked", \&get_value, $spinner1, 1 );
$hbox->pack_start( $button, $true, $true, 5 );
$button = new Gtk::Button( "Value as Font" );
$button->set_user_data( $val_label );
$button->signal_connect( "clicked", \&get_value, $spinner1, 2 );
$hbox->pack_start( $button, $true, $true, 5 );
$vbox->pack_start( $val_label, $true, $true, 0 );
$val_label->set_text( "0" );
$hbox = new Gtk::HBox( $false, 0 );
$main_vbox->pack_start( $hbox, $false, $true, 0 );
$button = new Gtk::Button( "Close" );
$button->signal_connect( "clicked", sub { Gtk->exit( 0 ); } );
$hbox->pack_start( $button, $true, $true, 5 );
$window->show_all();
main Gtk;
exit( 0 );
### Routines
sub toggle_snap { my ( $widget, $spin ) = @_; $spin->set_snap_to_ticks( $widget->active ); }
sub toggle_numeric { my ( $widget, $spin ) = @_; $spin->set_numeric( $widget->active ); }
sub change_digits { my ( $widget, $spin ) = @_; $spinner1->set_digits( $spin->get_value_as_int() ); }
sub get_value { my ( $widget, $spin, $num ) = @_; my $buf = ""; my $label; $label = new Gtk::Label( $widget->get_user_data() ); if ( $num == 1 ) { $buf = $spin->get_value_as_int(); } else { $buf = $spin->get_value_as_float(); } $val_label->set_text( $buf ); }