Bonjour
J'aimerais bien générer de tels menu avec gtk3 :http://troumad.org/OOo/menu.png
Le but étant de différencier certains item par la couleur. Est-ce possible ?
Version imprimable
Bonjour
J'aimerais bien générer de tels menu avec gtk3 :http://troumad.org/OOo/menu.png
Le but étant de différencier certains item par la couleur. Est-ce possible ?
A priori je dirais non. Du moins pas de manière simple.
Une idée qui me vient serait de créer une image que tu pourrais ensuite intégrer comme un GtkImageMenuItem. Mais bon, c'est peut être un peut tiré par les cheveux...
Il faudrait que je calcule la hauteur de chaque entrée ?
Pas génial !
Je peux toujours essayer de construire une petite fonction adéquate pour voir si c'est faisable de manière relativement simple.
A force de chercher il y a peut être un début de solution avec la fonction gtk_widget_override_background_color();.
Le widget ? C'est quoi ? Un élément du menu ou tout le menu ?
Je ne pense pas qu'un élément du menu puisse être considéré comme un widget. Si ?
Dans ce cas favorable, comment l'atteindre ?
Un GtkMenuItem est bien un widget...
Apparemment si l'entrée du menu est un GtkRadioMenuItem* seul le bouton sera affecté par la fonction gtk_widget_override_background_color();. Le label aura toujours le fond gris (ou de la couleur du gestionnaire de fenêtre choisi).
Ca y est. Je le tiens :mrgreen:.
Il faut ajouter une fonction callback associée au signal "draw" pour chaque GtkMenuItem*. Je te la fournis :Il faut transmettre à cette fonction un pointeur sur un GdkRGBA* qui contiendra la couleur de fond que tu veux associer au GtkMenuItem*.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 gboolean callback_background_color_menuitem (GtkWidget *widget, cairo_t *cr, gpointer user_data) { GdkRGBA *color = (GdkRGBA*) user_data; GtkAllocation allocation; /* Récupération de la taille du widget */ gtk_widget_get_allocation (widget, &allocation); /* Affectation de la couleur de fond */ cairo_set_source_rgba (cr, color->red, color->green, color->blue, color->alpha); /* Remplissage de la surface du widget */ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height); cairo_fill(cr); return FALSE; }
Par exemple on pourrait écrire:Il nous suffira de passer le pointeur de cette variable au callback associé:Code:
1
2
3
4
5 GdkRGBA color; color.red = 1.0; color.green = 1.0; color.blue = 51.0/255; color.alpha=1.0;
Il est important de bien penser à ce que la variable color soit toujours "vivante" le temps de l'exécution du code. C'est pour cela que je pense qu'elle doit être initialisée dans la fonction main(); et propagée au callback à partir de là.Code:
1
2 radioitem = gtk_radio_menu_item_new_with_label (group, name); g_signal_connect (G_OBJECT(radioitem), "draw", G_CALLBACK(callback_background_color_menuitem), &color);
Histoire de te montrer ce que ca donne j'ai modifié ton code perso. Les menus interactifs construits à partir du contenu des répertoires ont maintenant un fond jaune ;).
Je ne pense pas avoir le temps de tester avant Jeudi après midi. Mais, là, c'est pour les barres de menus uniquement...
Je me suis mal exprimé peut-être !
Ma copie d'écran représentait une ComboBox... Et c'est une ComboBox que je voudrais colorier !
Ceci-dit, je vais sûrement profiter de cet exemple pour tester avec les menus ;)
Et peut-être rajouter quelques lignes dans mon articles sur les menus avec gtk ;)
Bon, ben, je te fais ca pour les combobox alors ;).
Je suis arrivé à faire marcher ton système avec mes menu ;)
Cependant, je tombe sur un bug de code::blocks... J'aurais voulu étudier le paramètre widget de ta fonction, je mets un stoppeur à la ligne 171 du fichier callback_menu (dans ta fonction), lorsque le mode pas à pas arrive sur cette fonction, je n'ai plus que la souris qui marche dans l'interface graphique !
C'est la seconde fois que j'arrive sur un tel problème ! Voir : http://www.mageialinux-online.org/fo...t=&idm="e=
En plus, bien avant d'arriver sur ta fonction, j'ai plein de warning qui arrivent en ligne de commande :Peut-être une histoire de mise à jour inachevées...Code:Gtk-WARNING **: Theme parsing error: gtk.css:132:30: Not using units is deprecated. Assuming 'px'.
Un petit problème lié au thème de ton bureau peut êtrePour ce qui est de colorier un GtkCombox je suis toujours dessus. Je suis en train de me casser les dents dessus :aie:. Je n'arrive toujours pas à accéder au popup qui s'ouvre lorsque tu cliques sur le bouton du GtkCombox. Je continue mes recherches...Code:...Theme parsing error: gtk.css
Mon but étant de colorier l'entrée du menu en fonction de sa configuration, j'ai besoin de savoir quelle est l'entrée : ce qu'elle affiche ou son rang dans les entrées. Est-ce possible à partir de l'entrée widget ?
J'ai un autre problème, pour certaines entrées, c'est bon, et pas pur d'autres. Dans certains cas, toute la case est coloriée, même ce qui est affiché !
En enlevant la ligne qui colorie c'est bon :Tu peux voir ceci aux lignes 296 et 184 de mon fichier callback_menu.c de mon projet http://troumad.org/Mes_regles/perso3.zipCode:cairo_fill(cr);
Oups... J'ai encore bouffé une partie du lien... Je corige...
Voici le menu que je voudrais colorier et le version colorié à côté :http://troumad.org/OOo/menu_nom.pnghttp://troumad.org/OOo/menu_couleur.png
Celui qui marche est créé avec gtk_menu_item_new_with_mnemonic, ceux qui ne marchent pas sont créés avec gtk_check_menu_item_new_with_mnemonic ou gtk_radio_menu_item_new_with_mnemonic
À partir de quelle fonction appelles-tu callback_background_color_menu_classe();. Je ne trouve pas...
Bon, même si je n'ai pas trouvé l'origine de l'appel ce n'est pas grave.
La fonction que je t'ai donné est un Callback éxécuté sur l'appel du signal "draw". Donc le prototype de ce callback doit être respecté.
Si tu veux que tes menus soient affichés correctement il faut ces prototypes :
Et dans chacune de ces fonctions il faut finir par un return FALSE; sous peine d'interdire la propagation du signal "draw" au reste de la construction du menu. Ce pour quoi actuellement tu n'as aucun texte.Code:
1
2 gboolean callback_background_color_menu_race (GtkWidget *widget, cairo_t *cr, gpointer param); gboolean callback_background_color_menu_classe (GtkWidget *widget, cairo_t *cr, gpointer param);