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:

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:
- Enable reordering of tabs.
- Inform us when there's a reordering of tabs.
- Update the array
$tab_widget which contains the pointers to the widgets associatred with each tab.
Related Links
|