030. How to display a 2D array in GtkTreeView - Part 2 - set alignment and headers?

Problem

We have displayed a 2D array in a table in Part 1.

How to display a 2D array in GtkTreeView - Part 1?

 

Now you would like to make the columns sortable, put in proper alignment and change the header style and color as shown below:

How to display a 2D array in GtkTreeView - Part 2 - set alignment and headers?


Solution


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   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 200);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("Display 2D Array in GtkTreeView - Part 2\n".
"  add sort, add alignment, change header");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$title->set_size_request(-1, 40);
$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);
    } else {
        $model = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING,
                    Gtk::TYPE_LONG, Gtk::TYPE_DOUBLE);
    }
    $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 columns
    for ($col=0; $col<count($field_header); ++$col) {
        $cell_renderer = new GtkCellRendererText();
        $cell_renderer->set_property("xalign", $field_justification[$col]); // note 1
        $column = new GtkTreeViewColumn($field_header[$col],
            $cell_renderer, 'text', $col);
        $column->set_alignment($field_justification[$col]); // note 2
        $column->set_sort_column_id($col); // note 3

        // let's change the header to Arial Bold and blue
        // please change the font name if you're on linux or Mac OS
        $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); // note 4
        $label->show(); // note 5
        $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];
        }
        $model->append($values);
    }
}

?>

Output

As shown above.
 

Explanation

Please refer to Part 1 first to understand how to set up a 2D array in a GtkTreeView.

What's new here in Part 2. (Note that I've changed the data a bit so that you can see the effect of sorting different column)

  1. $cell_renderer->set_property sets the alignment of each column. As with other alignment, this is a double value. 0.0 is left-justified, and 1.0 is right-justified. Note that we have put the alignment value for each column in the array $field_justification.
  2. Don't forget to set the corresponding alignment in the header too. We do this with $column->set_alignment. As with above, the value is between 0.0 and 1.0.
  3. Setting column to be sortable is easy with just one line: $column->set_sort_column_id($col).
  4. To bold the header and change its color, we need to create a GtkLabel, set its fonts and color, and ask GtkTreeView to use our label as header with $column->set_widget($label).
  5. Don't forget this: $label->show()!!! Otherwise your new header will not show! Took me 3 hours to debug this last time. Thought it was one of those features that have not been implemented yet!

Note

We're half-way there. Still have quite a number of things to fix:

  • Price should be 2 decimal-place
  • Alternate colored rows

We're cover these in the next article.

Related Links

Add comment


Security code
Refresh