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+ Discussion :

[gtkmm] Modifier une valeur dans un TreeModelFilter


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut [gtkmm] Modifier une valeur dans un TreeModelFilter
    Salut à tous,

    je me suis mis il y a peu à Gtkmm pour un projet perso' qui devrait m'occuper une bonne partie de l'été. Je cherche à manipuler une liste de fichiers au travers d'un TreeModelFilter. En particulier, je souhaite pouvoir charger ou non certains de ces fichiers via un menu popup. Pour mémoriser si un fichier a été chargé ou non, j'utilise une colonne non-affichée contenant un booléen que je veux pouvoir mettre à jour au moment où je charge le fichier. Voici un code afin d'illustrer ce que j'essaie de faire:

    main.cpp
    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
    #include "Ftv.h"
    #include <gtkmm.h>
     
    int main(int argc, char ** argv)
    {
      Gtk::Main kit(argc, argv);
     
      Gtk::Window win;
      Ftv ftv;
      win.add(ftv);
      win.show_all_children();
     
      Gtk::Main::run(win);
     
      return 0;
    }
    Ftv.h
    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
    #ifndef HEADER_FTV
    #define HEADER_FTV
     
    #include <gtkmm.h>
     
    class Ftv : public Gtk::TreeView
    {
      public:
        Ftv();
      protected:
        virtual bool on_button_press_event(GdkEventButton *); // Override
        virtual void on_popup_load();
     
        class ModelColumn : public Gtk::TreeModel::ColumnRecord
        {
          public:
            ModelColumn() {add(m_col0); add(m_col1);}
     
            Gtk::TreeModelColumn<bool> m_col0; // Colonne invisible
            Gtk::TreeModelColumn<Glib::ustring> m_col1; // Colonne visible
        };
     
        ModelColumn                        m_column;
        Glib::RefPtr<Gtk::ListStore>       m_refListStore;
        Glib::RefPtr<Gtk::TreeModelFilter> m_refTreeModelFilter;
        Gtk::Menu m_popup;
    };
     
    #endif
    Ftv.cpp
    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
    #include "Ftv.h"
    #include <iostream>
     
    Ftv::Ftv()
    {
      // Création du modèle
      m_refListStore = Gtk::ListStore::create(m_column);
      m_refTreeModelFilter = Gtk::TreeModelFilter::create(m_refListStore);
      set_model(m_refTreeModelFilter);
     
      // Ajout de la colonne visible
      append_column("Col 1", m_column.m_col1);
     
      // Création du menu popup
      Gtk::Menu::MenuList & menulist = m_popup.items();
      menulist.push_back(Gtk::Menu_Helpers::MenuElem("Load",
            sigc::mem_fun(*this, &Ftv::on_popup_load)));
     
      // Ajout d'un élément de test dans le TreeView
      Gtk::TreeModel::Row row = *(m_refListStore->append());
      row[m_column.m_col0] = false;
      row[m_column.m_col1] = "Texte";
    }
     
    // Re-définition pour afficher le popup en cas de clic droit
    bool Ftv::on_button_press_event(GdkEventButton * e)
    {
      bool out = TreeView::on_button_press_event(e);
      if ((e->type == GDK_BUTTON_PRESS) && (e->button == 3))
        m_popup.popup(e->button, e->time);
      return out;
    }
     
    // Fonction supposée faire changer le booléen
    void Ftv::on_popup_load()
    {
      Glib::RefPtr<Gtk::TreeView::Selection> refSel = get_selection();
      Gtk::TreeModel::iterator iter = refSel->get_selected();
      std::cout << "Avant: " << (*iter)[m_column.m_col0] << std::endl;
      (*iter)[m_column.m_col0] = true; // Ne fonctionne pas...
      std::cout << "Après: " << (*iter)[m_column.m_col0] << std::endl;
    }
    La tentative de modification du booléen dans la fonction on_popup_load échoue lamentablement et j'obtiens ce message sur la console lorsque j'utilise le menu popup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # ./a.out 
    Avant: 0
     
    (a.out:25458): gtkmm-WARNING **: Attempt to set a value of a row in a TreeModelFilter instead of in the child model.
    Après: 0
    La documentation de gtkmm est assez sommaire sur les TreeModelFilter et manque un peu d'exemple. Vu le warning de gtkmm, il semble que mon problème soit lié à la fonction set_value_impl qui doit être re-définie mais je ne comprends pas vraiment comment. Est-ce que quelqu'un pourrait m'expliquer (ou me donner une piste) la marche à suivre pour modifier une cellule donnée dans une ligne d'un TreeModelFilter?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut
    J'ai fini par trouver une réponse à mon problème... Il faut convertir l'iterateur sélectionné en utilisant la fonction convert_iter_to_child_iter et ça marche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modifier une valeur dans des variables
    Par bombjack91 dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/06/2007, 08h14
  2. Modifier une valeur dans un fichier xml
    Par arthrax dans le forum VBScript
    Réponses: 3
    Dernier message: 03/04/2007, 09h46
  3. Modifier une valeur dans un fichier sans passer par l'éditeur
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 09/06/2006, 00h15
  4. modifier une valeur dans une hash
    Par chaabane dans le forum Langage
    Réponses: 1
    Dernier message: 17/03/2006, 10h59
  5. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 10h45

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