Crear, rellenar y recorrer Treeview con PHP-GTK

En este ejemplo veremos como crear un Treeview con Glade 2, para posteriormente recojerlo en modo ejecucción, rellenarlo y recorrerlo. Con este ejemplo aprenderas las nociones basicas para manejarte correctamente con esta herramienta de listado de datos.

Vamos a explicar con rasgos generales que és y que necesita un TreeView:

  • El treeview sólo es el contenedor de una lista.
  • Necesita una lista o un árbol para hacer el efecto que queremos.
  • Lo que necesita se llama ListStore y TreeStore, respectivamente.
  • Esos ‘Store’ tienen un modelo interno de funcionamiento, que en realidad es lo que necesita el TreeView.

Por lo que véis, para trabajar con treeview necesitaremos trabajar a tres niveles de interfície, con el view, el store y el model.

Voy a mostraros el código de mi programa, el cual, desde interfaz(archivo.glade) es necesario tener:

  • Un TreeView llamado ‘arbolTickets’
  • Un Label llamado ‘precioTotalTxt’

E aquí el código (es largo):

<?php
//Carga el archivo de la interfaz
$glade = new GladeXML(dirname(__FILE__) . ‘/main.glade’);

//Ata los metodos con los evocadores de estos.
$glade->signal_autoconnect();

//el treeview tendrá 4 columnas
$cell_renderer = new GtkCellRendererText();

