PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 71: How to open a file with GtkFileChooser?
Written by kksou   
Monday, 23 October 2006
Problem

When the user select File Open from the menu, you would like to allow the user to select the file with a file chooser dialog as shown below:

How to open a file with GtkFileChooser?


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   
91   
92   
93   
94   
95   
96   
97   
98   
99   
100   
101   
102   
103   
104   
105   
106   
107   
108   
109   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 150);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);

// define menu definition
$menu_definition = array(
    '_File' => array('_New|N', '_Open|O', '_Close|C', '<hr>',
        '_Save|S', 'Save _As','<hr>', 'E_xit'),
    '_Edit' => array('Cu_t|X', '_Copy|C', '_Paste|V', '<hr>',
        'Select _All|A', '<hr>', '_Undo|Z','_Redo|Y'),
    '_Test' => array('Test_1|1', 'Test_2|2', 'Test_3|3', '<hr>',
                array('Selection 1', 'Selection 2', 'Selection 3'),
                '<hr>', 'Test_4|4')
);
$menu = new Menu($vbox, $menu_definition, $accel_group);

// display title
$title = new GtkLabel("Open a file with GtkFileChooser");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$vbox->pack_start($title);
$vbox->pack_start(new GtkLabel("Press Ctrl-O to open the file chooser"));
$vbox->pack_start(new GtkLabel(""));

$window->show_all();
Gtk::main();

// class Menu
class Menu {
    var $prev_keyval = 0;
    var $prev_state = 0;
    var $prev_keypress = '';
    function Menu($vbox, $menu_definition, $accel_group) {
        $this->menu_definition = $menu_definition;
        $menubar = new GtkMenuBar();
        $vbox->pack_start($menubar, 0, 0);
        foreach($menu_definition as $toplevel => $sublevels) {
            $top_menu = new GtkMenuItem($toplevel);
            $menubar->append($top_menu);
            $menu = new GtkMenu();
            $top_menu->set_submenu($menu);

            // let's ask php-gtk to tell us when user press the 2nd Alt key
            $menu->connect('key-press-event', array(&$this, 'on_menu_keypress'),
                $toplevel);

            foreach($sublevels as $submenu) {
                if (strpos("$submenu", '|') === false) {
                    $accel_key = '';
                } else {
                    list($submenu, $accel_key) = explode('|', $submenu);
                }

                if (is_array($submenu)) { // set up radio menus
                    $i=0;
                    $radio[0] = null;
                    foreach($submenu as $radio_item) {
                        $radio[$i] = new GtkRadioMenuItem($radio[0], $radio_item);
                        $radio[$i]->connect('toggled', array(&$this, "on_toggle"));
                        $menu->append($radio[$i]);
                        ++$i;
                    }
                    $radio[0]->set_active(1); // select the first item
                } else {
                    if ($submenu=='<hr>') {
                        $menu->append(new GtkSeparatorMenuItem());
                    } else {
                        $submenu2 = str_replace('_', '', $submenu);
                        $submenu2 = str_replace(' ', '_', $submenu2);
                        $stock_image_name = 'Gtk::STOCK_'.strtoupper($submenu2);
                        if (defined($stock_image_name)) {
                            $menu_item = new GtkImageMenuItem(
                                constant($stock_image_name));
                        } else {
                            $menu_item = new GtkMenuItem($submenu);
                        }
                        if ($accel_key!='') {
                            $menu_item->add_accelerator("activate",
                                $accel_group, ord($accel_key), Gdk::CONTROL_MASK, 1);
                        }

                        $menu->append($menu_item);
                        $menu_item->connect('activate',
                            array(&$this, 'on_menu_select'));
                        $this->menuitem[$toplevel][$submenu] = $menu_item;
                    }
                }
            }
        }
    }

    // process radio menu selection
    function on_toggle($radio) {
        $label = $radio->child->get_label();
        $active = $radio->get_active();
        echo("radio menu selected: $label\n");
    }

    // process menu item selection
    function on_menu_select($menu_item) {
        $item = $menu_item->child->get_label();
        echo "menu selected: $item\n";
        if (method_exists($this, $item)) $this->$item();
        if ($item=='E_xit') Gtk::main_quit();
    }
  • 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 set up menu and radio menu - Part 4 - allow Alt F Alt N?.

What's new here:

  1. Added this line so that the script will call the function _Open() when user selects File Open.
  2. The third parameter is GtkFileChooserAction. Since we are opening a file here, we choose Gtk::FILE_CHOOSER_ACTION_OPEN.
  3. Retrieve the selected file.

Note

Related Links

User reviews   Average user ratings:    0.0   (from 4 users)
  1. D from China
    February 24, 2007 3:53am

    Is there any way to select a folder using GTK?

  2. kksou
    February 26, 2007 12:24am

    Please refer to the following example for selections of folders: http://www.kksou.com/php-gtk2/articles/select-a-folder-with-GtkFileChooser.php

  3. Wim Stockman from Belgium
    November 26, 2007 4:20am

    Thank you for all the great recipes
    I have a little add on If you want to select multiple file after note 2 add this
    $dialog->set_select_multiple(TRUE);

    Kind regards
    This e-mail address is being protected from spam bots, you need JavaScript enabled to view it

  4. kksou
    November 27, 2007 8:09pm

    Hi Wim, Thanks for pointing this out about the multiple file selection. Thought this will be useful to others too. So I've created a full sample code for this: How to open multiple files with GtkFileChooser?

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

 
< Prev   Next >

Blog - Forum - Privacy Policy - Contact Us
Copyright © 2006-2008. kksou.com. All Rights Reserved