Problem
We have displayed a 2D array in a table with alternate row colors in Part 3.
Now we would like to display the price column as 2 decimal-place as shown below:
Solution
- Use GtkCelllayout::set_cell_data_func() to add your user-defined cell-display function. Pass the column number along with this.
- Use GtkTreeModel::get_value(GtkTreeIter iter, int column) to get the value of the cell content and format it accordingly.
- Set the formatted content by setting the property of GtkCellrenderertext::text().
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 84 85 86 87 88 92 93 94 95 96 97 98 99 100 | <?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 4\n". " format cell content"); $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 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->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(); // setup self-defined function to display alternate row color $column->set_cell_data_func($cell_renderer, "format_col", $col); // note 1 $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); } } // self-defined function to format the price column function format_col($column, $cell, $model, $iter, $col_num) { $path = $model->get_path($iter); // get the current path $row_num = $path[0]; // get the row number if ($col_num==3) { // note 2 $amt = $model->get_value($iter, 3); // note 3 $cell->set_property('text', '$'.number_format($amt,2)); // note 4 } $row_color = ($row_num%2==1) ? '#dddddd' : '#ffffff'; $cell->set_property('cell-background', $row_color); } ?> |
Output
As shown above.
Explanation
- Add your user-defined cell-display function when you set up the column. Note how the column number
$col
is being passed along in this statement. - The "price" is in column 3 (the first one being column 0). Note that this function is being called for each and every cell being displayed. Since we only want to format the "price" column, we only test for
$col_num==3
. If you want to format, say the "description" column, then you could test for$col_num==1
. - Get the original value of the price with
$model->get_value($iter, 3)
.3
as above, denotes the 3rd column of the data model. - Format the price with
number_format($amt,2)
, and set the formatted content by setting the property of GtkCellrenderertext::text():$cell->set_property('text', formatted-cell-content)
.
Note
Now that we have the GtkTreeView set up, what come next is how to get the user selection. We'll cover this in the next article.
Related Links
- How to display a 2D array in GtkTreeView - Part 1?
- How to display a 2D array in GtkTreeView - Part 2 - set alignment and headers?
- How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors?
- How to display a 2D array in GtkTreeView - Part 5 - get user selection?
- How to display a 2D array in GtkTreeView - Part 6 - allow multiple rows selection?
- How to display a 2D array in GtkTreeView - Part 3 - with alternate row colors - Method 2?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 2?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 3 - set_attributes?
- How to display a 2D array in GtkTreeView - Part 8 - with alternate fg and bg row colors - Method 4 - add_attribute?
- How to display a 2D array in GtkTreeView - Part 4 - format cell content - Method 2?
Read more...