Les règles sont utilisées pour indiquer la position du pointeur de souris dans une fenêtre donnée. Une fenêtre peut avoir une règle horizontale qui s'étire sur toute la largeur et une règle verticale qui s'étire sur toute la hauteur de la fenêtre. Un petit indicateur triangulaire sur la règle montre la position exacte du pointeur.
Une règle doit d'abord être créée. Les règles horizontales et verticales sont créées par :
$hruler = new Gtk::HRuler();$vruler = new Gtk::VRuler();
Une fois que la règle est créée, nous pouvons définir l'unité de mesure. Les
unités possibles sont 'pixels', 'inches', 'centimeters'.
Ce choix se fait avec :
$ruler->set_metric($metric);
L'unité de mesure par défaut est 'pixels'.
Une autre caractéristique important des règles est la possibilité d'indiquer les graduations et de placer l'indicateur initialement. Ces réglages se font en utilisant :
$ruler->set_range( $lower , $upper , $position , $max_size );
Les arguments $lower et $upper définit la longueur de la règle
et $max_size est le plus grand nombre possible qui sera affiché. $position
définit la position initiale de l'indicateur de pointeur sur la règle.
Une règle verticale peut mesurer une fenêtre de 800 pixels de haut ainsi :
$vruler->set_range( 0 , 800 , 0 , 800 );
Les marques affichées sur la règle iront de 0 à 800 et un nombre sera affiché tous les 100 pixels. Si, à la place, vous désirez une règle qui mesure entre 7 et 16, vous coderez :
$vruler->set_range( 7 , 16 , 0 , 20 );
L'indicateur est une petite marque triangulaire qui indique la position du pointeur
relatif à la règle. Si cette règle est utilisée pour suivre le pointeur de la
souris, le signal ''motion_notify_event'' doit être connecté à la méthode
''motion_notify_event'' de la règle. Pour suivre tous les mouvements
de la souris à l'intérieur d'une surface, vous pouvez utiliser :
$surface->signal_connect(''motion_notify_event'',
sub{ $ruler->motion_notify_event ( $_[1] ) ; } ) ;
L'exemple suivant crée une aire de dessin avec une règle horizontale en haut et une verticale à gauche. La taille de l'aire de dessin est de 600 pixels de large sur 400 pixels de haut. La règle horizontale mesure de 7 à 13 avec une marque tous les 100 pixels alors que la règle verticale mesure de 0 à 400 avec une marque tous les 100 pixels. Le placement de l'aire de dessin se fait en utilisant une table.
Si vous regardez bien, vous remarquerez que le pointeur de la souris n'apparaît pas sur l'image ci-dessus, mais vous pouvez dire où il est grâce aux indicateurs sur les règles. Je chercherais plus tard comment faire apparaître le pointeur dans un screenshot.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $xsize = 600;
my $ysize = 400;
my $window;
my $table;
my $area;
my $hrule;
my $vrule;
$window = new Gtk::Window( "toplevel" );
$window->signal_connect( "delete_event", sub { Gtk->exit( 0 ); } );
$window->border_width( 10 );
# Crée une table pour y placer les règles et l'aire de dessin
$table = new Gtk::Table( 3, 2, $false );
$window->add( $table );
$area = new Gtk::DrawingArea();
$area->size( $xsize, $ysize );
$table->attach( $area, 1, 2, 1, 2, [ 'expand', 'fill' ], 'fill', 0, 0 );
$area->set_events( [ 'pointer_motion_mask', 'pointer_motion_hint_mask' ] );
# La règle horizontale va en haut. Quand la souris traverse l'aire de dessin,
# un motion_notify_event est passé au gestionnaire de signal approprié
# de la règle
$hrule = new Gtk::HRuler();
$hrule->set_metric( 'pixels' );
$hrule->set_range( 7, 13, 0, 20 );
$area->signal_connect( "motion_notify_event", sub { $hrule->motion_notify_event( $_[1] ); } );
$table->attach( $hrule, 1, 2, 0, 1, [ 'expand', 'shrink', 'fill' ], 'fill', 0, 0 );
# La règle verticale va à gauche. Quand la souris traverse l'aire de dessin,
# un motion_notify_event est passé au gestionnaire de signal approprié
# de la règle
$vrule = new Gtk::VRuler();
$vrule->set_metric( 'pixels' );
$vrule->set_range( 0, $ysize, 10, $ysize );
$area->signal_connect( "motion_notify_event", sub { $vrule->motion_notify_event( $_[1] ); } );
$table->attach( $vrule, 0, 1, 1, 2, [ 'fill', 'expand', 'shrink' ], 'fill', 0, 0 );
# On montre tout
$area->show();
$hrule->show();
$vrule->show();
$table->show();
$window->show();
main Gtk;
exit( 0 );