Aller au contenu

Programmation GTK2 en Pascal/GtkRadioMenuItem

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Le contrôle GtkRadioMenuItem est un élément de menu qui est l'équivalent d'un bouton radio (GtkRadioButton).

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkItem
                      └─GtkMenuItem
                          ├─GtkImageMenuItem
                          ├─GtkCheckMenuItemGtkRadioMenuItem
                          ├─GtkSeparatorMenuItem
                          └─GtkTearoffMenuItem

Utilisation de base

[modifier | modifier le wikicode]

Tout comme pour le contrôle GtkRadioButton, Gtk+ utilise les listes simplement chaînées. Pour créer le groupe ainsi que le premier bouton, il faut utiliser une des ces fonctions :

function gtk_radio_menu_item_new(group : PGSList) : PGtkWidget;
function gtk_radio_menu_item_new_with_label(group : PGSList; _label : Pgchar) : PGtkWidget;
function gtk_radio_menu_item_new_with_mnemonic(group : PGSList; _label : Pgchar) : PGtkWidget;

Pour créer le premier élément du groupe, il faut que le paramètre group soit égal à NULL. Par contre pour ajouter des éléments supplémentaires, ce paramètre est obligatoire. Il faudra donc récupérer sa valeur avec cette fonction :

function gtk_radio_menu_item_get_group(radio_menu_item : PGtkRadioMenuItem) : PGSList;

Cette fonction doit être utilisée avant chaque ajout d'élément.

Cependant pour éviter cette étape, GTK nous offre trois autres fonctions d'ajout :

function gtk_radio_menu_item_new_from_widget(group : PGtkRadioMenuItem) : PGtkWidget;
function gtk_radio_menu_item_new_with_label_from_widget(group : PGtkRadioMenuItem; _label : Pgchar) : PGtkWidget;
function gtk_radio_menu_item_new_with_mnemonic_from_widget(group : PGtkRadioMenuItem; _label : Pgchar) : PGtkWidget;

Programme exemple

[modifier | modifier le wikicode]

Nous allons créer un menu permettant le choix entre trois valeurs différentes, la valeur sélectionnée étant affichée dans un label.

Voilà le fichier gtk036.pas :

program gtk036;

uses glib2, gtk2;

procedure OnMenuItemClic(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  TexteDuMenu : pgchar;
  Texte : pgchar;
begin
  // Récuperation du texte du menu cliqué
  TexteDuMenu := gtk_label_get_text(GTK_LABEL(GTK_BIN(APWidget)^.Child));
  Texte := g_strdup_printf('%s est actif', [TexteDuMenu]);

  // Affichage du texte dans le label
  gtk_label_set_text(GTK_LABEL(AData), Texte);
  g_free(Texte);
end;

var
  pFenetre   : PGtkWidget;
  pVBox      : PGtkWidget;
  pBarreMenu : PGtkWidget;
  pMenuItemAffichage : PGtkWidget;
  pMenuAffichage     : PGtkWidget;
  pMenuItemValeur1   : PGtkWidget;
  pMenuItemValeur2   : PGtkWidget;
  pMenuItemValeur3   : PGtkWidget;
  pLabel     : PGtkWidget;
  pGroupe    : PGSList;

begin
  gtk_init(@argc, @argv);
  pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pFenetre), 320, 200);
  gtk_window_set_title(GTK_WINDOW(pFenetre), 'Gtk036 : Élément de menu « radio »');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(FALSE, 5);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création de la barre de menu
  pBarreMenu := gtk_menu_bar_new;
  gtk_box_pack_start(GTK_BOX(pVBox), pBarreMenu, FALSE, FALSE, 0);

  // Création de l'item Affichage et rattachement à la barre de menu
  pMenuItemAffichage := gtk_menu_item_new_with_label('Affichage');
  gtk_menu_shell_append(GTK_MENU_SHELL(pBarreMenu), pMenuItemAffichage);

  // Création du menu Affichage et rattachement à l'item Affichage
  pMenuAffichage := gtk_menu_new;
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItemAffichage), pMenuAffichage);

  // Création de l'item « Valeur 1 » et rattachement au menu Affichage
  pMenuItemValeur1 := gtk_radio_menu_item_new_with_label(NULL, 'Valeur 1');
  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItemValeur1), TRUE);
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur1);
  pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur1));

  // Création de l'item « Valeur 2 » et rattachement au menu Affichage
  pMenuItemValeur2 := gtk_radio_menu_item_new_with_label(pGroupe, 'Valeur 2');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur2);
  pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur2));

  // Création de l'item « Valeur 3 » et rattachement au menu Affichage
  pMenuItemValeur3 := gtk_radio_menu_item_new_with_label(pGroupe, 'Valeur 3');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur3);
  pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur3));

  // Création du label 
  pLabel := gtk_label_new('Valeur 1 est actif');
  gtk_box_pack_start(GTK_BOX(pVBox), pLabel, TRUE, FALSE, 0);

  // Signal des items « Valeur x »
  g_signal_connect(pGTKOBJECT(pMenuItemValeur1), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);
  g_signal_connect(pGTKOBJECT(pMenuItemValeur2), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);
  g_signal_connect(pGTKOBJECT(pMenuItemValeur3), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voilà ce que donne l'exécution du programme gtk036.pas après le lancement après avoir cliqué sur le menu « Affichage » et placer le curseur de la souris au dessus de « Valeur 3 » :

Puis après avoir cliqué sur « Valeur 3 » et à nouveau resélectionner le menu « Affichage », le label et le menu ont bien été modifiés :


Menu : GtkMenuBar ~ GtkMenu ~ GtkMenuShellGtkMenuItem ~ GtkImageMenuItem ~ GtkCheckMenuItem ~ GtkRadioMenuItem ~ GtkSeparatorMenuItem ~ GtkTearoffMenuItem