28 de Junio 2006

IconView

Nuevo widget portado a T-Gtk

Recientemente estoy realizando portando mas widgets en T-Gtk, y esta vez le
a tocado a los iconview.

Desarrollando la aplicacion que anteriormente habiamos comentado, me encontré
con la necesidad de mostrar una imagen.

Pensé un momento, y me dí cuenta, que lo mejor era mostrar todas las imagenes
que quiesiera.

Para ello, la mejor manera que vi, fue el usar el widget llamado GtkIconView.

Dicho widget hace uso de un modelo de datos, para mostrar imagenes más una etiqueta.

Su funcionamiento es muy simple usando POO, podemos realizar lo que estamos buscando, que era mostrar una lista de imagenes.

El codigo es muy simple:


DEFINE WINDOW oWnd TITLE "GtkIconView. T-Gtk for [x]Harbour (c)03-2006 Rafa Carmona" SIZE 500,500
DEFINE SCROLLEDWINDOW oScroll OF oWnd CONTAINER
oModel := Create_Model()
DEFINE ICONVIEW oIconView MODEL oModel OF oScroll CONTAINER
* Indicamos que la primera columna es el que contiene el texto.
oIconView:SetTexColumn( 1 )
* Indicamos que la segunda columna es el que contiene la imagen.
oIconView:SetPixBufColumn( 2 )
* Indicamos que queremos 5 columnas.
oIconView:SetColumns( 5 )
* Cada vez que activemos la imagen, double-click o return, saltaremos
* a la funcion Comprueba, y veremos como mostrar la imagen real.
oIconView:bItem_Activated := {|oSender,pPath| Comprueba( oSender, pPath ) }
ACTIVATE WINDOW oWnd CENTER

Como podeis apreciar, el codigo inicial, son unas pocas lineas, sin ningun
tipo de misterio ni complicacion.

Ahora nos detendremos en la creacion del modelo de datos, que lo realizamos
desde la funcion Create_Model(), el cual podeis observar a continuacion,
y os sorprendereis lo poquita cosa que es:

 FUNCTION Create_Model()
   local aIter := array( 4 )
   local oLbx, x, oImage,pixbuf
   Local aFiles := {}
   local aPngs := Directory( "../../images/*.png" )
   local aJpgs := Directory( "../../images/*.jpg" )
   
 * Obtenemos TODOS los ficheros graficos
   Aeval( aPngs ,{ | a| AADD( aFiles, a[1] ) } )
   Aeval( aJpgs ,{ | a| AADD( aFiles, a[1] ) } )
 
 

* Definimos el model de datos, ListStore, con los tipos adecuados.
DEFINE LIST_STORE oLbx TYPES G_TYPE_STRING, GDK_TYPE_PIXBUF
For x := 1 To Len( aFiles )
APPEND LIST_STORE oLbx ITER aIter
SET LIST_STORE oLbx ITER aIter POS 1 VALUE aFiles[x]
* Cargamos la imagen
DEFINE IMAGE oImage FILE "../../images/"+aFiles[ x ] LOAD
* Conversion de la imagen a 100x100
pixbuf := gdk_pixbuf_scale_simple( oImage:GetPixBuf(), 100,100 )
SET LIST_STORE oLbx ITER aIter POS 2 VALUE pixbuf
gdk_pixbuf_unref( pixbuf )
Next
RETURN oLbx

La única cosa que nos trae la atencion, es la funcion gdk_pixbuf_scale_simple().
Bueno, he de decir, que si cargamos el modelo de datos con la imagen, este lo
cargará con el tamaño REAL, asi, tendremos en la vista de los iconos, diferentes
tamaños, dando la sensacion un poco extraña.

Para ello lo que vamos a realizar, es transformar dicha imagen a una que nos
interese, en este caso a 100x100.

Asi, cuando cargamos la imagen:
DEFINE IMAGE oImage FILE "../../images/"+aFiles[ x ] LOAD

Podemos facilmente transformala al tamaño que nos interese:
pixbuf := gdk_pixbuf_scale_simple( oImage:GetPixBuf(), 100,100 )

Y podeis observar , como el valor de la variable, pixbuf, es la que vamos
a introducir en el modelo de datos:
SET LIST_STORE oLbx ITER aIter POS 2 VALUE pixbuf

Y lo último que nos queda por hacer, es desreferenciar el pixbuf:
gdk_pixbuf_unref( pixbuf )

Ahora lo úncio que nos queda, es coger el valor de donde estamos
y hacer algo interesante , como mostrar la imagen en su tamaño real,
en una ventana.

 Static Function Comprueba( oIconView, pPath  )
     Local oWnd , oImage, width, height, pImage, cText
 
 

* Obtenemos el nombre del fichero
cText := oIconView:GetValue( 1,, pPath )

DEFINE WINDOW oWnd TITLE cText TYPE_HINT GDK_WINDOW_TYPE_HINT_MENU
DEFINE IMAGE oImage FILE "../../images/"+cText OF oWnd CONTAINER

ACTIVATE WINDOW oWnd MODAL CENTER

Return nil

Bueno, espero que con esta explicación podais entender mejor dicho widget.
Como siempre , una imagen vale más que mil palabras ;-)

tgtk_iconview.JPG

Escrito por Rafa Carmona a las 28 de Junio 2006 a las 07:11 PM
Comentarios
Escribir un comentario









¿Recordar informacion personal?