Programmation GTK2 en Pascal/GtkCheckMenuItem

Programmation GTK2 en Pascal

Présentation modifier

Le contrôle GtkCheckMenuItem est un élément de menu qui peut être coché, comme une case à cocher (GtkCheckButton).

Hiérarchie modifier

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

Utilisation de base modifier

Création modifier

Les fonctions de création sont :

function gtk_check_menu_item_new : PGtkWidget;
function gtk_check_menu_item_new_with_label(_label : Pgchar) : PGtkWidget;
function gtk_check_menu_item_new_with_mnemonic(_label : Pgchar) : PGtkWidget;

Ces fonctions étant classiques, nous n'en dirons pas plus.

Modification de l'état modifier

Il existe plusieurs fonctions pour modifier l'état d'un GtkCheckMenuItem :

procedure gtk_check_menu_item_set_active(check_menu_item : PGtkCheckMenuItem; is_active : gboolean);
procedure gtk_check_menu_item_toggled(check_menu_item : PGtkCheckMenuItem);

La première fonction modifie l'état de l'item en fonction du paramètre is_active.

La deuxième fonction inverse tout simplement l'état de l'item.

Nous disposons également d'une fonction associée pour récupérer l'état d'un GtkCheckMenuItem :

function gtk_check_menu_item_get_active(check_menu_item : PGtkCheckMenuItem) : gboolean;

Intercepter un clic de souris modifier

Pour savoir lorsqu'un GtkCheckMenuItem a été coché ou décoché, nous avons la possibilité de connecter le signal « toggle » qui sera émis à chaque fois que l'utilisateur modifiera l'état de l'item.

Programme exemple modifier

Nous allons créer un menu contenant un GtkCheckMenuItem permettant d'afficher ou de cacher une barre d'état.

Voilà le fichier gtk035.pas :

program gtk035;

uses glib2, gtk2;

procedure OnMenuItemClic(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
  pBarreEtat : PGtkWidget;
  Coche : gboolean;
begin
  pBarreEtat := GTK_WIDGET(AData);

  // Récuperation de l'état du menu
  Coche := gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(APWidget));

  // Selon le résultat, on affiche où pas la barre d'état
  if Coche then begin
    gtk_widget_show(pBarreEtat);
  end
  else begin
    gtk_widget_hide(pBarreEtat);
  end;
end;

var
  pFenetre   : PGtkWidget;
  pVBox      : PGtkWidget;
  pBarreMenu : PGtkWidget;
  pMenuItemAffichage : PGtkWidget;
  pMenuAffichage     : PGtkWidget;
  pMenuItemBarreEtat : PGtkWidget;
  pBarreEtat         : PGtkWidget;

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), 'Gtk035 : Élément de menu cochable');
  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 Barre d'état et rattachement au menu Affichage
  pMenuItemBarreEtat := gtk_check_menu_item_new_with_label('Barre d''état');
  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItemBarreEtat), TRUE);
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemBarreEtat);

  // Ajout de la barre d'état
  pBarreEtat := gtk_statusbar_new;
  gtk_box_pack_end(GTK_BOX(pVBox), pBarreEtat, FALSE, FALSE, 0);

  // Signal du menu affichage de la barre d'état
  g_signal_connect(pGTKOBJECT(pMenuItemBarreEtat), 'toggled', G_CALLBACK(@OnMenuItemClic), pBarreEtat);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

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

 

Puis après avoir cliqué sur « Barre d'état » et à nouveau resélectionner le menu « Affichage » :

 


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