395. How to change the font of menus and menuitems - Part 1?

Problem

You have set up menus and radio menus in How to set up menu and radio menu - Part 3 - add accelerators?

Suppose you would like to change the font and font size of the menus and menuitems as shown below:

How to change the font of menus and menuitems - Part 1?


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   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
47   
48   
49   
50   
51   
53   
54   
55   
56   
57   
58   
59   
60   
61   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
80   
81   
82   
83   
84   
86   
92   
93   
94   
95   
99   
100   
104   
105   
106   
107   
108   
109   
110   
111   
112   
113   
114   
115   
116   
117   
119   
120   
121   
122   
123   
124   
125   
126   
127   
128   
129   
130   
134   
135   
137   
138   
139   
<?php
$window = new GtkWindow();
$window->set_title($argv[0]);
$window->set_size_request(400, 150);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());
$accel_group = new GtkAccelGroup();
$window->add_accel_group($accel_group);

// define menu definition
$menu_definition = array(
    '_File' => array('_New|N', '_Open|O', '_Close|C', '<hr>',
                    '_Save|S', 'Save _As','<hr>', '_Quit'),
    '_Edit' => array('Cut|X', 'Copy|C', '_Paste|V', '<hr>',
                    'Select All|A', '<hr>', '_Undo|Z','_Redo|Y'),
    '_Test' => array('Test_1|1', 'Test_2|2', 'Test_3|3', '<hr>',
                array('Selection 1', 'Selection 2', 'Selection 3'),
                '<hr>', 'Test_4|4')
);
setup_menu($vbox, $menu_definition);

// display title
$title = new GtkLabel("   Change the font and fontsize\n".
"of menu and menuitems - Part 1");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$vbox->pack_start($title);
$vbox->pack_start(new GtkLabel(''));

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

// setup menu
function setup_menu($vbox, $menus) {
    global $accel_group;
    $menubar = new GtkMenuBar();
    $vbox->pack_start($menubar, 0, 0);
    foreach($menus as $toplevel => $sublevels) {
        $menubar->append($top_menu = new GtkMenuItem($toplevel));
        $label = $top_menu->child; // note 1
        set_menuitem_font($label); // note 2
        $menu = new GtkMenu();
        $top_menu->set_submenu($menu);
        foreach($sublevels as $submenu) {
            if (strpos("$submenu", '|') === false) {
                $accel_key = '';
            } else {
                list($submenu, $accel_key) = explode('|', $submenu);
            }

            if (is_array($submenu)) { // set up radio menus
                $i=0;
                $radio[0] = null;
                foreach($submenu as $radio_item) {
                    $radio[$i] = new GtkRadioMenuItem($radio[0], $radio_item);
                    $radio[$i]->connect('toggled', "on_toggle");
                    $menu->append($radio[$i]);

                    ++$i;
                }
                $radio[0]->set_active(1); // select the first item

            } else {
                if ($submenu=='<hr>') {
                    $menu->append(new GtkSeparatorMenuItem());
                } else {
                    $submenu2 = str_replace('_', '', $submenu);
                    $submenu2 = str_replace(' ', '_', $submenu2);
                    $stock_image_name = 'Gtk::STOCK_'.strtoupper($submenu2);
                    if (defined($stock_image_name)) {
                        $menu_item = new GtkImageMenuItem(
                                        constant($stock_image_name));
                    } else {
                        $menu_item = new GtkMenuItem($submenu);
                    }
                    if ($accel_key!='') {
                        $menu_item->add_accelerator("activate", $accel_group,
                        ord($accel_key), Gdk::CONTROL_MASK, 1);
                    } 

                    $label = $menu_item->child; // note 3
                    set_menuitem_font($label); // note 4

                    $menu->append($menu_item);
                    $menu_item->connect('activate', 'on_menu_select');
                }
            }
        }
    }
}

// process radio menu selection
function on_toggle($radio) {
    $label = $radio->child->get_label();
    $active = $radio->get_active();
    echo("radio menu selected: $label\n");
}

// process menu item selection
function on_menu_select($menu_item) {
    $item = $menu_item->child->get_label();
    echo "menu selected: $item\n";
    if ($item=='_Quit') Gtk::main_quit();
}

// sets the label of a menuitem
function set_menuitem_font($label) {
    $label->modify_font(
        new PangoFontDescription("Times New Roman 12")); // note 5
}

?>

Output

As shown above.
 

Explanation

We make use of the code from How to set up menu and radio menu - Part 3 - add accelerators? to set up the standard menu and menuitems.

What's new here:

  1. Get the pointer to the GtkLabel of each toplevel menuitem.
  2. Change the font.
  3. Get the pointer to the GtkLabel of each menuitem.
  4. Change the font.
  5. In this example, we change the font of the menuitem to "Times New Roman 12".

Note

The above code runs ok, except for the radio menuitems as shown below:

We will fix this in Part 2.

Related Links

Add comment


Security code
Refresh