Manuel §1.2.16🗏    

Widget et DC

Sisal prédéfinit deux classes particulières ; Widget (mot réservé) et DC (mot réservé). Ces classes sont particulières car gérées directement par Sisal [1] .

Un DC (Device Context) est créé par Sisal chaque fois qu'un widget doit être peint, il contient l'ensemble des caractéristiques ( taille de la zone d'affichage, pinceau, peinture, épaisseur des traits,..) de l'ustensile utilisé pour peindre ( écran, imprimante,...).

Un widget est un objet d'interface homme-machine (windows-gadget), qui peut être utilisé dans une vue de synoptique ; c'est un objet qui définit à minima la méthode C reate [2] et qui dispose en plus des méthodes permettant de le placer et de le peindre dans le synoptique.

La méthode Place (mot réservé) permet de calculer comment sont placés les sous-ensemble de l'objet en fonction de la taille et du positionnement transmis en paramètre. La méthode place permet en particulier de mémoriser le placement du widget.

La méthode Paint (mot réservé) permet de peindre le widget lorsque Sisal a besoin de repeindre le widget.

widget class  sys 1 begin
x; y; w; h;
alfa;
Create( libel, x, y, w, h);
Place( x, y, w, h);
Paint( mydc DC);
end;

rond class widget begin
color;
create( libel, x, y, w, h, color);
Paint( mydc dc);
end;

Function rond.create( libel_, x_, y_, w_, h_, color_)
begin
color = color_;
place( x_, y_, w_, h_);
end

Function rond.paint( mydc dc)
begin
mydc.setbrush( color);
mydc.drawRectangle( x, y, w, h);
end

Object
w0 widget,  "", 10, 10, 20, 20;
r1 rond, "", 50, 10, 20, 20, RGB( 0, 255, 0);

Afin de pouvoir être placé et modifié dans un canevas avec l'outil de conception intégré [3] , une classe widget doit définir la méthode Print() qui rend le corps de la déclaration à inclure dans le source du synoptique.

Function rond.print()
begin
return "\"", ":x:", ":y:",  ":w:", ":h:", ":color;
end

En mode édition, le canevas fait apparaître sur le widget sélectionné des poignées aux 4 coins du widget ( soit { x, y}, { x+w, y}, { x, y+h}, { x+w, y+h} ; l'utilisateur peut tirer sur ces poignées pour modifier la taille du widget.

Certains widgets offrent des poignées supplémentaires, par exemple lorsque l'on veut représenter un tuyau parcourant le canevas, on les représente alors par une liste de points ( { { 0, 0}, { 10, 5}, { 5, 10}, { 10, 10}}) ; ces poignées internes peuvent être déplacées à la condition que le canevas puisse les connaître et les modifier, c'est le rôle des méthodes getHandles() et setHandles().

tuyau class widget begin
handles list; // Liste des poignees internes
create( libel, x, y, w, h, hnd list);
Paint( mydc dc);
Print();
GetHandles();
SetHandles( hnd list);
end;

Function tuyau.create( libel_, x_, y_, w_, h_, hnd)
begin
handles = hnd;
place( x_, y_, w_, h_);
end

Function tuyau.paint( mydc dc)
var prime list;seconde list;
begin
mydc.setbrush( rgb( 255, 128, 64));
for iter in handles do begin
if prime == {} then prime = value( iter);
else begin
seconde = value( iter);
mydc.DrawLine( prime[0], prime[1], seconde[0],  seconde[1]);
prime = seconde;
end
end
end

Function tuyau.getHandles()
begin
return handles;
end

Function tuyau.setHandles( hnd list)
begin
handles = hnd;
end

Object
w0 widget,  "", 10, 10, 20, 20;
r1 tuyau, "", 50, 10, 20, 20, { { 0, 0}, { 10, 5}, {  5, 10}, { 10, 10}};

[1] Dans leurs déclarations (cf.widget.sch) elles sont postfixées par le mot-clé sys et un paramètre pour indiquer à Sisal quelles fonctions internes doivent être appelées. Ces déclarations ne doivent en aucun cas être modifiées.

[2] En tant qu ’objet, la fonction Create n'a pas de paramètre obligatoire, ni d'ordre à respecter ; cependant les outils d'éditions d'Interface-Homme Machine existants ou à exister s'attendent à trouver dans l'ordre un libellé, x, y, w et h. De même si cet éditeur trouve un paramètre contenant une liste ( même vide {}), il l'interprétera comme une liste de poignées pouvant être déplacées interactivement. Cela permet de dessiner un tuyau par exemple, chaque poignée désignant un coude.

[3] L'utilisateur doit avoir un privilège de niveau administrateur, en appuyant sur la touche Control et en cliquent un objet du canevas, ce dernier passe en mode de modification. Un Ctl-clic droit sur le canevas permet de sauvegarder le synoptique avec le canevas mis à jour.