136. How to have Enter move to next field in form - Part 1?

Problem

In php-gtk2, suppose you have set up a form. Try enter something in a field and press Enter. We would expect the cursor to move to the next field. But nothing happens! You can only move to the next field by pressing the Tab key.

Supppose you would like the Enter key to behave similar to the Tab key, that is, when you press Enter, the cursor will automatically move to the next field as shown below:

How to have Enter move to next field in form - Part 1?


Solution


Sample Code

Note: use if ($event->keyval!=65293) if your version of php-gtk2 does not have Gdk::KEY_Return defined.

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   
39   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
54   
55   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
71   
72   
73   
74   
75   
78   
81   
82   
83   
84   
85   
86   
87   
88   
89   
<?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("Use Enter to Move to Next Field - Part 1\n".
"     using key-press-evnet on GtkEntry");
$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');
$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("  $field: ");
        $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);
        $table->attach($alignment, 1, 2, $row, $row+1);
        $entry[$row]->connect('key-press-event', 'on_keypress', $row); // note 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;
    }
}

function on_keypress($widget, $event, $row) {
    global $entry, $button;
    if ($event->keyval!=Gdk::KEY_Return) return false; // note 2
     // use if ($event->keyval!=65293) if your version of php-gtk2
    // does not have Gdk::KEY_Return defined

    $next_row = ++$row; // note 3
    if ($next_row<count($entry)) {
        $entry[$next_row]->grab_focus(); // note 3
    } else {
        $button->grab_focus(); // note 4
        $button->clicked(); // note 4
    }
}

?>

Output

As shown above.

 

Explanation

  1. Register the key-press-event on each GtkEntry field. Note that we pass the row number along with the signal so that we know which row the cursor is currently on.
  2. If key press is not Enter, return a false to let the default handler handles it.
  3. Move focus to next row.
  4. If it's the last field, move focus to the Submit button, and manually generate a button click.

Related Links

Add comment


Security code
Refresh