PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 291: How to display directory tree using GtkTreeView - Part 5 - add context sensitive popup menu on right mouse click?
Written by kksou   
Monday, 23 July 2007
Problem

You have displayed a directory tree using a GtkTreeView in How to display directory tree using GtkTreeView - Part 2 - add folder icon?

Now you would like to add context-sensitive popup menu on right mouse click as shown below:

How to display directory tree using GtkTreeView - Part 5 - add context sensitive popup menu on right mouse click?


Solution

Sample Code

Note 1: If you select "C:\", the program will run, but it will take a long time. You will see the processing, though, in the command window.

Note 2: On windows, you may see a warning "Gtk-WARNING: Could not find the icon 'stock_unknown'. The 'hicolor' theme was not found either, perhaps you need to install it." This is from the GtkFileChooserButton. It's just a warning. You may ignore it, or go ahead and install it.

Note 3: The following image files are required by the sample code below. Please save a copy of the image files and put them in the same directory where you store the sample code.

 folder_open.gif
 folder_closed.gif

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   
96   
97   
98   
99   
100   
101   
102   
103   
104   
105   
106   
107   
108   
109   
110   
111   
112   
113   
114   
115   
116   
117   
118   
119   
120   
<?php
$window = new GtkWindow();
$window->set_title($argv[0]);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("      Display folder contents in GtkTreeView - Part 5\n".
"add context sensitive popup menu on right mouse click");
$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($hbox = new GtkHBox());
$hbox->pack_start(new GtkLabel('Click to select a folder: '), 0, 0);

// set up model
if (defined("GObject::TYPE_STRING")) {
    $model = new GtkTreeStore(GObject::TYPE_STRING, GObject::TYPE_STRING); // note 1
} else {
    $model = new GtkTreeStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING); // note 1
}

// set up file chooser button
$file_chooser_button = new GtkFileChooserButton('Select the Folder',
    Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
$file_chooser_button->set_size_request(320, -1);
$file_chooser_button->connect('selection-changed', 'on_selection_changed');
on_selection_changed($file_chooser_button);
$hbox->pack_start($file_chooser_button, 0, 0);

// set up scroll window
$scrolled_win = new GtkScrolledWindow();
$scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC,
    Gtk::POLICY_AUTOMATIC);
$vbox->pack_start($scrolled_win);

// set up treeview
$view = new GtkTreeView($model);
$scrolled_win->add($view);
$view->set_size_request(400, 320);
$view->connect('button-press-event', 'on_button', $view);

//set up treeview columns
$column = new GtkTreeViewColumn();

// for image
$cell_renderer = new GtkCellRendererPixbuf();
$column->pack_start($cell_renderer, false);
$cell_renderer->set_property('pixbuf-expander-open',
    GdkPixbuf::new_from_file('folder_open.gif'));
$cell_renderer->set_property('pixbuf-expander-closed',
    GdkPixbuf::new_from_file('folder_closed.gif'));

// for filename
$cell_renderer = new GtkCellRendererText();
$column->pack_start($cell_renderer, true);
$column->set_attributes($cell_renderer, 'text', 0);

$view->append_column($column);
$column->set_title('Folders / Files');

//display it
$window->show_all();
Gtk::main();

function on_selection_changed($button) {
    $folder = $button->get_current_folder();
    echo "new folder: $folder\n";
    populate_tree($folder);
}

function populate_tree($folder) {
    global $model;
    $model->clear();
    $root = $folder;
    $dir_list = array($root);
    $nodes = array();
    $nodes[$root] = null;
    while(count($dir_list)>0) {
        $dir = array_shift($dir_list);
        echo "folder = $dir\n";

        // add the directories first
        if ($handle = opendir($dir)) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $fullpath = $dir.'/'.$file;
                    if (is_dir($fullpath)) {
                        $nodes[$fullpath] = $model->append($nodes[$dir],
                            array($file, $fullpath)); // note 2
                        array_push($dir_list, $fullpath);
                    }
                }
            }
            closedir($handle);
        }

        $num_files = 0;
        // then add the files
        if ($handle = opendir($dir)) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $fullpath = $dir.'/'.$file;
                    if (!is_dir($fullpath)) {
                        $nodes[$fullpath] = $model->append($nodes[$dir],
                            array($file, $fullpath)); // note 2
                        ++$num_files;
                    }
                }
            }
            closedir($handle);
        }

        if ($num_files==0) $nodes[$fullpath] = $model->append($nodes[$dir],
            array('', ''));
    }
}

function popup_menu($path, $col_title, $event) {
  • 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 sample code is based on How to display directory tree using GtkTreeView - Part 2 - add folder icon?.

We also make use of the code from How to display context sensitive popup menu with right mouse click in GtkTreeView? to display the context-sensitive popup menu in a treeview.

What's new here:

  1. Note that we have added one more column of data here to store the fullpath information.
  2. Populate the treeview, including the fullpath information.
  3. For listview, we use $path_array[0][0]. For treeview, we use $path_array[0].
  4. Display the popup menu.
  5. Get the iter from the path.
  6. Get the fullpath information

Related Links

User reviews   Average user ratings:    5.0   (from 2 users)
  1. gerel from Argentina
    August 28, 2007 9:43am

    I used all five parts of this article, thank you!!
    :-)

  2. Lars BOje Jensen
    August 19, 2008 5:30am

Note: You have to be a registered member to leave a comment. Free registration here.

 
< Prev   Next >

Copyright © 2006-2008. kksou.com. All Rights Reserved