Mécanique Smalltalk (4)






IX/ Un catalogue d'image

But de l'application : Afficher les images BMP contenues dans un dossier (répertoire ou directory si vous préférez). Ceci est réalisé par l'implémentation de deux classes :

Implémentation de la classe VLImageView

VLImageView est une sous-classe de View. Nous avons défini deux variables d'instance : aspect et image, pour contenir respectivement un symbole et l'image à afficher.

Le symbole aspect est utiliser pour faire une mise à jour sélective : Lors de la réception du message #update: (provoqué par un changement du modèle) la vue ne se redessine que si le message à en argument le symbole contenu dans la variable aspect.

La vue se redessine également si l'image est réaffectée (par un message #image:).

Pour l'instanciation nous avons prévu le message #on:aspect: qui permet de spécifier le modèle et l'aspect. L'image est donnée par un message ultérieur envoyé à l'instance.

Exemple :

	| win |
	win := ScheduledWindow new.
	win component: ((VLImageView on: nil aspect: nil) image: Image fromUser).
	win open
Cet exemple construit une fenêtre win, et place une VLImageView dans cette fenêtre. Image fromUser délivre une image que l'utilisateur choisi sur l'écran. Le second exemple (cf. classe [examples]) permet de lire l'image dans un fichier.

Pour essayer, voici des fichiers au format BMP : flare1.bmp flame1.bmp zdeck1.bmp stone1.bmp water1.bmp grass1.bmp rail1.bmp tree1.bmp snow1.bmp tile1.bmp watf1.bmp wood1.bmp brick1.bmp

L'implémentation proprement dite se résume à deux méthodes :

La méthode d'affichage :

displayOn: aGraphicsContext
	image notNil ifTrue: [
		image displayOn: aGraphicsContext ]
Qui ne fait que retransmettre le message #displayOn: à l'image si elle est présente.

Et la méthode ne mise à jour :

update: aSymbol
	aSymbol = aspect ifTrue: [ self invalidate ]
Les autres méthodes sont de simples accès (La méthode #image ne sert pas ni pour les exemples ni pour le catalogue, mais elle pourrait servir dans d'autre cas, par exemple si l'application à besoin d'accéder à l'image pour la transformer.

Implémentation du catalogue

Le modèle du catalogue est implicite, c'est le système de fichiers contenant les images.

L'application est donc directement construite avec les outils canevas et palettes.

Trois contrôles sont créés :

Aspects et variable d'instance

Le message #dirname ramène une instance de ValueHolder dont la valeur sera le nom du répertoire.

Le message #liste ramènera une instance de SelectionInList dont la liste contiendra les noms de fichiers (cf message #computeListe).

Enfin le message #image ramène une instance de VLImageView.

Pour ces trois messages, une variable d'instance du même nom conserve les valeurs. Si la variable contient nil elle est remplacée, sinon c'est la valeur courante qui est donnée.


Mise à jour :

Quand le nom du répertoire est changé, l'image est effacée et la liste est recalculée.
dirnameChanged
 	self image image: nil.
	self liste list: (self computeListe).
Quand la sélection change dans la liste, l'image est rechargée à partir du nom de fichier choisi.

listeChanged
	| name filename reader |
	name := self liste selection.
	name notNil ifTrue: [
		filename := self dirname value asFilename construct: name.
		reader := ImageReader fromFile: filename asFilename.
		self image image: reader image.
	 ] ifFalse: [ self image image: nil ]

(suite)


Date de mise à jour 24/11/1996 m a i l t o : v i @ a i . u n i v - p a r i s 8 . f r
Vincent LESBROS, Mécanique Smalltalk (4)