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 :

"texte" cliquable dans un gtktreeview


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut "texte" cliquable dans un gtktreeview
    Bonjour à tous,

    J'aurais quelques questions concernant la création d'un petit tree.
    Je vous livrerais le code si nécessaire en attendant je préfère m'en tenir à une petite description du problème en image.

    Donc quelques information sur le problème.
    A l'aide de Glade j'ai crée une fenêtre puis inséré un arbre. Cet arbre est rempli à l'aide de données externes et ça doit le rester (la liste affichée par cet arbre sera évolutive)

    J'aimerais bien que cette liste soit en partie interactive. C'est à dire qu'en cliquant sur un élément, on puisse afficher une boite de dialogue (équivalente à ce que produit un clic droit par exemple)



    Grosso modo en cliquant sur p_mesh on produit l'équivalent d'un "menu clic droit"

    Pour l'instant les éléments sont complètement "morts" on ne peut ni les cliquer, ni les sélectionner... ni rien...

    Je ne sais pas trop comment faire ça... une idée ? des pistes de recherche ?
    J'ai suivit jusque là divers tuto mais j'ai pas trouvé l'information voulue.

    De mon coté j'ai essayé de bidouiller les signaux depuis glade, mais sans résultats ...

    Merci beaucoup pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    une fois n'est pas coutume je vais me répondre (du moins à une partie de la question, ça donnera la solution aux prochains chercheurs

    Donc pour associer une action à un élément, on peu déclencher le signal lors de la sélection par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW("Votre arbre")), "changed", G_CALLBACK("votre fonction"), "vos données");
    Ensuite reste à savoir comment faire une petite boite de dialogue sous forme de liste d'actions...

  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
    Attention, ne pas confondre boite de dialogue et menu contextuel (ce que tu vois sur un clic droit), ça n'a rien à voir. Ensuite je te déconseille de faire dans l'original : voir un menu contextuel s'afficher sur un clic gauche c'est franchement déroutant !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Oui tout à fait, depuis j'ai compris qu'on pouvait associé un signal au click, j'ai réussi à faire fonctionner ça en "tout en code", je me penche sur l'interfaçage avec Glade, ça fonctionne pas encore...

    Bref quoi qu'il en soit, pour l'occasion, ça n'aurait pas été gênant car les éléments n'ont qu'une fonction indicative mis à part certaines actions que l'on peut avoir sur eux...

    Merci Liberforce

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    J'ai de nouveau une question sur ce sujet.
    J'ai bien saisie les manœuvres pour afficher différents popup menu...

    Cependant je me heurte à un nouveau problème et ça fait bien trop longtemps que je cherche, donc je m'adresse à vous

    dans mon tree, j'aimerais affecté une callback à un iter (en fait le callback sera différent selon l'objet que l'on vise (toplevel ou child))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GtkTreeIter *gtknode;
     
     ....
     
    g_signal_connect(G_OBJECT(gtknode), "button-press-event", 
                           (G_CALLBACK (CB_gui_analyse_node_click), 
                            treeset);
    Cette méthode ne passe pas l'interface plante... J'ai bien l'impression que ça coince au niveau du G_OBJECT... Quand je remplace le node par le tree carrément (comme j'avais pu le faire dans un autre code qui marche) j'ai une erreur invalide instance pour l'évènement "button-press-event".

    Voila j'suis coincé depuis un moment déjà sur ce point, quelqu'un aurait une idée siouplé ?
    Merci beaucoup

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    Je crois pas qu'on puisse connecter un "button-press-event" à un iter.

    Je te conseille plutôt de le connecter au treeview (et pas au treestore), puis de récupérer l'iter avec gtk_tree_view_get_path_at_pos, et enfin de contrôler si ton iter est une racine ou pas avec gtk_tree_store_iter_depth et d'agir en conséquence.

    -

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    j'ai confondu treeview et treestore, en effet, j'avais lié au treeview dans un précédent code...
    C'est pas très intuitif tout ça. Merci pour la solution

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Citation Envoyé par monnomamoi Voir le message
    Salut,

    Je crois pas qu'on puisse connecter un "button-press-event" à un iter.

    Je te conseille plutôt de le connecter au treeview (et pas au treestore), puis de récupérer l'iter avec gtk_tree_view_get_path_at_pos, et enfin de contrôler si ton iter est une racine ou pas avec gtk_tree_store_iter_depth et d'agir en conséquence.

    -
    Cette solution ne permet pas de savoir quel type de click on a fait, et donc d'afficher un menu sur le click droit ?
    Existe t'il une solution ?

    EDIT: Finallement je m'en suis sorti, ce fût épineux, mais ça marche bien, j'ai utilisé une combinaison de tests sur la sélection d'un iter et de callback "press-button-event" sur mon tree.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    A l'inverse existe t'il un moyen de rendre un iter cliquable / non cliquable à la manière de ce que fait la fonction gtk_widget_set_sensitive ?

    En des termes plus simples... Est il possible de "griser" un iter, si oui quelle est la méthode s'il vous plait.

    Merci

  10. #10
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Dans le callback du "button-press-event", tu peux récupérer l'event associé et détecter s'il s'agit d'un simple/double clic du bouton gauche/droit/milieu.

    ---

    Pour rendre une ligne inactive, c'est assez simple : il faut d'abord ajouter une colonne à ton treestore qui contiendra un booléen correspondant à l'état de la cellule. Ensuite, pour dire à la cellule que son état est dans la colonne 3 (par exemple), tu fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_tree_view_column_add_attribute(ta_treeviewcolumn, ton_cellrenderer, 'sensitive', 3)
    (en fait faut faire comme quand tu lui donne la colonne "text" mais sauf que là c'est "sensitive" à la place)


    Désolé de ne pas donner de code d'exemple, je ne sais faire ça qu'en langage python.

    -

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Par défaut
    Ne soit pas désolé, toute aide est vraiment bienvenue.
    Je suis noyé dans la conversion du tree Gtk 1 vers Gtk 2 énormément de choses ont changé et ne se sont pas simplifiée je trouve.

    Par exemple on pouvait remplir un tree avec un widget ... add item... set widget sensitive et le tour était joué.

    Quelqu'un sait quelles sont les raisons de la complexification des gtk tree ?

    ----------------------------------------------------------------------------

    EDIT: J'ai encore un petit soucis, j'ai réussi à les griser ! Ca marche bien, j'ai comprit comment on pouvait agir sur chaque ligne désormais c'est plus clair.

    Cependant encore une petite question. Même grisée la ligne reste sélectionnable... Or pour moi si sensitive = FALSE, ça ne devrait plus être le cas... j'imagine que c'est du au fait que le Treeview est entièrement sélectionnable puisque j'ai imposé la règle GTK_SELECTION_SINGLE sur le treeview.

    Comment passer outre pour que la règle de sensibilité s'accompagne d'une impossibilité de sélection ?
    Il faut que ça reste possible pour les autres lignes cependant.


    EDIT 2:
    En fait j'ai toujours du mal a éditer simplement les propriétés d'une seule ligne... Par exemple j'appuie sur un bouton et la ligne x devient insensible...

    Merci

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