IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

GtkUIManager et radioItem


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut GtkUIManager et radioItem
    Bonjour

    liberforce vient de me signaler que GtkItemFactoryEntry est obsolète et que je dois utiliser GtkUIManager. Je regarde comment faire ce que j'avais commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    static GtkItemFactoryEntry MenuItem[] = {
        { "/_Fichier", NULL, NULL, 0, "<Branch>" },
        { "/Fichier/_Nouveau", NULL, NULL, 0, "<StockItem>", GTK_STOCK_NEW },
        { "/Fichier/_Ouvrir", NULL, NULL, 0, "<StockItem>", GTK_STOCK_OPEN },
        { "/Fichier/Enregi_strer", "<ctrl>S", NULL, 0, "<StockItem>", GTK_STOCK_SAVE },
        { "/Fichier/_Fermer", "<ctrl>F", NULL, 0, "<StockItem>", GTK_STOCK_CLOSE },
        { "/Fichier/Sep1", NULL, NULL, 0, "<Separator>" },
        { "/Fichier/_Quitter", NULL, 0, 1, "<StockItem>", GTK_STOCK_QUIT},
        { "/_Tirage", NULL, NULL, 0, "<Branch>" },
        { "/Tirage/_Choix du mode de tirage", "<ALT>C", NULL, 0, "<Branch>",  },
        { "/Tirage/Choix du mode de tirage/3 dès 6", NULL, print_selected, _3D6, "<RadioItem>",},
        { "/Tirage/Choix du mode de tirage/Meilleurs de 4 dès 6", NULL, print_selected, _4D6, "/Tirage/Choix du mode de tirage/3 dès 6",  },
        { "/Tirage/Choix du mode de tirage/Meilleurs de 5 dès 6", NULL, print_selected,_5D6, "/Tirage/Choix du mode de tirage/3 dès 6",  },
        { "/Tirage/Choix du mode de tirage/Meilleurs de 6 fois 3 dès 6",NULL, print_selected, _3D6x6, "/Tirage/Choix du mode de tirage/3 dès 6", },
        { "/Tirage/Choix des _Minima", "<ALT>M", NULL, 0, "<StockItem>",  },
        { "/_?", NULL, NULL, 0, "<Branch>" },
        { "/?/_A propos de...", "<CTRL>A", explication, 0, "<StockItem>", GTK_STOCK_HELP}
    };
    [...]
      gtk_item_factory_create_items(pItemFactory, iNbMenuItem, MenuItem, (gpointer)param);
    Je commence par un premier problème : faire des boutons radios. Il y avait aussi des checkbox qui m'intéressaient...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je ne sais pas s'ils utilisent des boutons radio, mais tu peux jeter un coup d'oeil à ce tutoriel:
    http://live.gnome.org/GnomeLove/UIManagerTutorial

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je ne pense pas

    J'ai trouvé ça : http://gtk.developpez.com/cours/gtk2/Gtk.Les.menus.php .
    Ça donne l'impression d'une grosse machine avec des tâches répétitives qu'on devrait pouvoir automatiser.
    C'est ce que faisait GtkItemFactoryEntry et c'est ce que fait GtkUIManager. Je serais surpris de devoir tout faire à la main ! S'il n'existe rien d'officiel, je serais surpris que personne, aucun projet n'ait fait le sien !
    D'un autre côté, je serais surpris que GtkUIManager ne gère ni les bouton radio ni les checkbox !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    A priori il faut regarder du côté de GtkActionGroup, et en particulier gtk_action_group_add_radio_actions.

    Si j'ai bien compris:
    1. Tu crées des GtkActionGroup
    2. Tu y insères ce que tu veux comme actions avec la fonction qui va bien: gtk_action_group_add_actions, gtk_action_group_add_radio_actions, gtk_action_group_add_toggle_actions
    3. Les noms des actions doivent correspondre entre le xml et ta définition des actions groups.

    Je pense aussi que le nom que tu as donné au groupe lors de sa création est utilisé pour savoir où l'intégrer dans les menus. Si tu as une balise placeholder avec un nom identique à celui de ton groupe, il devrait être intégré tel quel.

    Reprends le tutoriel, et regarde comment sont faits les action groups.

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    J'ai vu un developpeur gtk, il m'a conseillé cette page que je regarderai demain : http://library.gnome.org/devel/gtk/s...omeuiinfo.html
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    J'arrive à faire mes menus...
    Maintenant il faudrait que j'arrive à trouver la valeur de l'item sélectionné !

    Il me semble que c'est gtk_radio_action_get_current_value que je dois utiliser. Le paramètre est l'item sélectionné. Il faut que je cherche comment trouver l'item sélectionné.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je pense que tu n'as pas à le trouver: on t'indique lequel c'est. Tu dois avoir un signal pour t'indiquer quand cet état change, il te suffit donc juste de te connecter à ce signal et lire la valeur.

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Comment trouver ce signal ? C'est intéressant comme idée ! Mais, je ne le vois pas
    Peut-être : http://gtk.developpez.com/cours/gtk2....boutons.2.php à chercher...

    Mon problème est de lier mes boutons à un signal...

    Je donne mon code :
    Le fichier main.menu.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <ui>
      <menubar>
        <menu action="FichierMenuAction">
          <separator />
          <menuitem action="Quitter" />
        </menu>
        <menu action="AideMenuAction">
          <menuitem action="Aide" />
          <menuitem action="AproposAction" />
          <menuitem action="Licence" />
        </menu>
       <menu action="ModeDeTirage">
          <menuitem action="_3D6" />
          <menuitem action="_4D6" />
          <menuitem action="_5D6" />
          <menuitem action="_3D6x6" />
          <menuitem action="_4D5p3" />
        </menu>
      </menubar>
    </ui>
    La partie ModeDeTirage a les boutons radio. Il n'y a aucune différentiation à ce niveau.

    Le main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    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
    96
    97
    98
    99
    100
    void print_selected(GtkWidget *p_widget, void * param);
     
    int main (int argc, char *argv[])
    {
      GtkWidget *button = NULL;
      GtkWidget *win = NULL;
      GtkWidget *vbox = NULL;
      GtkAccelGroup *pAccel;
      void * param[10]; /* pour le passage des paramètres */
      /* Definition des elements du menu */
       /* menu */
      GtkUIManager *menu_Manager;
      /* Le menu complet, sans les boutons radio, mtout de même l'entrée du menu relative aux boutons radios : ModeDeTirage */
      GtkActionEntry entrees_menu[] =
      {
       {"FichierMenuAction",NULL           ,"Jeu"              , NULL       , NULL                            , NULL                        },
       {"Quitter"          ,GTK_STOCK_QUIT ,"Quitter"          ,"<Control>Q","Finir la partie"                , G_CALLBACK( cb_fin         )},
       {"AideMenuAction"   ,NULL           ,"Aide"             , NULL       , NULL                            , NULL                        },
       {"Aide"             ,GTK_STOCK_HELP ,"Aide"             ,"<Shift>A"  , NULL                            , G_CALLBACK( menu_aide      )},
       {"AproposAction"    ,GTK_STOCK_ABOUT,"A propos"         ,"<Alt>A"    , NULL                            , G_CALLBACK( menu_a_propos  )},
       {"Licence"          ,GTK_STOCK_INFO ,"Licence GPL"      ,"<Release>L", NULL                            , G_CALLBACK( menu_licence   )},
       {"ModeDeTirage",NULL           ,"Mode de tirage"  }
      };
      /* Radio items */
     static const GtkRadioActionEntry radio_entries[] = {
       { "_3D6"  , "_3D6"  , "_3 dès à 6 faces", NULL, "Tirages des caractéristiques avec 3 dès à 6 faces", _3D6 },
       { "_4D6"  , "_4D6"  , "_4 dès à 6 faces, 3 meilleurs", NULL, "Tirages des caractéristiques avec 4 dès à 6 faces, somme des 3 meilleurs", _4D6 },
       { "_5D6"  , "_4D6"  , "_5 dès à 6 faces, 3 meilleurs", NULL, "Tirages des caractéristiques avec 5 dès à 6 faces, somme des 3 meilleurs", _5D6 },
       { "_3D6x6", "_3D6x6", "_6 fois 3 dès à 6 faces, le meilleur", NULL, "Tirages des caractéristiques avec 6 fois 3 dès à 6 faces, on garde le meilleur", _3D6x6 },
       { "_4D5p3", "_4D5p3", "4 dès à 5 faces, 3 meilleurs _+ 3", NULL, "Tirages des caractéristiques avec 4 dès à 5 faces, somme des 3 meilleurs plus 3", _4D5p3 },
     };
      param[2]=(void *)radio_entries;
      GtkActionGroup * p_actionGroup;
      unsigned short fct[32];
      GError * error;
     
      /* paramètres à passer aux fonctions */
      param[1]=(void *)fct;
      /* Initialize GTK+ */
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
      gtk_init (&argc, &argv); /* initialisation GTK */
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
     
      /* Create the main window */
      win = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* déclaration d'une fenêtre complète */
      param[0]=(void *)win;
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_title (GTK_WINDOW (win), "Tirage de personnages");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      gtk_widget_realize (win);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
      /* icone */
      if (!gtk_window_set_icon_from_file(GTK_WINDOW (win),"add.png",&error))
      {                                                                  /* met une icone à la fenêtre                                   */
       traite_erreur(error);
       free(error);
      }
     
      /* Create a vertical box with buttons */
      vbox = gtk_vbox_new (TRUE, 6);
      gtk_container_add (GTK_CONTAINER (win), vbox);
     
     
     
      /* initialisation du menu */
      p_actionGroup = gtk_action_group_new( "menuActionGroup" );
      gtk_action_group_add_actions( p_actionGroup, entrees_menu, G_N_ELEMENTS( entrees_menu ), NULL );
      /* boutons radio */ /* comment gérer la fonction callback ici ? */
      gtk_action_group_add_radio_actions (p_actionGroup, radio_entries, G_N_ELEMENTS (radio_entries), 1, NULL, NULL);
      /* déclaration de l'item menu */
      menu_Manager = gtk_ui_manager_new ();
      gtk_ui_manager_add_ui_from_file(menu_Manager,"main.menu.xml",NULL);
      gtk_ui_manager_insert_action_group( menu_Manager, p_actionGroup, 0 );
      g_signal_connect(menu_Manager,"add_widget",G_CALLBACK( menu_addWidget ),GTK_CONTAINER(vbox));
      /******************************************************/
      /*  manipulation pour activer les raccourcis clavier  */
      pAccel = gtk_ui_manager_get_accel_group (menu_Manager);  /* Création de l'AccelGroup à partir du GtkActionEntry          */
      gtk_window_add_accel_group (GTK_WINDOW (win), pAccel);   /* Activation des raccourcis clavier à partir de l'AccelGroup   */
      /******************************************************/
     
      g_signal_connect(G_OBJECT(print_selected), "clicked", G_CALLBACK(print_selected), /* mettre quoi ici ? */ );
     
      button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (explication), (gpointer) win);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      button = gtk_button_new_from_stock (GTK_STOCK_APPLY); /*GTK_STOCK_DIALOG_INFO);*/
      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (tirage), (gpointer) param);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
      g_signal_connect (button, "clicked", gtk_main_quit, NULL);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      /* Enter the main loop */
      gtk_widget_show_all (win);
      gtk_main ();
      //gtk_widget_destroy(win); /* destruction de le fenêtre */
      return 0;
    }
    Il y a deux niveaux où je peux espérer récupérer le signal :
    - gtk_action_group_add_radio_actions (p_actionGroup, radio_entries, G_N_ELEMENTS (radio_entries), 1, NULL, NULL); : mais je n'arrive pas à faire une fonction callback correte ici : j'ai un warning, son format n'est pas le bon
    gtk_action_group_add_radio_actions (p_actionGroup, radio_entries, G_N_ELEMENTS (radio_entries), 1, print_selected, (gpointer) param); donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <08|attention : passing argument 5 of ‘gtk_action_group_add_radio_actions’ from incompatible pointer type|             
    <|138|note: expected ‘GCallback’ but argument is of type ‘void (*)(struct GtkWidget *, void *)’|
    - g_signal_connect(G_OBJECT(/* mettre quoi ici */), "clicked", G_CALLBACK(print_selected), param );
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Jette un coup d'oeil ici:
    http://frothing.googlecode.com/svn/t...i_mainwindow.c

    Et cherche où est définie la callback on_work_offline_activate et comment elle est utilisée. Et fie toi autant que possible à la doc officielle plutôt qu'aux tutoriels sur developpez.net, pas forcément à jour ni plus explicite. Ma méthode c'est plutôt d'aller faire un tour sur http://www.google.com/codesearch et chercher les symboles qui m'intéressent pour tomber sur du code qui les utilise...

  10. #10
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Merci pour ta réponse ! Je ne connaissais pas http://www.google.com/codesearch !
    Tu m'as mis sur la voie ! Et j'ai trouvé

    Quand j'aurais tout mis au clair sur les menus, je poserais ici mes conclusions et après, je verrais peut-être pour un petit document !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  11. #11
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Content que tu aies pu te débloquer . On peut aussi citer d'autres sites de recherche de code, comme http://koders.com.

  12. #12
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    J'ai réussi à avoir une action sur chaque action de bouton radio ou de mes cases à cocher !

    Mais, il y a quelque chose qui me chagrine, l'état de mes boutons radio comme de mes cases à cocher est mémorisé quelque part par GTK. Comment faire pour y accéder ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  13. #13
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Qu'est-ce que tu entends par :
    Citation Envoyé par troumad Voir le message
    l'état de mes boutons radio comme de mes cases à cocher est mémorisé quelque part par GTK
    L'état est mémorisé dans les boutons eux même...

  14. #14
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Et je les trouve où ces boutons ? Avec quelle structure ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  15. #15
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Voici comment faire un menu avec bouton radio et cases à cocher en utilisant gtkUImanager.

    On écrit tout le menu avec toutes les entrées du menu sans distinction sans un fichier nommé main.menu.xmlk par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    <ui>
      <menubar>
        <menu action="FichierMenuAction">
          <separator />
          <menuitem action="Quitter" />
        </menu>
        <menu action="AideMenuAction">
          <menuitem action="Aide" />
          <menuitem action="AproposAction" />
          <menuitem action="Licence" />
        </menu>
        <menu action="Tirage">
           <menu action="ModeDeTirage">
              <menuitem action="_3D6" />
              <menuitem action="_4D6" />
              <menuitem action="_5D6" />
              <menuitem action="_3D6x6" />
              <menuitem action="_4D5p3" />
            </menu>
            <menu action="Minima">
                <menuitem action="guerrier" />
                <menuitem action="paladin" />
                <menuitem action="ranger" />
                <menuitem action="voleur" />
                <menuitem action="barde" />
                <menuitem action="pretre" />
                <menuitem action="druide" />
                <menuitem action="magicien" />
                <menuitem action="illusionniste" />
                <menuitem action="autre" />
            </menu>
        </menu>
      </menubar>
    </ui>
    Après, dans le programme en C, on regroupe toutes les entrées sauf les cases à cocher etu les boutons radio dans un tableau de GtkActionEntry, les boutons radio on les met dans un tableau de GtkRadioActionEntry et les cases à cocher dans un tableau de GtkToggleActionEntry.
    Voici un exmple de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    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
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    #include <stdio.h>
    #include "include.h"
     
     
     
    int main (int argc, char *argv[])
    {
      GtkWidget *button = NULL;
      GtkWidget *win = NULL;
      GtkWidget *vbox = NULL;
      GtkAccelGroup *pAccel;
      void * param[10]; /* pour le passage des paramètres */
      /* Definition des elements du menu */
       /* menu */
      GtkUIManager *menu_Manager;
      GtkWidget *menubar;
      /* Le menu complet, sans les boutons radio, mtout de même l'entrée du menu relative aux boutons radios : ModeDeTirage */
      GtkActionEntry entrees_menu[] =
      {
       {"FichierMenuAction",NULL           ,"Jeu"              , NULL       , NULL                            , NULL                        },
       {"Quitter"          ,GTK_STOCK_QUIT ,"Quitter"          ,"<Control>Q","Finir la partie"                , G_CALLBACK( cb_fin         )},
       {"AideMenuAction"   ,NULL           ,"Aide"             , NULL       , NULL                            , NULL                        },
       {"Aide"             ,GTK_STOCK_HELP ,"Aide"             ,"<Shift>A"  , NULL                            , G_CALLBACK( menu_aide      )},
       {"AproposAction"    ,GTK_STOCK_ABOUT,"A propos"         ,"<Alt>A"    , NULL                            , G_CALLBACK( menu_a_propos  )},
       {"Licence"          ,GTK_STOCK_INFO ,"Licence GPL"      ,"<Release>L", NULL                            , G_CALLBACK( menu_licence   )},
       {"Tirage",NULL           ,"Choix et spécification du tirage"  },
       {"ModeDeTirage",NULL           ,"Mode de tirage"  },
       {"Minima",NULL           ,"Mimima"  }
      };
      /* Radio items */
     static const GtkRadioActionEntry radio_entries[] = {
       { "_3D6"  , "_3D6"  , "_3 dès à 6 faces", NULL, "Tirages des caractéristiques avec 3 dès à 6 faces", _3D6 },
       { "_4D6"  , "_4D6"  , "_4 dès à 6 faces, 3 meilleurs", NULL, "Tirages des caractéristiques avec 4 dès à 6 faces, somme des 3 meilleurs", _4D6 },
       { "_5D6"  , "_5D6"  , "_5 dès à 6 faces, 3 meilleurs", NULL, "Tirages des caractéristiques avec 5 dès à 6 faces, somme des 3 meilleurs", _5D6 },
       { "_3D6x6", "_3D6x6", "_6 fois 3 dès à 6 faces, le meilleur", NULL, "Tirages des caractéristiques avec 6 fois 3 dès à 6 faces, on garde le meilleur", _3D6x6 },
       { "_4D5p3", "_4D5p3", "4 dès à 5 faces, 3 meilleurs _+ 3", NULL, "Tirages des caractéristiques avec 4 dès à 5 faces, somme des 3 meilleurs plus 3", _4D5p3 },
     };
     /* Toggle items */
     static const GtkToggleActionEntry toggle_entries[] =
     { /* liste des paramètres fournie avec gtk_action_group_add_toggle_actions */
       { "guerrier", NULL, "_Guerrier", NULL, "Minima du guerrier", (GCallback)liste_guerrier,TRUE },
       { "paladin", NULL, "_Paladin", NULL, "Minima du paladin", (GCallback)liste_paladin, FALSE },
       { "ranger", NULL, "_Ranger", NULL, "Minima du ranger", (GCallback)liste_ranger, FALSE },
       { "voleur", NULL, "_Voleur", NULL, "Minima du voleur", (GCallback)liste_voleur, FALSE },
       { "barde", NULL, "_Barde", NULL, "Minima du barde", (GCallback)liste_barde, FALSE },
       { "pretre", NULL, "Prê_Tre", NULL, "Minima du prêtre", (GCallback)liste_pretre, FALSE },
       { "druide", NULL, "_Druide", NULL, "Minima du druide", (GCallback)liste_druide, FALSE },
       { "magicien", NULL, "_Magicien", NULL, "Minima du magicien", (GCallback)liste_magicien, FALSE },
       { "illusionniste", NULL, "_Illusionniste", NULL, "Minima de l'illusionniste ",(GCallback)liste_illusionniste, FALSE },
       { "autre", NULL, "_Autre", NULL, "Autre", NULL, FALSE }
     };
     static struct
     {
      gchar *filename;
      gchar *stock_id;
     } stock_icons[] =
     {
      { "/home/bs/Documents/add/gtk/perso/3d6.png", "_3D6" },
      { "/home/bs/Documents/add/gtk/perso/4d6.png", "_4D6" },
      { "/home/bs/Documents/add/gtk/perso/5d6.png", "_5D6" },
      { "/home/bs/Documents/add/gtk/perso/3d6x6.png", "_3D6x6" },
     };
     static gint n_stock_icons = G_N_ELEMENTS (stock_icons);
     GtkIconFactory *icon_factory;
     GtkIconSet *icon_set;
     GtkIconSource *icon_source;
     gint i;
     
     
      param[2]=(void *)radio_entries;
      GtkActionGroup * p_actionGroup;
      unsigned short fct[35]={1,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,1,2,3,4,5,6,7,8,1,0,0,0,0,0,0,0,0,0};
      /* Le premier : mode de tirage, les 8 suivants : minima particuliers, les 8 suivants : ordre de préférence, guerrier, paladin,ranger, voleur, barde, prêtre, druide, magicien, illusionniste, autre */
      GError * error;
     
      /* paramètres à passer aux fonctions */
      param[1]=(void *)fct;
      /* Initialize GTK+ */
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
      gtk_init (&argc, &argv); /* initialisation GTK */
      g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
     
     
      /* creation des icones */
      icon_factory = gtk_icon_factory_new ();
      for (i = 0; i < n_stock_icons; i++)
      {
          icon_set = gtk_icon_set_new ();
          icon_source = gtk_icon_source_new ();
          gtk_icon_source_set_filename (icon_source, stock_icons[i].filename);
          gtk_icon_set_add_source (icon_set, icon_source);
          gtk_icon_source_free (icon_source);
          gtk_icon_factory_add (icon_factory, stock_icons[i].stock_id, icon_set);
          gtk_icon_set_unref (icon_set);
      }
      gtk_icon_factory_add_default (icon_factory);
      g_object_unref (icon_factory);
     
      /* Create the main window */
      win = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* déclaration d'une fenêtre complète */
      param[0]=(void *)win;
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_title (GTK_WINDOW (win), "Tirage de personnages");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      gtk_widget_realize (win);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
      /* icone */
      if (!gtk_window_set_icon_from_file(GTK_WINDOW (win),"add.png",&error))
      {                                                                  /* met une icone à la fenêtre                                   */
       traite_erreur(error);
       free(error);
      }
     
      /* Create a vertical box with buttons */
      vbox = gtk_vbox_new (TRUE, 6);
      gtk_container_add (GTK_CONTAINER (win), vbox);
     
     
     
      /* initialisation du menu */
      p_actionGroup = gtk_action_group_new( "menuActionGroup" );
      gtk_action_group_add_actions( p_actionGroup, entrees_menu, G_N_ELEMENTS( entrees_menu ), NULL );
      /* boutons radio */
      gtk_action_group_add_radio_actions (p_actionGroup, radio_entries, G_N_ELEMENTS (radio_entries), 1, (GCallback)print_selected, (gpointer) param);
      /* cases à cocher */
      gtk_action_group_add_toggle_actions (p_actionGroup, toggle_entries, G_N_ELEMENTS (toggle_entries), param);
      /* déclaration de l'item menu */
      menu_Manager = gtk_ui_manager_new ();
      /******************************************************/
      /*  manipulation pour activer les raccourcis clavier  */
      pAccel = gtk_ui_manager_get_accel_group (menu_Manager);  /* Création de l'AccelGroup à partir du GtkActionEntry          */
      gtk_window_add_accel_group (GTK_WINDOW (win), pAccel);   /* Activation des raccourcis clavier à partir de l'AccelGroup   */
      /******************************************************/
      gtk_ui_manager_add_ui_from_file(menu_Manager,"main.menu.xml",NULL);
      gtk_ui_manager_insert_action_group( menu_Manager, p_actionGroup, 0 );
      g_signal_connect(menu_Manager,"add_widget",G_CALLBACK( menu_addWidget ),GTK_CONTAINER(vbox));
      menubar = gtk_ui_manager_get_widget (menu_Manager, "/MainMenu"); /* pour placer le menu devant ?? */
     
     
      //g_signal_connect(G_OBJECT(p_actionGroup), "", G_CALLBACK(print_selected),  (gpointer)param );
     
      button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (explication), (gpointer) win);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      button = gtk_button_new_from_stock (GTK_STOCK_APPLY); /*GTK_STOCK_DIALOG_INFO);*/
      g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (tirage), (gpointer) param);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
      g_signal_connect (button, "clicked", gtk_main_quit, NULL);
      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
     
      /* Enter the main loop */
      gtk_widget_show_all (win);
      gtk_main ();
      //gtk_widget_destroy(win); /* destruction de le fenêtre */
      return 0;
    }
    La fonction appelée par les boutons radio (on ne peut en appeler qu'une même et unique pour tous les boutons) est définie par :
    gtk_action_group_add_radio_actions (p_actionGroup, radio_entries, G_N_ELEMENTS (radio_entries), 1, (GCallback)print_selected, (gpointer) param);
    La fonction appelée est print_selected, son format est void print_selected(GtkRadioAction *action, GtkRadioAction *current, gpointer param); qui ne correspond pas tout à fait au format habituel d'une fonction callback. Le paramètre param est le paramètre habituel en gpointer d'une fonction callback, par contre, le paramètre current est intéressant, c'est lui qui va nous permettre de savoir quelle case a été cochée. En effet, gtk_radio_action_get_current_value (current); renvoie le dernier paramètre du GtkToggleActionEntry définissant ce bouton. Dans la ligne { "_3D6" , "_3D6" , "_3 dès à 6 faces", NULL, "Tirages des caractéristiques avec 3 dès à 6 faces", _3D6 }, c'est _3D6 qui est en fait une constante définie par #define pour assurer une meilleure lisibilité.

    La fonction appelée par les cases à cocher est définie dans chaque défénition de boutons. Par exemple dans { "barde", NULL, "_Barde", NULL, "Minima du barde", (GCallback)liste_barde, FALSE } c'est (GCallback)liste_barde qui a le format suivant : void liste_barde (GtkToggleAction *menuitem, gpointer param);. Le paramètre recu (param ici) est défini en même temps que l'initialisation de la série de bouton par le dernier paramètre de : void liste_barde (GtkToggleAction *menuitem, gpointer param);

    Les boutons sont rajoutés avec la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void menu_addWidget (GtkUIManager * p_uiManager, GtkWidget * p_widget, GtkContainer * p_box)
    {
       gtk_box_pack_start (GTK_BOX (p_box), p_widget, FALSE, FALSE, 0);
       gtk_widget_show (p_widget);
       return;
     
       (void)p_uiManager;
    }
    J'ai rajouté des lignes pour insérer mes icônes, mais ça ne marche pas (encore).
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  16. #16
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par troumad Voir le message
    Et je les trouve où ces boutons ? Avec quelle structure ?
    Je poste quand même ma réponse à ta question d'hier (je l'avais rédigé sans possibilité de la poster, le site était en maintenance).

    Regarde l'exemple que je t'ai déjà donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static void on_work_offline_activate(GtkToggleAction *menuitem, gpointer user_data) {
     
        update_set_online(!gtk_toggle_action_get_active(menuitem));
    }
    Pour gtk_action_group_add_toggle_actions, la doc nous dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The "activate" signals of the actions are connected to the callbacks and their accel paths are set to <Actions>/group-name/action-name.
    Le signal "activate" d'un GtkToggleAction est hérité de GtkAction. Tu obtiens ainsi la signature de la callback à utiliser.

    Dans ta callback, gtk_toggle_action_get_active te donne ensuite l'état du bouton/menu.

    Pour les boutons radio, c'est le même principe:
    La documentation de gtk_action_group_add_radio_actions nous indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The "changed" signal of the first radio action is connected to the on_change callback and the accel paths of the actions are set to <Actions>/group-name/action-name.
    Le signal [URL="http://library.gnome.org/devel/gtk/stable/

  17. #17
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Merci... Je continue... je cherche encore !
    Dans l'exemple précédent, je parlais d'icône. Ma génération d'icône marche bien, mais je ne peux les mettre dans les boutons radio !
    Pour tant, son second champ est un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const gchar *stock_id;	The stock id for the action, or the name of an icon from the icon theme.
    Comme le second champ d'un GtkActionEntry ou d'un GtkToggleActionEntry. Je n'arrive à afficher les icônes que pour les boutons normaux (ni radio ni toggle).
    On pourrait c'est normal ! En effet, devant, ily le bouton radio ou la case à cocher ! Mais, j'ai trouvé un exemple qui nous donne comment : http://library.gnome.org/devel/gtk/s...omeuiinfo.html
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  18. #18
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Si tu parles de l'exemple 67 de ton lien, il me semble que GtkIconFactory est déprécié, alors tu ne pourras pas aller bien loin.

  19. #19
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    C'est bien ça
    Je prends quoi alors à la place ? Encore quelque chose à chercher

    Je cherche : http://fr.gnomesupport.org/forums/profile.php?id=9 : tu connais ??
    À quoi voit-on qu'on utilise des fonctions dépréciées ? Je les trouve dans http://library.gnome.org/devel/gtk/s...ck-Images.html dans devel/gtk/stable => déprécié comme chemin ?
    Dans http://library.gnome.org/devel/gtk/s...ptionMenu.html on voit clairement ec qui a été déprécié. Ça ne semble pas le cas de mon exemple précédent ! Non ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  20. #20
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Encore...

    Si je rajoute les lignes suivates à la main du main, je parcours mon menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
      GList * gl=gtk_action_group_list_actions (p_actionGroup),*k;
      //gchar *aname = gtk_action_get_name((GtkAction *) gl->next);
     
      for (k = gl; k != NULL; k = g_list_next(k))
      {
                    gchar *action_label;
                    gchar *action_name;
                    gchar *action_stock;
                    gchar action_active;
                    GtkAction *action;
                    action = GTK_ACTION(k->data);
                    g_object_get(action,
                                 "label",    &action_label,
                                 "name",     &action_name,
                                 "stock-id", &action_stock,
                                 NULL);
                    if (strcmp(action_name,"guerrier")==0)
                    {
                        //g_object_get(action,"is_active",&action_active,NULL);
                        printf("%hu\n",gtk_toggle_button_get_active((GtkToggleButton *)action));
                    }
                    if (strcmp(action_name,"barde")==0)
                    {
                        //g_object_get(action,"is_active",&action_active,NULL);
                        printf("%hu\n",gtk_toggle_button_get_active((GtkToggleButton *)action));
                    }
                    printf("label :%s , name : %s , stock : %s\n",action_label,action_name,action_stock);
                    g_free(action_stock);
                    g_free(action_name);
                    g_free(action_label);
     
      }
    Mais, je ne trouve pas (encore) comment trouver l'état des boutons !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Utilisation de GtkUIManager
    Par gege2061 dans le forum Contribuez
    Réponses: 7
    Dernier message: 09/12/2013, 17h04
  2. RadioItem et callback
    Par asma.r dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 12/10/2010, 11h01
  3. GtkUIManager sans Stock_ID
    Par cypher.sephiroth dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 23/09/2009, 11h26
  4. Arguments des fonctions de callback avec GTKUIManager
    Par mathedit dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 10/05/2009, 23h26
  5. Utilisation de GtkUIManager, quelques problèmes
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 01/11/2007, 19h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo