|
Problem This is in response to Fernando's post titled 'Remove the nodes of a tree'.
He has set up a directory of files using GtkTreeView and he would like to remove all children of a node when he presses the Delete key on a node as shown below:

Solution
Note: The above make use of the GtkTreeModel functionality implemented by Andrei Zmievski. Please refer to his article New GtkTreeModel functionality.
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
| <?php $window = new GtkWindow(); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Remove nodes from GtkTreeView - Part 1"); $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($vbox2 = new GtkVBox(), 0, 0); $vbox2->set_size_request(-1, 40); $vbox2->pack_start(new GtkLabel("Highlight a row, and press ". "'Delete' key to delete a file/folder"), 0); $vbox2->pack_start(new GtkLabel("This is a demo. It won't ". "actually delete the file/folder"), 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); } else { $model = new GtkTreeStore(Gtk::TYPE_STRING); }
// 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);
//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');
$view->connect('key-press-event', 'on_keypress'); // note 1
//display it
$window->show_all(); Gtk::main();
function on_selection_changed($button) { $folder = $button->get_current_folder(); echo "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],
|
- 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 We make use of the code from How to display directory tree using GtkTreeView - Part 2 - add folder icon? to display the directory tree.
What's new here:
- Register the signal 'key-press-event' on the treeview so that we can detect the 'Delete' key.
- Check for the 'Delete' key.
- Get the pointer to the GtkTreeSelection associated with the treeview.
- Get the model and iter of the selected row.
- Make sure user has selected something before we proceed.
- Delete the node from the tree model. Note that this only removes the node from the model. If you want the files/folders to be deleted, you have to "manually" delete the file from the system.
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. |