252. How to use GtkSheet - Part 7 - tab to move to next row?

Problem

You have displayed a 2D array in a GtkSheet in How to use GtkSheet - Part 3 - set values?.

By default, when you press the Tab key and it reaches the last column, it will stay at that cell. Suppose you would like the Tab key to move the active cell automatically to the first column of the next row as shown below:

How to use GtkSheet - Part 7 - tab to move to next row?


Solution

  • Make sure your version of PHP-GTK2 has the GtkExtra library, and the feature turned on in php.ini. (See notes below.)
  • A GtkSheet is just like any other standard Gtk widget. As such, you can have precise control of the behavior of keys through the GtkWidget::key-press-event().

Important Note: This only works for PHP-GTK2 compliled with the additional library GtkExtra. For linux, you can download the files from http://gtkextra.sourceforge.net/ and do a recompile. For windows, you may use the builds by Elizabeth Smith or the official php-gtk2 beta release available at http://gtk.php.net/download.php. Both contain all the required gtkextra libraries and dll's. In the php.ini, don't forget to add php-gtk.extensions = php_gtk_extra2.dll to turn on GtkExtra.


Sample Code

1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
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   
53   
54   
55   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
76   
77   
80   
81   
82   
83   
84   
85   
86   
87   
88   
94   
<?php
$window = new GtkWindow();
$window->set_title($argv[0]);
$window->set_size_request(430, 250);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// display title
$title = new GtkLabel("Using GtkSheet\n".
"Part 7 - Use Tab to move to next row");
$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);
$title->set_justify(Gtk::JUSTIFY_CENTER);
$alignment = new GtkAlignment(0.5, 0, 0, 0);
$alignment->add($title);
$vbox->pack_start($alignment, 0, 0);
$vbox->pack_start(new GtkLabel(), 0, 0);

// the 2D table
$data = array(
array('row0', 'item 42', 2, 3.1),
array('row1', 'item 36', 20, 6.21),
array('row2', 'item 21', 8, 9.36),
array('row3', 'item 10', 11, 12.4),
array('row4', 'item 7', 5, 15.5),
array('row5', 'item 4', 17, 18.6),
array('row6', 'item 3', 20, 21.73));

$max_col = count($data[0])-1;
$max_row = count($data)-1;

$field_header = array('Row #', 'Description', 'Qty', 'Price');
$justification = array('LEFT', 'LEFT', 'CENTER', 'RIGHT');

display_table($vbox, $data, $field_header, $justification);

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

function display_table($vbox, $data, $field_header, $justification) {

    $scrolled_win = new GtkScrolledWindow();
    $scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC,
        Gtk::POLICY_AUTOMATIC);
    $vbox->pack_start($scrolled_win);

    $sheet = new GtkSheet(count($data), count($data[0]), 'Test 123');
    $sheet->set_autoresize(1);
    $scrolled_win->add($sheet);

    $sheet->connect('key-press-event', 'on_keypress'); // note 1

    // set column header
    for ($col=0; $col<count($field_header); ++$col) {
        $sheet->column_button_add_label($col, $field_header[$col]);
        $justify = constant("Gtk::JUSTIFY_".$justification[$col]);
        $sheet->column_button_justify($col, $justify);
    }

    for ($row=0; $row<count($data); ++$row) {
        $sheet->row_button_add_label($row, $row+1);
        for ($col=0; $col<count($data[$row]); ++$col) {
            $justify = constant("Gtk::JUSTIFY_".$justification[$col]);
            $sheet->set_cell($row, $col, $justify, $data[$row][$col]);
        }
    }
}

function on_keypress($sheet, $event) {
    global $max_col, $max_row;
    list($row, $col) = $sheet->get_active_cell(); // note 2
    if ($event->keyval == Gdk::KEY_Tab) { // note 3
        if ($col<$max_col || $row==$max_row) return false; // note 4
        $sheet->set_active_cell($row+1, 0); // note 5
        return true;
    } else {
        return false; // note 6
    }
}

?>

Output

As shown above.
 

Explanation

The example above is based on How to use GtkSheet - Part 5 - set row and column headers?

What's new here:

  1. Register the key-press-event.
  2. Get the row and column of the current active cell.
  3. Check for tab key.
  4. Check if it's the last column, or if the user is at the last row.
  5. Move the active cell to the first column of the next row.
  6. If it's not a Tab key, just let PHP-GTK2 handles with its default handler.

Related Links

Add comment


Security code
Refresh