|
Problem You have allowed users to change the font size of the row contents in a treeview using the technique as outlined in Part 1. However when the font size is too large, the fonts extends beyond the height of each row as shown below:

You would like to fix this so that the row height expands as the font size increases as shown below:

Solution
- First use the technique as outlined in Part 1 to change the font size on-the-fly.
- In order to change the row height as the font size changes, the easiest way is to re-populate the model so that the treeview automatically adjusts the row height according to the new font size.
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 89 90 91 92 93 94 95
| <?php $window = new GtkWindow(); $window->set_size_request(400, 240); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Change Font Size in GtkTreeView\n". " Part 2 - fix row height"); $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);
$vbox->pack_start($hbox = new GtkHBox(), 0, 0); $hbox->pack_start($button1 = new GtkButton("Font Size = 6"), 0, 0); $hbox->pack_start($button2 = new GtkButton("Font Size = 12"), 0, 0); $hbox->pack_start($button3 = new GtkButton("Font Size = 16"), 0, 0); $button1->connect('clicked', 'on_button', 6); $button2->connect('clicked', 'on_button', 12); $button3->connect('clicked', 'on_button', 16);
// 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
global $model; 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
global $view; $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); $view->append_column($column); }
// populate data
populate_data($model, $data);
$selection = $view->get_selection(); $selection->connect('changed', 'on_selection'); }
// 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
|
- 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
- Change the font size.
- Clear the entire model first. Note that if you have changed the model data after the initial set up, you might want to use an array to hold the old values first so that you can re-populate these values back to the model in the next step.
- Re-populate the model.
- Queue for redraw!
Related Links
User reviews Average user ratings: 5.0 (from 1 user) Note: You have to be a registered member to leave a comment. Free registration here. |
September 16, 2008 9:56pm
On a related subject, is it possible to squeeze the height of each row to get more rows on screen without losing the text inside? I tried months ago and gave up. The problem is that the text is always drawn a fixed distance from the top of the row, no matter what you throw at it in terms of alignment etc. So eventually you will start losing bits of characters at the bottom, while still having loads of space at the top...