gtkmm3: select TreeView row by default
Dec 23, 2011 at 12:35am UTC
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 Dec 23, 2011 at 12:46am UTC
Dec 29, 2011 at 5:58pm UTC
Nobody any idea? I'm 100% sure that this SOMEHOW works...
*push*
Topic archived. No new replies allowed.