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
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 #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.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 #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
La tentative de modification du booléen dans la fonction on_popup_load échoue lamentablement
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; }et j'obtiens ce message sur la console lorsque j'utilise le menu popup:
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?
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
Merci d'avance.
Partager