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 :

Couleur des combo-box


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    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 605
    Par défaut Couleur des combo-box
    Bonjour

    Je cherche à pouvoir colorier une combo box : le fond et/ou le texte. La couleur d'une même entrée de cette liste déroulante pouvant changer au cours de l'exécution du programme, elle n'est donc pas figée.
    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
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    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 605
    Par défaut
    Je suis arrivé à faire quelque chose de pas génail, mais quelque chose tout de même. Je colorie toutes les entrées du menu. Ce n'est pas génail, mais c'est déjà ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          if (arme_OK==1)
          {
           g_object_set(GTK_CELL_LAYOUT(((GtkWidget ***)param)[M_CE_ARMES][k]), "cell_background", 0, NULL);
          }
          else
          {
           g_object_set(GTK_CELL_LAYOUT(((GtkWidget ***)param)[M_CE_ARMES][k]), "cell_background", "#FF0000", NULL);
          }
          gtk_widget_hide_all(((GtkWidget ***)param)[M_PC_ARMES][k]);
          gtk_widget_show_all(((GtkWidget ***)param)[M_PC_ARMES][k]);
    où GTK_CELL_LAYOUT(((GtkWidget ***)param)[M_CE_ARMES][k] est le GtkCellRenderer déclaré pour ce menu avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    p_cell = gtk_cell_renderer_text_new ();
          gtk_cell_layout_pack_start     (GTK_CELL_LAYOUT (((GtkWidget ***)param)[M_PC_CLASSE+offset][((unsigned short **)param)[M_NB_CLASSE+offset][0]]),p_cell, FALSE);
          gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (((GtkWidget ***)param)[M_PC_CLASSE+offset][((unsigned short **)param)[M_NB_CLASSE+offset][0]]),p_cell, "text", 0,NULL);
    nb : pour la lisibilité de mon code, j'ai plein de constante prédéfinie et j'en ai rajouté plus de 30 constantes depuis http://www.developpez.net/forums/d10...k_spin_button/ !
    Ceci vous semble peut-être grossier, mais c'est que je travaille sans variable globale
    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...

  3. #3
    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
    troumad, même sans variable globale, tu n'as en général pas besoin utiliser des tableaux à 2 dimensions de pointeurs triples... Une structure bien élaborée évite en général d'avoir à se flageller de cette manière. Pour accéder à une donnée on définit en général des accesseurs (fonctions get_* et set_*) qui permettent de récupérer facilement la donnée à travailler... Imagine que tu veux changer quelque chose de ta disposition qui affecte la manière dont tes données sont rangées, tu te vois retrouver toutes les occurrences de ton accès à ta donnée pour la modifier ? Le risque d'erreur est énorme.

    Il faut aussi au maximum éviter la duplication de code.

    En récrivant ton exemple ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        const gchar *color =  "#FF0000";
     
        if (arme_OK == 1)
            color = NULL;
     
        g_object_set (GTK_CELL_LAYOUT(((GtkWidget ***)param)[M_CE_ARMES][k]), "cell_background", color, NULL);
    Tu évites la duplication de ta ligne de code (du fonctionnel) et tu la remplace par de la donnée. Cela facilite en général la vie dans bien des cas. Si tu implémentes un "getter" pour récupérer facilement le widget à manipuler, tu améliores encore la lisibilité de ton code.

    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
     
    GtkCellLayout * gui_get_cell_layout (mystruct *param, guint row, guint col)
    {
        g_assert (param != NULL);
        g_return_val_if_fail (row < MAX_ROW);
        g_return_val_if_fail (col < MAX_COL);
        return GTK_CELL_LAYOUT(((GtkWidget ***)param)[row][col]);
    }
     
    [...]
        const gchar *color =  "#FF0000";
     
        if (arme_OK == 1)
            color = NULL;
     
        g_object_set (gui_get_cell_layout (param, M_CE_ARMES, k), 
                "cell_background", 0, NULL);
    Avec un getter, cela devient vite plus clair (je te donne un exemple là, à toi de l'adapter, cela ne compilera clairement pas en l'état). Parce que bon, des pointeurs de tableaux de pointeur etc. on en a vite marre en C. Pour éviter cela, on définit des types intermédiaires avec typedef, on fait des structures de données bien ficelées où on peut retrouver facilement ses données, et on évite de manipuler plus compliqué qu'un pointeur double... J'ai 11 ans de C/C++ dans les pattes, je t'assure qu'on est pas maso quand il n'y en a pas besoin

    Je te conseille aussi de te pencher sur GtkBuilder pour l'accès à tes widgets. Parce que là j'ai du mal à voir quelle arborescence de widgets justifierait la complexité de ce que tu fais.

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    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 605
    Par défaut
    J'ai utilisé ta première remarque.

    Par contre, je ne peux pas utiliser ta seconde remarque ! Je m'explique par la suite.
    Citation Envoyé par liberforce Voir le message
    Je te conseille aussi de te pencher sur GtkBuilder pour l'accès à tes widgets. Parce que là j'ai du mal à voir quelle arborescence de widgets justifierait la complexité de ce que tu fais.
    Ce n'est pas une arborescence de widget...
    C'est un tableau de pointeurs où chaque entrée peut être de nature différente. Certaines entrées peuvent être un tableau d'une série de caractéristiques qui doivent être groupées pour la compréhension => ces entrées sont des tableaux 1D et comme, on travaille avec des pointeurs sur des Widget, ça fait obligatoirement *** , mais le troisième * n'est là que pour la décoration.
    Le premier * : le gpointeur du passage de paramètres
    Le second * : l'item dans mon tableau
    Le troisième * : un GTK_WIDGET est un pointeur sur un GtkWidget
    Exemple : ((GtkWidget ***)param)[M_ENTREE][DEXTERITE]

    J'ai d'autres natures d'entrées : ((unsigned short **)param)[M_NV_CLASSE][k] => un tableau d'entier par exemple. Et tous ces tableaux ont des tailles variables au cours de l'exécution du programme.

    Pour la compréhension de la structure, vous pouvez regarder l'interface qui est associée à cette entrée, elle est à la page 6 de ce document : http://troumad.org/OOo/Mode_d_emploi.odt
    J'ai un tableau de 9 éléments pour les caractéristiques (Force...) de la première colonne. Un autre de 8 éléments pour les compétences de voleur.
    J'ai un tableau pour les Classes (Guerrier...), sachant que le nombre est à priori indéfini. Il est est de même pour les PDV, pour les compétences et les armes.

    nb : j'aimerai en fait changer la couleur d'un seul item de mon combo box !
    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...

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Salut.

    Au vu de ton document ooo l'utilisation de Glade me semble être une nécessité. Tu y gagnerais une grande souplesse de programmation et aussi une rapidité de modification non négligeable.

    Pour les caractéristiques de tes personnages si certains combos sont fixes tu n'es pas obligé d'utiliser des tableaux. Il te suffit de lire la valeur sélectionnée dans le combo. En d'autres termes ton interface est une mémorisation des réglages de l'utilisateur.

    Sans avoir lu très précisément tes différents posts l'utilisation de tableau me fait toujours peur. Surtout si certains d'entre eux sont à dimension indéfinie comme tu l'écris. L'utilisation ici des listes chaînées me semble plus appropriée. Ou bien les GArray.

  6. #6
    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
    @Troumad:
    à quoi ressemble ta structure de données associée à un personnage ?

Discussions similaires

  1. Lier les choix des combo box
    Par chepa dans le forum Excel
    Réponses: 3
    Dernier message: 13/07/2013, 16h58
  2. remplir des combo box par une fonction ?
    Par angelevil dans le forum VB.NET
    Réponses: 5
    Dernier message: 06/10/2010, 23h12
  3. Regions et départements dans des Combo Box
    Par realtux dans le forum NetBeans
    Réponses: 4
    Dernier message: 16/06/2010, 12h23
  4. Mettre des items en couleur dans un combo box
    Par wrm8787 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/03/2009, 06h53
  5. Réponses: 1
    Dernier message: 20/06/2006, 17h39

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