PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 442: How to set up menu using GtkAction - Part 2 - add accelerators?
Written by kksou   
Tuesday, 26 February 2008
Problem

You have seen how to set up menus using GtkAction in Part 1.

In this part 2, I'll show you how to add accelerators to the menu items so that users can press Ctrl-N for New, Ctrl-O for Open, etc. as shown below:

How to set up menu using GtkAction - Part 2 - add accelerators?


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   
<?php
$window = new GtkWindow();
$window->set_title($argv[0]);
$window->set_size_request(400, 150);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());
$accel_group = new GtkAccelGroup(); // note 1
$window->add_accel_group($accel_group); // note 1
$actiongrp = new GtkActionGroup('menu'); // note 2

// define menu definition
// define menu definition
$menu_definition = array(
    '_File' => array('_New|N', '_Open|O', '_Close', '<hr>',
                    '_Save|S', 'Save _As','<hr>', '_Quit'),
    '_Edit' => array('Cut|X', 'Copy|C', '_Paste|V', '<hr>',
                    'Select All|A', '<hr>', '_Undo|Z','_Redo|Y'),
);
setup_menu($vbox, $menu_definition);

// display title
$title = new GtkLabel("Set up Menu using GtkAction\n".
"   Part 2 - Add Accelerators");
$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(''));

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

function setup_menu($vbox, $menu_definition) {
    $menubar = new GtkMenuBar();
    $vbox->pack_start($menubar, 0, 0);

    foreach($menu_definition as $toplevel => $sublevels) {
        $menubar->append($top_menu = new GtkMenuItem($toplevel));
        $menu = new GtkMenu();
        $top_menu->set_submenu($menu);

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

            if ($item=='<hr>') {
                $menu->append(new GtkSeparatorMenuItem());
            } else {
                $item2 = str_replace('_', '', $item);
                $item2 = str_replace(' ', '_', $item2);
                $stock_image_name = 'Gtk::STOCK_'.strtoupper($item2);
                $stock_image = '';
                if (defined($stock_image_name))
                    $stock_image = constant($stock_image_name);

                $action = new GtkAction($item, $item, '', $stock_image);
  • 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
  1. Create a new accelerator and attach it to the window.
  2. Create an action group.
  3. Define the accelerator key. Here we use the <control> key. You can change this to use 'Alt', or 'Ctrl-Alt'.
  4. Add the action to the action group, specifying the accelerator key at the same time.
  5. Specify the accelerator group.
  6. Connect the accelerator with the action.

Related Links
 

Add comment


Security code
Refresh

< Prev   Next >

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