PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 531: How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors - Method 2?
Written by kksou   
Thursday, 20 November 2008
Problem

Elizabeth Smith wrote a very interesting blog article on October 6, 2008 titled "Treeviews and Cell Renderer Properties - Practical PHP-GTK". I only saw it today, and found this very interesting and useful.

Although she has only showed an example of how to change the background color of a single cell in a treeview, the method can be applied to a lot of situations in treeview. Instead of using a custom dispay function, you can actually do it right inside a tree store or list store.

However, this does not mean that you can now throw the custom display function out of the window. You will find that in many situations, you will still need to use the custom display function.

In order to understand when to use the custom display function, and when you can use Elizabeth's method, I think the best way is to let you see how the two methods are used in practice.

In the next couple of sample codes, you will see how I transform some of the treeview sample codes I've written in the past and achieve the same result using Elizabeth's method. I would strongly encourage you to compare the two sample codes so that you understand the differences and similarities between the two methods.

The first example I'll show is the display of a list view in alternate row colors.

First take a look at the sample code using the custom display function: How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors?

Then study the sample code below that uses Elizabeth's method. Both will produce the sample output as shown below:

How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors - Method 2?


Solution
  • The method employed in this article uses the method as described in Elizabeth's blog article.
  • Take note that this method does not require a custom display function. The color is specified right inside the list store.

Sample Code
1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
97   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 220);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("Display 2D Array in GtkTreeView - Part 3\n".
"             with alternate row color\n".
"Method 2 - by specifying the color in list store");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$title->set_size_request(-1, 60);
$vbox->pack_start($title, 0, 0);
$vbox->pack_start(new GtkLabel(), 0, 0);

// the 2D table
$data = array(
array('row0', 'item 42', 2, 3.1),
array('row1', 'item 36', 20, 6.21),
array('row2', 'item 21', 8, 9.36),
array('row3', 'item 10', 11, 12.4),
array('row4', 'item 7', 5, 15.5),
array('row5', 'item 4', 17, 18.6),
array('row6', 'item 3', 20, 21.73));

display_table($vbox, $data);

$window->show_all();
Gtk::main();

function display_table($vbox, $data) {

    // Set up a scroll window
    $scrolled_win = new GtkScrolledWindow();
    $scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC,
        Gtk::POLICY_AUTOMATIC);
    $vbox->pack_start($scrolled_win);

    // Creates the list store
    if (defined("GObject::TYPE_STRING")) {
        $model = new GtkListStore(GObject::TYPE_STRING, GObject::TYPE_STRING,
                    GObject::TYPE_LONG, GObject::TYPE_DOUBLE, GObject::TYPE_STRING);
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING,
                    Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE, Gtk::TYPE_STRING);
    }
    $field_header = array('Row #', 'Description', 'Qty', 'Price');
    $field_justification = array(0.0, 0.0, 0.5, 1.0);

    // Creates the view to display the list store
    $view = new GtkTreeView($model);
    $scrolled_win->add($view);

    // Creates the columns
    for ($col=0; $col<count($field_header); ++$col) {
        $cell_renderer = new GtkCellRendererText();
        $cell_renderer->set_property("xalign", $field_justification[$col]);
        $column = new GtkTreeViewColumn($field_header[$col],
            $cell_renderer, 'text', $col, 'background', 4); // note 1
        $column->set_alignment($field_justification[$col]);
        $column->set_sort_column_id($col);

        // set the header font and color
        $label = new GtkLabel($field_header[$col]);
        $label->modify_font(new PangoFontDescription("Arial Bold"));
        $label->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000FF"));
        $column->set_widget($label);
        $label->show();

        $view->append_column($column);
    }

    // pupulates the data
    for ($row=0; $row<count($data); ++$row) {
        $values = array();
        for ($col=0; $col<count($data[$row]); ++$col) {
            $values[] = $data[$row][$col];
        }
        $values[] = ($row%2==1) ? '#dddddd' : '#ffffff'; // note 2
        $model->append($values);
    }
}

?>
Explanation
  1. Binds the property 'background' to column 4 of the list store.
  2. Set the alternate background colors.

Related Links

User reviews   Average user ratings:    5.0   (from 1 user)
  1. Dysmas
    November 21, 2008 2:40am
    Excellent

    Thanks for this trick, Elizabeth and kksou, this was exactly what I was looking for !

Note: You have to be a registered member to leave a comment. Free registration here.

 
< Prev   Next >

Blog - Forum - Privacy Policy - Contact Us
Copyright © 2006-2009. kksou.com. All Rights Reserved