Problem
You want to allow users to rename the tab labels of GtkNotebook as shown below:
Solution
- Set up GtkNotebook with self-defined popup menu as outlined in How to display a popup menu for GtkNotebook tab - Part 3?.
- Add the "rename" option to the popup menu.
- Prompt for new tab label using the technique as described in How to display a popup dialog to prompt for data?
Sample Code
1 2 3 4 5 6 7 8 10 17 18 19 20 21 22 23 24 25 26 27 28 29 31 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 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 92 93 94 95 97 100 102 103 104 105 106 108 109 110 111 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 139 140 141 142 144 145 146 148 149 153 154 155 156 157 158 159 160 161 163 164 166 167 168 169 170 171 172 173 174 175 176 180 181 182 183 185 186 187 188 189 190 192 193 194 195 196 197 198 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | <?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]; $new_name = prompt("Please enter new name for tab:", $tab_label); // note 2 global $tab_widget; $tab_label = $notebook->get_tab_label($tab_widget[$page_num]); $tab_label->child->set_text($new_name); // note 3 $tab_labels[$page_num] = $new_name; // note 4 } } //function to prompt for user data function prompt($label, $org_str) { $prompt = new Prompt($label, $org_str); // creates a new prompt $input = $prompt->entry->get_text(); // get the user input return $input; // and returns the user input } class Prompt{ var $entry; // the user input function Prompt($label, $org_str) { $dialog = new GtkDialog('Prompt', null, Gtk::DIALOG_MODAL); $dialog->set_position(Gtk::WIN_POS_CENTER_ALWAYS); $top_area = $dialog->vbox; $top_area->pack_start($hbox = new GtkHBox()); $stock = GtkImage::new_from_stock(Gtk::STOCK_DIALOG_QUESTION, Gtk::ICON_SIZE_DIALOG); $hbox->pack_start($stock, 0, 0); $hbox->pack_start(new GtkLabel($label)); $this->entry = new GtkEntry(); $this->entry->set_text($org_str); $hbox->pack_start($this->entry, 0, 0); $hbox->pack_start(new GtkLabel(' '), 0, 0); $dialog->add_button(Gtk::STOCK_OK, Gtk::RESPONSE_OK); $buttons = $dialog->action_area->get_children(); $button_ok = $buttons[0]; // get the ID of the OK button // simulate button click when user press enter $this->entry->connect('activate', array(&$this, 'on_enter'), $button_ok); $dialog->set_has_separator(false); $dialog->show_all(); $dialog->run(); $dialog->destroy(); } // simulate button click when user press enter function on_enter($entry, $button) { $button->clicked(); } } ?> |
Output
As shown above.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
- How to know which tab of GtkNotebook is being clicked on?
- How to display a popup menu for GtkNotebook tab - Part 1?
- How to display a popup menu for GtkNotebook tab - Part 2?
- How to display a popup menu for GtkNotebook tab - Part 3?
- How to display context sensitive popup menu with right mouse click in GtkTreeView?
- How to display a popup dialog to prompt for data?
Read more...