/*PRIMERA COLUMNA*/
$colA = new GtkTreeViewColumn(’Fila#’, $cell_renderer, ‘text’, 0);
$colA->set_sort_column_id(1);//1 o TRUE

/*SEGUNDA COLUMNA*/
$colB = new GtkTreeViewColumn(’Descripción’, $cell_renderer, ‘text’, 1);
$colB->set_sort_column_id(1);

/*TERCERA COLUMNA*/
$colC = new GtkTreeViewColumn(’Cantidad’, $cell_renderer, ‘text’, 2);
$colC->set_sort_column_id(1);

/*CUARTA COLUMNA*/
$colD = new GtkTreeViewColumn(’Precio’, $cell_renderer, ‘text’, 3);
$colD->set_sort_column_id(1);

$store = new GtkTreeStore(64,64,32,32);//64->string;32->long

//Agregamos las filas al treeview
for($i=0;$i<10;$i++)
$store->append(null, array(’Fila #’.$i, ‘Item de la fila#’.$i,$i,($i*$i)));

/*recuperacion de la pantalla interfaz*/
$vnt = $glade->get_widget(’ventanaMain’);

/*recuperación del treeview realizado con el programa glade 2*/
$arbol = $glade->get_widget(’arbolTickets’);

/*recuperación del label del precio total realizado con el programa glade 2*/
$lblPrecioTotal = $glade->get_widget(’precioTotalTxt’);

/*En teoria a un nuevo treview se le asigna el model por su constructor
como este lo hemos recuperado, le asignamos el model a mano.*/
$arbol->set_model($store);

$aux=$arbol->get_model();//recojemos el modelo del arbol

function echoRow($store, $path, $iter)
{
global $total;
$precio = $store->get_value($iter, 3);
$total+=$precio;
}
$total=0;
$aux->foreach(’echoRow’); //dentro de la funcion $total esta en global, osea que rewcuperamos aqui el valor

//$lblPrecioTotal->set_text($total);
$lblPrecioTotal->set_markup(’<b><span>’.$total.’</span></b>’); // parametro necesario->bool (funcion pone negrita)

/*
* NECESARIO para mostrar correctamente las columnas
si alguna se omite no se mostrará.
Aquí agregamos las columnas creadas más arriba
*/
$arbol->append_column($colA);
$arbol->append_column($colB);
$arbol->append_column($colC);
$arbol->append_column($colD);

/*En nuestro caso son todo padres con lo que no afecta
pero sirve para expandir el contenido del treeview
* */
$arbol->expand_all();

/*Estas dos lineas servirian si el treeview o la ventana han sido creadas en modo ejecucción y no
previamente con un programa glade.
En este caso se le asigna el arbol a la ventanba y le decimos posteriormente a la ventana que lo
muestre todo*/
//$vnt->add($arbol);
//$vnt->show_all();

//Start the main loop
Gtk::main();
?>

Vamos a explicar por encima lo más relevante.

Creamos un objeto del tipo GtkCellRendererText, el cual es el que se encarga de crear las columnas pertinentes, más que crearlas diremos que hace algo así como maquetarlas. Posteriormente creamos tantos objetos GtkTreeViewColumn como columnas deseamos en el treeview. A este objeto le hemos puesto (por orden) el titulo visible que tendrá, al objeto GtkCellRendererText al que pertenece, osea a la maqueta a la que pertenece, luego hemos colocado el atributo ‘text’ que es lo que va a ser y por último la posición que va a tener.

También vereis el método set_sort_column_id(bool) en esta maquetación de columnas, con esa instrucción no decimos nada más que queremos que la columna tenga la capacidad de ordenarse si se lo indicamos.

$store = new GtkTreeStore(64,64,32,32);//64->string;32->long

Aquí creamos el ‘Store’, que es básicamente el que tiene los datos del TreeView. Los parametros necesarios en su constructor són indicarle cuantas columnas y el tipo de valor que contendran dichas columnas, asi nosotros tenemos ‘64,64,32,32′ o lo que es lo mismo, 4 columnas, las dos primeras de tipo texto y las siguientes del tipo long. Aquí encontrareis los tipos disponibles.

//Agregamos las filas al treeview
for($i=0;$i<10;$i++)
$store->append(null, array(’Fila #’.$i, ‘Item de la fila#’.$i,$i,($i*$i)));

Despues de crear el objeto $Store viene un bucle que es el que rellena las filas necesarias, en este ejmplo són 10, lo que tambien podriamos hacer con estos metodos y con el TreeStore es hacer un árbol, con padres, hijos, nietos… la única diferencia con el codigo mostrado aquí es que en vez de tener un null en la funcion append tendriamos la variable del padre, el cual tendriamos que recojer previamente. Algo así sería un ejemplo donde crearemos 10 padres con 1 hijo cada uno:

for($i=0;$i<10;$i++){

$padre=$store->append(null, array(’Fila #’.$i, ‘Item de la fila#’.$i,$i,($i*$i)));
$store->append($padre,array(’hijo’,'hijo’,0,0);

}

Fijaros en las pocas diferencias, es muy fácil.

$aux=$arbol->get_model();//recojemos el modelo del arbol

function echoRow($store, $path, $iter)
{
global $total;
$precio = $store->get_value($iter, 3);
$total+=$precio;
}
$total=0;
$aux->foreach(’echoRow’); //dentro de la funcion $total esta en global, osea que rewcuperamos aqui el valor

//$lblPrecioTotal->set_text($total);
$lblPrecioTotal->set_markup(’<b><span>’.$total.’</span></b>’);

Esta parte es la que se corresponde al recorrer los valores de un determinado campo del treeview.

Primero de todo recuperamos el Model del Treeview, si que es cierto que en el ejemplo mostrado aquí es un paso bastante inutil ya que conocemos que Store es ese model, pero no siempre tenemos porque saberlo.
Una vez recuperado vamos a recorrero con el metodo foreach, que necesita de una funcion.

La función que os mostramos aquí es bastante simple, crea una variable global, para que se corresponda con la variable del mismo nombre de fuera de la funcion, y recorre todas las filas recuperando y sumando el valor que contiene la columna 3(es la columna del precio).

No creo que tengais problemas para entender el codigo y todo lo demas. Con todo esto ya he conseguido hacer una lista, recorrerla, cojer los parametros que yo quiero…

Etiquetas: , , , , , , , ,

Deja un comentario

CAPTCHA Image Audio Version
Reload Image