|
Problem This is in response to Edgarwilde's post titled "treeview leafs only"
Suppose you have set up a tree model as shown below:

And now you would like to allow users to have another view that shows only the leaves of the tree model 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 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
| <?php
$window = new GtkWindow(); $window->set_title($argv[0]); $window->set_size_request(400, 240); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Show Leaves only for a TreeModel"); $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); $hbox->pack_start($button = new GtkButton('Show Leaves Only'), 0); $tree_mode = 1; $button->connect('clicked', 'on_click');
$data = array( array ('id' => '101', 'parent' => '0', 'data' => 'a'), array ('id' => '102', 'parent' => '101', 'data' => 'a1'), array ('id' => '103', 'parent' => '102', 'data' => 'a11'), array ('id' => '104', 'parent' => '102', 'data' => 'a12'), array ('id' => '105', 'parent' => '101', 'data' => 'a2'), array ('id' => '201', 'parent' => '0', 'data' => 'b'), array ('id' => '202', 'parent' => '201', 'data' => 'b1'), array ('id' => '203', 'parent' => '202', 'data' => 'b11') );
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, $model_leaves; if (defined("GObject::TYPE_STRING")) { $model = new GtkTreeStore(GObject::TYPE_LONG, GObject::TYPE_STRING, GObject::TYPE_STRING); // note 1
$model_leaves = new GtkListStore(GObject::TYPE_LONG, GObject::TYPE_STRING, GObject::TYPE_STRING); // note 2
} else { $model = new GtkTreeStore(Gtk::TYPE_LONG, Gtk::TYPE_STRING, Gtk::TYPE_STRING); // note 1
$model_leaves = new GtkListStore(Gtk::TYPE_LONG, Gtk::TYPE_STRING, Gtk::TYPE_STRING); // note 2
} $field_header = array('id', 'title', 'data');
// Set up the view
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(); $column = new GtkTreeViewColumn($field_header[$col], $cell_renderer, 'text', $col); $view->append_column($column); }
// pupulates the data
$nodes = array(); $nodes[0] = null; // root
foreach($data as $item) { $id = $item['id']; $parent = $item['parent']; $data = $item['data']; $nodes[$id] = $model->append($nodes[$parent], array($id, "this is id $id", $data)); }
$view->expand_all(); }
function on_click($button) { global $tree_mode; if ($tree_mode) {
|
- 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 The above example makes use of the code from How to display a tree structure from array? and How to iterate through a GtkTreeStore?
What's new here:
- The base tree model.
- The list store for the leaves.
- Loop through the entire tree model to extract just the leaves.
- Test if the node is a leave.
- Add the leave to the list store.
- Display the list store in the treeview!
- In the event that you just want to show the leaves, you can hide the first two columns. If not, just comment out these two lines.
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. |