gtkmm3: select TreeView row by default

How can I select a row of a TreeView list by default, i.e. that the row is selected from the beginning?

I found `select (const TreeModel::Row& row)` in the gtkmm reference and tried it out, but it doesn't work... I've attached the code. The select() function is commented out. When the // are removed, I get a segmentation fault...

This is the crucial part of the code (ful code provided below):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   refTree1 = Gtk::ListStore::create(colTree1);
   Tree1.set_model(refTree1);

   // fill Tree1 (Artists names)
   Gtk::TreeModel::Row row = *(refTree1->append());
   row[colTree1.node] = Music;
   row[colTree1.name] = "All Artists";
//   selTree1->select(row);
   Node *node = Music->lower();
   for (int i = 0; i < Music->length(); ++i) {
      row = *(refTree1->append());
      row[colTree1.node] = node;
      row[colTree1.name] = node->name();
      node = node->next();
   }

   Tree1.append_column("Artists",colTree1.name);


The full gtkmm code (node that it isn't compilable because the main.cpp and my class files are missing):

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
43
44
45
46
47
// MainWin.h

#ifndef _MAIN_WIN_H_
#define _MAIN_WIN_H_

#include <gtkmm.h>
#include <iostream>
#include <string>

#include "Node.h"

using namespace std;

class MainWin : public Gtk::Window {
   protected:
   // signal handlers
      void on_tree1_changed (void);
      void on_tree2_changed (void);
      void on_tree3_changed (void);

      void set_tree2 (Node *Artist);
      void set_tree3 (Node *Album);

   public:
      MainWin (Playlist *Music);
      ~MainWin () {}

      Gtk::VPaned MainVPaned;
      Gtk::HBox BrowserHBox;
      Gtk::ScrolledWindow scrollTree1, scrollTree2, scrollTree3;
      Gtk::TreeView Tree1, Tree2, Tree3;
      Glib::RefPtr<Gtk::ListStore> refTree1, refTree2, refTree3;
      Glib::RefPtr<Gtk::TreeSelection> selTree1, selTree2, selTree3;

      class Columns : public Gtk::TreeModel::ColumnRecord {
         public:
            Columns () {
               add(node);
               add(name);
            }
            Gtk::TreeModelColumn<Node*> node;
            Gtk::TreeModelColumn<std::string> name;
      }; Columns colTree1, colTree2, colTree3;

};

#endif 

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// MainWin.cpp

#include "MainWin.h"

/////////////////////////////////////////////////////////////////////

MainWin::MainWin (Playlist *Music) {

   set_default_size(800,600);

   add(MainVPaned);
   MainVPaned.set_position(300);

   MainVPaned.add2(scrollTree3);
   MainVPaned.add1(BrowserHBox);

   BrowserHBox.set_spacing(5);
   BrowserHBox.add(scrollTree1);
   BrowserHBox.add(scrollTree2);

   scrollTree1.add(Tree1);
   scrollTree2.add(Tree2);
   scrollTree3.add(Tree3);

   refTree1 = Gtk::ListStore::create(colTree1);
   Tree1.set_model(refTree1);

   // fill Tree1 (Artists names)
   Gtk::TreeModel::Row row = *(refTree1->append());
   row[colTree1.node] = Music;
   row[colTree1.name] = "All Artists";
//   selTree1->select(row);
   Node *node = Music->lower();
   for (int i = 0; i < Music->length(); ++i) {
      row = *(refTree1->append());
      row[colTree1.node] = node;
      row[colTree1.name] = node->name();
      node = node->next();
   }

   Tree1.append_column("Artists",colTree1.name);

   set_tree2(NULL);
   Tree2.append_column("Albums",colTree2.name);

   set_tree3(NULL);
   Tree3.append_column("Song",colTree3.name);

   // signals
   selTree1 = Tree1.get_selection();
   selTree2 = Tree2.get_selection();
   selTree3 = Tree3.get_selection();

   selTree1->signal_changed().connect(sigc::mem_fun
      (*this,&MainWin::on_tree1_changed));
   selTree2->signal_changed().connect(sigc::mem_fun
      (*this,&MainWin::on_tree2_changed));
   selTree3->signal_changed().connect(sigc::mem_fun
      (*this,&MainWin::on_tree3_changed));

   show_all_children();
}

// signal handlers

void MainWin::on_tree1_changed (void) {
   Gtk::TreeModel::iterator iter = selTree1->get_selected();
   Gtk::TreeModel::Row row = *iter;
   if (row) set_tree2(row[colTree1.node]);
   set_tree3(NULL);
}

void MainWin::set_tree2 (Node *Artist) {
   refTree2 = Gtk::ListStore::create(colTree2);
   Tree2.set_model(refTree2);
   if (Artist) {
      Gtk::TreeModel::Row row;
      Node *node = Artist->lower();
      for (int i = 0; i < Artist->length(); ++i) {
         row = *(refTree2->append());
         row[colTree2.node] = node;
         row[colTree2.name] = node->name();
         node = node->next();
      }
   }
}

void MainWin::on_tree2_changed (void) {
   Gtk::TreeModel::iterator iter = selTree2->get_selected();
   Gtk::TreeModel::Row row = *iter;
   if (row) set_tree3(row[colTree2.node]);
}

void MainWin::set_tree3 (Node *Album) {
   refTree3 = Gtk::ListStore::create(colTree3);
   Tree3.set_model(refTree3);
   if (Album) {
      Gtk::TreeModel::Row row;
      Node *node = Album->lower();
      for (int i = 0; i < Album->length(); ++i) {
         row = *(refTree3->append());
         row[colTree3.name] = node->name();
         node = node->next();
      }
   }
}

void MainWin::on_tree3_changed (void) {

}
Last edited on
Nobody any idea? I'm 100% sure that this SOMEHOW works...

*push*
Topic archived. No new replies allowed.