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.