187. How to add mnemonic to GtkLabel?

Problem

Sometimes it's small user interface elements here and there that make users feels "more at home" with your applications.

In this example, we will show you how to add mnemonic, or keyboard accelerator, to GtkLabel. An application of this is to enable users to jump between entry fields by pressing the underlined mnemonics such as Alt-N, Alt-D, etc. as shown below:

How to add mnemonic to GtkLabel?

 

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   
37   
38   
39   
41   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 240);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("Add mnemonic to GtkLabel");
$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);

$fields = array('Item _number', 'Item _Description',  
    'Unit _price', '_Quantity'); // note 1
$field_size = array(120, 200, 80, 80);
$entry = array(); // to store the text entries

$table = new GtkTable();
display_table($table, $fields, $field_size); // display the table
$vbox->pack_start($table);

function display_table($table, $fields, $field_size) {
    global $entry;
    $row = 0;
    foreach ($fields as $field) {
        $label = new GtkLabel();
        $label->set_text_with_mnemonic("  $field: "); // note 2
        $alignment = new GtkAlignment(1, .5, 0, 0);
        $alignment->add($label);
        $table->attach($alignment, 0, 1, $row, $row+1, Gtk::FILL, Gtk::SHRINK, 0, 0);

        $entry[$row] = new GtkEntry();
        $alignment = new GtkAlignment(0, .5, 0, 0);
        $alignment->add($entry[$row]);
        $entry[$row]->set_size_request($field_size[$row], -1);
        $label->set_mnemonic_widget($entry[$row]); // note 3

        $table->attach($alignment, 1, 2, $row, $row+1);
        ++$row;
    }
}

// create a submit button
$button = new GtkButton('Submit');
$button->set_size_request(60, 28);
$button->connect('clicked', 'on_click');
$row = count($fields);
$alignment = new GtkAlignment(0, 0.5, 0, 0);
$alignment->add($button);
$table->attach($alignment, 1, 2, $row, $row+1);

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

function on_click($button) {
    global $fields, $entry;
    $i=0;
    foreach($fields as $field) {
        echo "$field: ".$entry[$i]->get_text()."\n";
        ++$i;
    }
}

?>

Output

As shown above.

 

Explanation

The example above makes use of the code from How to align GtkEntry fields - Part 2?

What's new here:

  1. Note the use of underscore to indicate the mnemonic.
  2. Set the label text with mnemonic.
  3. Associate each mnemonic with the corresponding GtkEntry.

Related Links

Add comment


Security code
Refresh