PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 343: How to allow reordering of tabs in GtkNotebook?
Written by kksou   
Wednesday, 10 October 2007
Problem

Suppose you have set up a GtkNotebook, and you would like to allow users to be able to reorder the tabs (by clicking and dragging the tab) as shown below:

How to allow reordering of tabs in GtkNotebook?


Solution
  • To enable reordering of tabs, use the method GtkNotebook::set_tab_reorderable ($widget, true);
  • To know when a reordering takes place, use the signal 'page-reordered' (GtkNotebook)

Important Note: This only works for PHP-GTK2 compliled with gtk+ v2.10 and above. If you are using an older version, for linux, you may follow the step-by-step instructions to recompile php-gtk2 with gtk+ v2.10. For windows, please refer to How to install php gtk2 on windows? You may also want to take a look here to see some of the new exciting PHP-GTK2 Functionalities.


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   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
91   
92   
93   
94   
95   
96   
97   
98   
99   
100   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 240);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// setup notebook
$notebook = new GtkNotebook();
$notebook->connect('switch-page', 'on_switch');
$notebook->connect('page-reordered', 'on_page_reordered'); // note 2
$vbox->pack_start($notebook);

// add two tabs of GtkLabel
add_new_tab($notebook, new GtkLabel('Notebook 1'), 'Label #1');
add_new_tab($notebook, new GtkLabel("Notebook 2\n\n
Implments our own popup menu"), 'Label #2');

// add a third tab of GtkTextView
$buffer = new GtkTextBuffer();
$view = new GtkTextView();
$view->set_buffer($buffer);
$view->set_wrap_mode(Gtk::WRAP_WORD);
add_new_tab($notebook, $view, 'Tab 3 - TextView');

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

// add new tab
function add_new_tab($notebook, $widget, $tab_label) {
    $eventbox = new GtkEventBox();
    $label = new GtkLabel($tab_label);
    $eventbox->add($label);
    $label->show();
    $eventbox->connect('button-press-event', 'on_tab', $tab_label);
    $notebook->append_page($widget, $eventbox);
    $notebook->set_tab_reorderable($widget, true); // note 1

    $menu_label = new GtkLabel($tab_label);
    $menu_label->set_alignment(0,0);
    $notebook->set_menu_label($widget, $menu_label);

    global $tab_widget;
    static $page=0;
    $tab_widget[$page] = $widget;
    ++$page;
}

// function that is called when user click on tab
function on_tab($widget, $event, $tab_label) {
    global $tab_clicked;
    if ($event->button==1) {
        echo "tab clicked = $tab_label\n";
        $tab_clicked = $tab_label;
        return false;
    }

    if ($event->button==3) {
        popup_menu();
        return true;
    }

    return false;
}

function on_switch($notebook) {
    $switched_from = $notebook->get_current_page();
    if ($switched_from==-1) return;
    global $tab_widget;
    $tab_label = $notebook->get_tab_label($tab_widget[$switched_from]);
    $tab_label_text = $tab_label->child->get_text();
    echo "You have switched from: $tab_label_text\n";
}

function popup_menu() {
    global $menu, $notebook;
    //define the popup menu
    $num_pages = $notebook->get_n_pages();
    $menu_definition = array();
    for ($i=0; $i<$num_pages; ++$i) {
        $widget = $notebook->get_nth_page($i);
        $tab_label = $notebook->get_tab_label($widget);
        $tab_label_text = $tab_label->child->get_text();
        $menu_definition[] = $tab_label_text;
    }

    $menu = show_popup_menu($menu_definition);
}

// show popup menu
function show_popup_menu($menu_definition) {
    $menu = new GtkMenu();
    foreach($menu_definition as $menuitem_definition) {
        if ($menuitem_definition=='<hr>') {
            $menu->append(new GtkSeparatorMenuItem());
        } else {
            $menu_item = new GtkMenuItem($menuitem_definition);
            $menu->append($menu_item);
            $menu_item->connect('activate', 'on_popup_menu_select');
        }
    }
  • Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
  • Registration is free and immediate.
  • Have some doubt about the registration? Please read this forum article.
Explanation

We make use of the code from How to display a popup menu for GtkNotebook tab - Part 3?

What's new here:

  1. Enable reordering of tabs.
  2. Inform us when there's a reordering of tabs.
  3. Update the array $tab_widget which contains the pointers to the widgets associatred with each tab.

Related Links
 

Add comment


Security code
Refresh

< Prev   Next >

Blog - Forum - Privacy Policy - Contact Us
Links - Classes - Social Business - BPM - Web - General
Copyright © 2006-2013. kksou.com. All Rights Reserved