487. How to hide and unhide tabs in GtkNotebook?

Problem

You have set up a GtkNotebook with multiple tabs.

Suppose you would like to allow the users to hide and unhide tabs as shown below:

How to hide and unhide tabs in GtkNotebook?


Solution

  • The "trick" in getting this to work is that: when you hide the top-level widget contained in a tab of a GtkNotebook, the tab will automatically hide itself too!
  • To hide a widget, use the method GtkWidget::set_visible(false). To unhide it, set it to true.

Sample Code

1   
2   
3   
4   
5   
6   
7   
8   
10   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
32   
34   
35   
36   
37   
38   
39   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
59   
60   
61   
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   
98   
99   
100   
101   
103   
106   
108   
109   
110   
111   
112   
114   
115   
116   
117   
119   
120   
121   
122   
123   
124   
125   
126   
127   
128   
129   
130   
131   
132   
133   
134   
135   
136   
137   
138   
139   
140   
141   
142   
143   
145   
146   
147   
148   
150   
151   
152   
154   
155   
156   
157   
158   
159   
160   
161   
162   
163   
164   
165   
167   
168   
170   
171   
172   
173   
174   
175   
176   
177   
178   
179   
180   
184   
185   
186   
187   
189   
190   
191   
192   
193   
194   
196   
197   
198   
199   
200   
201   
202   
204   
205   
206   
207   
208   
209   
210   
211   
212   
213   
214   
215   
216   
217   
<?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');

// a global array that stores the widgets residing in each tab
$widgets = array();
$widgets[0] = new GtkLabel("Notebook 1");
$widgets[1] = 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);
$widgets[2] = $view;

// add two tabs of GtkLabel
add_new_tab($notebook, $widgets[0]);
add_new_tab($notebook, $widgets[1]);
add_new_tab($notebook, $widgets[2]);

$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>', 'hide this tab', 'unhide all'));  // 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) {
        $notebook->set_current_page($menu_id); // change tab
        echo "New tab selected: $item (page $menu_id)\n";
    } elseif ($menu_id==3) {
        global $widgets;
        $widgets[$page_num]->hide_all(); // note 2
    } elseif ($menu_id==4) {
        global $widgets;
        foreach($widgets as $widget) {
            $widget->show_all(); // note 3
        }
    }
}

//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.
 

Add comment


Security code
Refresh