BagOfTricks

Aquí podrán encontrar pequeños trucos que tal vez le interesen

Como construir una lista de morphs a partir de imagenes

Debemos poseer un directorio con una lista de archivos de imagenes con los formatos que lee el Squeak, ej. .gif o .jpg que son los mas utilizados en Internet

El dibujo que se ve es lo que se obtiene.

Los iconos estan tomados del VisualWorks y obviamente si se acciona los botones resultantes, daría error al no existir metodos implementados.

hacerBotones

| slash oldFolder newFolder listaArchivos archivo pos aFileName f esteBoton fileStream selector cadena |
slash _ FileDirectory slash. " Toma el separador de directorios, no es el mismo en todos los OS"
oldFolder _ FileDirectory default. " Guarda el directorio de arranque "
newFolder _ FileList2 modalFolderSelector. "Invoca la ventana de dialogo para seleccionar directorio "
listaArchivos _ newFolder fileNamesMatching: '*.gif'. " Solo nos interesan los .gif para este ejercicio "
newFolder _ newFolder pathName , slash.
FileDirectory setDefaultDirectory: newFolder. "Seteamos al directorio elegido "
1
to: listaArchivos size "Recorremos la lista de archivos que concuerdan con el criterio elegido "
do: [:i |
archivo _ listaArchivos at: i.
pos _ archivo findString: '.'.
aFileName _ (archivo copyFrom: 1 to: pos)
, 'morph'. " Creamos un nuevo nombre de archivo "
cadena _ '#'
, (archivo copyFrom: 1 to: pos).
selector _ Symbol readFromString: cadena. "Creamos un simbolo a partir del nombre de archivo "
f _ Form fromFileNamed: archivo. "Leemos el archivo dentro de un Form "
esteBoton _ IconicButton new. "Creamos una instancia de IconicButton "
esteBoton initialize. "La inicializamos "
esteBoton labelGraphic: f. "Hacemos que utilice nuestro grafico "
esteBoton target: self. "Por defecto los mensajes serár enviados a la clase Utilitarios "
esteBoton actionSelector: selector. "Y la acciona a ejecutar es el nombre del boton "
fileStream _ FileStream newFileNamed: aFileName. "Abrimos un archivo de salida y grabamos "
fileStream fileOutClass: nil andObject: esteBoton].
FileDirectory setDefaultDirectory: oldFolder pathName "Al teminar volvemos al directorio default "

Una vez creados nuestros botones, deseamos construir una paleta con los mismos.

Al costado del codigo se ve la paleta obtenida

hacerPaleta
| frame buttons slash oldFolder newFolder listaArchivos archivo newMorph n max |
frame _ AlignmentMorph newColumn.
slash _ FileDirectory slash.
oldFolder _ FileDirectory default.
newFolder _ FileList2 modalFolderSelector.
listaArchivos _ newFolder fileNamesMatching: '*.morph'.
newFolder _ newFolder pathName , slash.
FileDirectory setDefaultDirectory: newFolder.
buttons _ OrderedCollection new.
n _ listaArchivos size.
1
to: n
do: [:i |
archivo _ listaArchivos at: i.
newMorph _ Utilitarios leerMorph: archivo.

buttons add: newMorph].
"Add the buttons to the same frame"
buttons
do: [:each | frame addMorph: each].
"Compute the max width"
max _ 0.
buttons
do: [:each | max _ each width max: max].
frame openInWorld.
FileDirectory setDefaultDirectory: oldFolder pathName

Y una variante para obtener una paleta rectangular seria

hacerPaletaDe: botonesAncho
| slash oldFolder newFolder listaArchivos archivo newMorph n paleta x y cuenta maxX maxY |
paleta _ PasteUpMorph new.
slash _ FileDirectory slash.
oldFolder _ FileDirectory default.
newFolder _ FileList2 modalFolderSelector.
listaArchivos _ newFolder fileNamesMatching: '*.morph'.
newFolder _ newFolder pathName , slash.
FileDirectory setDefaultDirectory: newFolder.
paleta layoutPolicy: nil.
paleta hResizing: #rigid.
paleta vResizing: #rigid.
paleta borderWidth: 2.
paleta borderColor: Color black.
paleta color: Color gray.
maxX _ 0.
maxY _ 0.
x _ 0.
y _ 0.
cuenta _ 0.
n _ listaArchivos size.
1
to: n
do: [:i |
archivo _ listaArchivos at: i.
newMorph _ Utilitarios leerMorph: archivo.

paleta addMorph: newMorph.
cuenta < (botonesAncho + 1)
ifTrue: [x _ x + newMorph width.
cuenta _ cuenta + 1]
ifFalse: [y _ y + newMorph height.
x > maxX
ifTrue: [maxX _ x].
x _ 0.
cuenta _ 0.
]].
maxX _ maxX + 10 .
y _ y + 10.
paleta extent: maxX @ y.
paleta becomeLikeAHolder.
paleta openInWorld.

 


1
Hosted by www.Geocities.ws