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:

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:
- Add the "rename" option to tab label.
- Prompt for new tab label.
- Set the tab label to the new label.
- 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. |
|