PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 403: How to have Enter move to next field in form - Part 3?
Written by kksou   
Tuesday, 08 January 2008
Problem

This article achieves the same objective as Part 1, that is, using Enter to move to next field.

In this Part 3, we use the method GtkWidget::child_focus()

to simulate a tab keypress as shown below:

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


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   
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   
83   
85   
86   
87   
88   
89   
90   
91   
<?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 3\n".
"child_focus(Gtk::DIR_TAB_FORWARD)");
$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);
        ++$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;
     // use if ($event->keyval!=65293) if your version of php-gtk2
    // does not have Gdk::KEY_Return defined

    $next_row = ++$row;
    if ($next_row<count($entry)) {
        $widget->get_toplevel()->child_focus(Gtk::DIR_TAB_FORWARD); // note 1
    } else {
        $button->grab_focus();
        $button->clicked();
    }
}

?>
Explanation

We make use of the code from How to have Enter move to next field in form - Part 1?

What's new here:

  1. Simulate a tab keypress.

Related Links

User reviews

There are no user reviews yet.

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-2009. kksou.com. All Rights Reserved