Implementacion de Tree Store en POO.
Si bien, habia implementado en T-Gtk el tema de los Listore, este fin de semana
he sacado tiempo para terminar el tema de los Tree Store.
He realizado una mejora con respecto a los listore, que tengo que tocarlos para que
soporten la manera de hacer en ambos modelo de datos, y es que si una columna,
el padre , OF, no es un TreeView , lo tratará como otra columna, de esta manera,
podemos formar varias columnas, como una sola columna.
La verdad, es que el Modelo/Vista/Controlador, nos da un maravillo mundo de posibilidades.
Como muestra, una imagen:
Como siempre, aqui esta el codigo fuente:
/* Ejemplo de TreeStore */#include "gclass.ch"
#define GtkTreeIter Array( 4 )
Function Main()
local hWnd, oScroll, oTreeView, oWnd, oLbx, oBox, oCol, oCol2, oCol4
DEFINE WINDOW oWnd TITLE "T-Gtk TreeStore power!!" SIZE 600,400
DEFINE BOX oBox VERTICAL SPACING 8 OF oWnd
DEFINE LABEL PROMPT "Planning Calendar" OF oBox
DEFINE SCROLLEDWINDOW oScroll OF oBox EXPAND FILL
oScroll:SetShadow( GTK_SHADOW_ETCHED_IN )
oScroll:SetPolicy( GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC)
/*Modelo de Datos */
oLbx := Create_Model()
DEFINE TREEVIEW oTreeView MODEL oLbx OF oScroll CONTAINER
oTreeView:SetRules( .T. )
DEFINE TREEVIEWCOLUMN oCol COLUMN 1 TITLE "Holiday" TYPE "text" OF oTreeView
oCol:SetResizable( .T. )
// Esta columna, formará parte de "Holiday"
DEFINE TREEVIEWCOLUMN COLUMN 4 TYPE "progress" OF oColDEFINE TREEVIEWCOLUMN oCol COLUMN 2 TITLE "Check + FIESTA!!" TYPE "active" OF oTreeView
oCol:Set_Valist( oCol:pRenderer ,{ "cell-background", "Yellow", ;
"cell-background-set", .t. } )
// Fijaos, como podemos FORMAR en una misma columna , un grafico , por ejemplo.
// Ademas, alineamos el pixbuf a la derecha, xAlign, y mantememos el mismo color de fondo
DEFINE TREEVIEWCOLUMN oCol2 COLUMN 3 TYPE "pixbuf" OF oCol EXPAND
oCol2:Set_Valist( oCol2:pRenderer ,{ "cell-background", "Yellow", ;
"cell-background-set", .t.,;
"xalign", 0.0 } )oTreeView:SetFocus()
ACTIVATE WINDOW oWnd CENTER
RETURN NILSTATIC FUNCTION Create_Model()
local oLbx
local aParent, aChild , aIter
local nMonth, nDay, pixbuf
local nToday := 0
local aDays := { "Lunes", "Martes", "Miercoles", "Jueves", ;
"Viernes", "Sabado", "Domingo" }
local aMonths := { "Ene", "Feb", "Mar", "Abr", "May", "Jun", ;
"Jul", "Ago", "Sep", "Oct", "Nov", "Dic" }DEFINE TREE_STORE oLbx TYPES G_TYPE_STRING, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF , G_TYPE_INT
pixbuf := gdk_pixbuf_new_from_file( "../../images/gnome-gsame.png" )
for nMonth := 1 to len( aMonths )
APPEND TREE_STORE oLbx ITER aParent VALUES aMonths[nMonth]
SET TREE_STORE oLbx ITER aParent POS 4 VALUE 50
for nDay := 1 to 30
if nToday == 7
SET TREE_STORE oLbx ITER aParent POS 2 VALUE .T.
nToday = 1
else
nToday += 1
endif
SET TREE_STORE oLbx ITER aParent POS 2 VALUE .T.
APPEND TREE_STORE oLbx PARENT aParent ;
ITER aChild ;
VALUES aDays[nToday] + " " +;
str(nDay,2) + " de " + aMonths[nMonth] + " de 2.005"
if aDays[nToday] == "Sabado" .OR. aDays[nToday] == "Domingo"
SET TREE_STORE oLbx ITER aChild POS 2 VALUE .T.
SET TREE_STORE oLbx ITER aChild POS 3 VALUE pixbuf
SET TREE_STORE oLbx ITER aChild POS 4 VALUE 100
else
SET TREE_STORE oLbx ITER aChild POS 4 VALUE nDay
endif
next
next
gdk_pixbuf_unref( pixbuf )
/* Ejemplo de INSERTAR un padre y un par de hijos en la primera posicion */
INSERT TREE_STORE oLbx ROW 1 ITER aParent // Padre
SET TREE_STORE oLbx ITER aParent POS 1 VALUE "Hola" // Valor Padre
SET TREE_STORE oLbx ITER aParent POS 4 VALUE 75 // Valor de Progress
INSERT TREE_STORE oLbx ROW 1 ;
ITER aChild PARENT aParent ;
VALUES "Hijo",.T.,pixbuf,100 // Hijo con valores directamenteINSERT TREE_STORE oLbx ROW 1 ;
ITER aIter PARENT aChild ;
VALUES "SubHijo",.F.,,50 // Hijo con valores directamenteReturn oLbx
Saludos.
Escrito por Rafa Carmona a las 24 de Octubre 2005 a las 03:42 PMTu Duermes ????
Tu trabajo es excelente y genera una sana envidia por tus conocimientos.
Atte.,
Lautaro Moreira