PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 534: How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 4 - add_attribute?
Written by kksou   
Saturday, 22 November 2008
Problem

This is another PHP-GTK2 tips and techniques contributed by Dysmas de Lassus of France.

In How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 2? we use the Elizabeth's method to specify the colums of the foreground and background colors in the list store at the point when we set up the GtkTreeViewColumn.

Dysmas pointed out that you can delay the setting of columns for these attributes to a later point in time in your program with the use of the method GtkCellView::add_attributes() as shown below. Both will produce the same effect.

How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 4 - add_attribute?


Solution
  • We make use of the method as described in Elizabeth's blog article.
  • We also use the method GtkCellView::add_attributes() to specify the columns of the attributes.

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   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
91   
92   
93   
94   
95   
96   
97   
98   
109   
<?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 8\n".
"with alternate foreground and background row colors\n".
"                 Method 4 - by using add_attribute()");
$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, GObject::TYPE_STRING);
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING,
                    Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE,
                    Gtk::TYPE_STRING, 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);
        $column->add_attribute($cell_renderer, 'background', 4); // note 1
        $column->add_attribute($cell_renderer, 'foreground', 5); // note 2
        $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];
        }
        if ($row%2==1) {
            $values[] = '#ffffff'; // note 3
            $values[] = '#B88A00'; // note 3
        } else {
            $values[] = '#eeeeee'; // note 4
            $values[] = '#3366FF'; // note 4
        }

        $model->append($values);
    }
}

?>
Explanation
  1. Binds the property 'background' to column 4 of the list store.
  2. Binds the property 'foreground' to column 5 of the list store.
  3. Set the background and foreground colors for odd rows.
  4. Set the background and foreground colors for even rows.

Related Links

Sample codes contributed by Dysmas de Lassus:


User reviews

There are no user reviews yet.

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