Aller au contenu

Programmation GTK2 en Pascal/GtkCheckMenuItem

Un livre de Wikilivres.
Programmation GTK2 en Pascal

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

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

Utilisation de base

[modifier | modifier le wikicode]

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 | modifier le wikicode]

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 | modifier le wikicode]

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 | modifier le wikicode]

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