|
Problem We have displayed a 2D array in a table in 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:

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
| <?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],
|
- Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
- Registration is free and immediate.
- Have some doubt about the registration? Please read this forum article.
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)
$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.
- 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.
- Setting column to be sortable is easy with just one line:
$column->set_sort_column_id($col).
- 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).
- 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
User reviews There are no user reviews yet. Note: You have to be a registered member to leave a comment. Free registration here. |