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:
Solution
- We make use of the article How to align GtkEntry fields - Part 2? to display a form with four fields.
- We register key-press-event on each GtkEntry to detect the "Enter" key.
- If Enter key is pressed, we use GtkWidget::grab_focus() to move the cursor to the next field.
- If we reach the last field, we move the focus to the Submit button, and manually generate a button click using GtkButton::clicked().
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
- 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.
- If key press is not Enter, return a
false
to let the default handler handles it. - Move focus to next row.
- If it's the last field, move focus to the Submit button, and manually generate a button click.
Read more...