Tk::mega - support perl/Tk pour écrire des widgets en Perl pur
Définir le nom de la nouvelle classe de widget :
package Tk::MyNewWidget;
Pour les classes de widgets composites :
use base qw/ Tk::container /; # où container est une Frame ou une Toplevel
Pour les classes de widgets dérivées :
use base qw/ Tk::Derived Tk::DerivedWidget /;
Installer le nouveau widget dans l'espace de noms de Tk et créer les constructeurs d'instance :
Construct Tk::Widget 'MyNewWidget';
sub ClassInit { my ($self, $args) = @_; ... }
sub Populate { my ($self, $args) = @_; ... }
Le but du support pour les mega widgets de perl/Tk est de faciliter l'écriture de mega widgets qui suivront le même protocole et auront la même interface que les widgets du coeur de Tk. Pour un exemple de code de mega-widget, vous devriez essayer le programme de démonstration widget, et aussi lire la section Exemples de Mega-Widgets Perl.
Il existe deux types de mega widgets :
Utilisation :
$cw->Advertise(nom=>$widget);
Donne au subwidget $widget du widget composite $cw le nom nom. On peut retrouver la référence d'un subwidget 'nommé' (advertised) avec la méthode Subwidget.
Commentaire : réalisateurs de mega widgets, merci de documenter les widgets 'nommés' destinés à une utilisation publique. S'il n'en existe pas, documentez ce fait, par exemple :
=head1 ADVERTISED WIDGETS
None.
Utilisation :
$self->Callback(-option ?,args ...?);
Callback exécute le callback défini avec $mega->ConfigSpecs(-option, [CALLBACK, ...]) ; si les args existent ils sont passés au callback. Si -option n'est pas défini il ne se passe rien.
Utilisation :
sub ClassInit { my ($class, $mw) = @_; ... }
ClassInit est appelé une fois pour chaque MainWindow juste avant que la première instance de la classe du widget soit créée dans l'arbre des widgets de MainWindow.
ClassInit est souvent utilisé pour définir les liens (bindings) et/ou d'autres ressources partagées par toutes les instances, par exemple les images.
Exemples :
$mw->bind($class,"<Tab>", sub { my $w = shift; $w->Insert("\t"); $w->focus; $w->break; }); $mw->bind($class,"<Return>", ['Insert',"\n"]); $mw->bind($class,"<Delete>",'Delete');
Remarquez que $class est le nom de classe (par exemple Tk::MyText) et $mw est la fenêtre principale.
N'oubliez pas d'appeler $class->SUPER::ClassInit($mw) dans ClassInit.
Utilisation :
$cw->Component('Whatever', 'AdvertisedName', -delegate => ['method1', 'method2', ...], ... options du widget Whatever ..., );
Component effectue pour vous plusieurs choses dans un seul appel :
Exemple :
$cw->Component('Button', 'quitButton', -command => sub{ $mw->'destroy' });
Utilisation :
$cw->ConfigSpecs( -option => [ where, dbname, dbclass, default], ..., DEFAULT => [where], );
Définit les options d'un mega widget ainsi que les actions qui sont déclenchées par un configure/cget sur une option (voir Tk::ConfigSpecs et Tk::Derived pour les détails).
Utilisation :
Construct baseclass 'Name';
Construct déclare une nouvelle classe de widget, ainsi votre mega widget se comporte comme les widgets standard de Perl/Tk.
Exemples :
Construct Tk::Widget 'Whatever'; Construct Tk::Menu 'MyItem';
Le premier exemple permet l'utilisation de $widget->Whatever pour créer un nouveau widget Whatever.
Le deuxième exemple restreint l'usage de la méthode de constructeur MyItem à des widgets dérivées de Menu : $isamenu->MyItem.
sub CreateArgs { my ($package, $parent, $args) = @_; ...; return @newargs; }
$package est le package du mega widget (par exemple, Tk::MyText, $parent le parent du widget à créer et $args la référence au hash des options spécifiées lors de l'appel du constructeur du widget.
N'oubliez pas d'appeler $package->SUPER::CreateArgs($parent, $args) dans CreateArgs.
Utilisation :
$cw->Delegates( 'method1' => $subwidget1, 'method2' => 'advertised_name', ..., 'Construct' => $subwidget2, 'DEFAULT' => $subwidget3, );
La délégation 'Construct' a une signification spéciale. Après que 'Construct' soit délégué tous les constructeurs de widget sont redirigés. Par exemple après
$self->Delegates('Construct'=>$subframe);
un $self->Button effectue en réalité $subframe->Button et ainsi le button créé est un fils de $subframe et non de $self.
Commentaire : Delegates fonctionne uniquement avec des méthodes que $cw ne possède pas lui-même.
Définit la construction et l'interface de widgets dérivés.
Utilisation :
sub InitObject { my ($derived, $args) = @_; ... }
où $derived est la référence du widget de la classe de base déjà créé et $args la référence à un hash de paires -option => valeur.
InitObject est quasi identique à la méthode Populate. Populate réalise en plus quelques choses 'magiques' supplémentaires très utiles pour les mega widgets comportant plusieurs widgets.
N'oubliez pas d'appeler $derived->SUPER::InitObject($args) dans InitObject.
Utilisation :
$widget->OnDestroy(callback);
OnDestroy installe un callback qui sera appelé lorsqu'un widget va être détruit. Très utile pour des actions spéciales de nettoyage. Il diffère d'un destroy normal en ce que toute la structure de données du widget est encore intacte.
Commentaire : on peut utiliser cette méthode avec tous les widgets, et pas seulement avec les mega widgets. Elle est citée ici parce qu'elle est très utile.
Utilisation :
sub Populate { my ($self, $args) = @_; ... }
où $self est la référence du widget de la classe de base déjà créé et $args est la référence à un hash de paires -option => valeur.
La plupart des autres fonctions support sont normalement utilisées dans la sub Populate.
N'oubliez pas d'appeler $cw->SUPER::Populate($args) dans Populate.
Utilisation :
$hashref = $mega->privateData();
$another = $mega->privateData(unique_key|package);
@subwidget = $cw->Subwidget ();
$subwidget = $cw->Subwidget(name);
@subwidget = $cw->Subwidget(name ?,...?);
Renvoie la (les) référence(s)
d'un subwidget connu sous le(s)
nom(s)
name. Sans arguments, renvoie la liste de tous les subwidgets de $cw
connus. Voir la méthode Advertise pour définir name pour un subwidget.
Commentaire : Utilisateurs de mega widget, utilisez Subwidget pour retrouver uniquement les subwidgets documentés.
Switch : Name : Class : -padx padX Pad -activerelief activeRelief Relief -activebackground activeBackground Foreground -status undef undef
On devrait faire la même chose lorsqu'on définit une de ces options via ConfigSpecs.
sub bind { my $self = shift; my $to = $self->privateData->{'my_bind_target'}; $to->bind(@_); }
Mais privateData prend un argument optionnel si vous désirez forcer le renvoi d'un HASH particulier.
Bien entendu perl/Tk ne définit pas de fonction support pour tous les besoins. Voici une courte liste des choses que vous devez gérer vousmême :
mega, composite, derived, widget
Tk::composite Tk::ConfigSpecs Tk::option Tk::callbacks Tk::bind
Jean-Pierre Vidal jeanpierre.vidal@free.fr
Aucune relecture pour le moment