[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:
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:
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:
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 :aie: et j'obtiens ce message sur la console lorsque j'utilise le menu popup:
Code:
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.