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.