PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 97: How to rename tab label in GtkNotebook?
Written by kksou   
Friday, 17 November 2006
Problem

You want to allow users to rename the tab labels of GtkNotebook as shown below:

How to rename tab label in GtkNotebook?


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   
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   
101   
102   
103   
104   
105   
106   
107   
108   
109   
110   
111   
112   
113   
114   
115   
116   
117   
118   
119   
120   
121   
122   
123   
124   
<?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');
$vbox->pack_start($notebook);

// stores the names of the tab labels
$tab_labels = array('Label #1', 'Label #2', 'Tab 3 - TextView');

// add two tabs of GtkLabel
add_new_tab($notebook, new GtkLabel("Notebook 1"));
add_new_tab($notebook, new GtkLabel("Notebook 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);

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

// add new tab
function add_new_tab($notebook, $widget) {
    global $tab_labels;
    static $page_num=0;
    $tab_label = $tab_labels[$page_num];

    $eventbox = new GtkEventBox();
    $label = new GtkLabel($tab_label);
    $eventbox->add($label);
    $label->show();
    $eventbox->connect('button-press-event', 'on_tab', $page_num);
    $notebook->append_page($widget, $eventbox);

    $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;
    ++$page_num;
}

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

    if ($event->button==3) {
        popup_menu($page_num);
        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 (page $switched_from)\n";
}

function popup_menu($page_num) {
    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_definition = array_merge($menu_definition, array('<hr>', 'rename'));  // note 1
    $menu = show_popup_menu($menu_definition, $page_num); // show the popup menu
}

// show popup menu
function show_popup_menu($menu_definition, $page_num) {
    $menu = new GtkMenu();
    $menu_id = 0;
    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', $menu_id, $page_num);
            ++$menu_id;
        }
    }
    $menu->show_all();
    $menu->popup();
}

// process popup menu item selection
function on_popup_menu_select($menu_item, $menu_id, $page_num) {
    global $notebook;
    global $tab_labels;

    $item = $menu_item->child->get_label();
    echo "popup menu selected: $item ($menu_id / $page_num)\n";
    if ($menu_id<3) { // user wants to change tab
        $notebook->set_current_page($menu_id); // change tab
        echo "New tab selected: $item (page $menu_id)\n";
    } elseif ($menu_id==3) { // user chooses rename
        $tab_label = $tab_labels[$page_num];
  • 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 in Part 1 to setup a tabbed GtkNotebook with self-defined popup menu, and the code in How to display a popup dialog to prompt for data? to prompt for the new tab label.

What's new here:

  1. Add the "rename" option to tab label.
  2. Prompt for new tab label.
  3. Set the tab label to the new label.
  4. Updates the array tab_labels() with the new label name.

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