Gtkmm Treeview Multiselect



  • Hallo,

    ich fummel jetzt schon eine Weile mit dem Treeview von Gtkmm rum aber kriege es einfach nicht hin. Das Tutorial Part5 im Artikel Subforum habe ich schon gelesen und auch die Dokumentation hilft mir nicht weiter.

    Über eine Funktion lade ich den Inhalt eines Ordners in mein Treeview. Dort soll dann die Auswahl stattfinden, welche Dateien installiert werden sollen. Hat der Benutzer die Dateien ausgewählt, wird durch betätigen eines Buttons diese Funktion aufgerufen:

    void main_window::on_install() {
    	Glib::RefPtr<Gtk::TreeView::Selection> selection = treeView.get_selection();
    	selection->set_mode(Gtk::SELECTION_MULTIPLE);
    	selection->selected_foreach_iter(sigc::mem_fun(*this, &main_window::install_selected));
    }
    

    Nun sollte doch eigentlich für jede ausgewählte Reihe diese Funktion hier aufgerufen werden oder? Ich bekomme aber nur das zuletzt aktivierte Element ausgegeben..

    void main_window::install_selected(const Gtk::TreeModel::iterator &iter) {
    	Gtk::TreeModel::Row selectedRow = *iter;
    	std::cout << selectedRow[cols.col_name] << std::endl;
    }
    

    Kann mir jemand helfen?



  • keiner einen tip?



  • ich habe es leider immer noch nicht geschafft mehrere einträge aus dem treeview auszuwählen. hat keiner eine idee woran es liegen könnte? oder braucht ihr mehr code?



  • Kannst du mir einen möglichst kompakten, aber kompilierbaren Code zur Verfügung stellen? Dann schau ich's mir mal durch 😉



  • kompakt wird schwierig. ich könnte dir die kompletten sourcen schicken und die relevanten stellen im code hervorheben. das ganze wäre dann mit dem visual studio 2008 unter windows kompilierbar. ist halt die frage ob du gtkmm für windows installiert hast.



  • Ich hab gtkmm unter Linux installiert 😉 Was du machen könntest, ist aus den relevanten Stellen ein lauffähiges Beispiel zusammenzustellen, so dass ich mir nicht den ganzen Source anschauen muss.



  • Diese Antwort kommt reichlich spät, aber vielleicht hilft Sie Dir trotzdem noch oder, einem anderen nach Hilfe Suchenden.
    Für eine ähnliche Anforderung habe ich einen Vektor verwendet. Ich poste mal die ganze Funktion.

    Aus der Klassendeklaration:

    Glib::RefPtr<Gtk::TreeSelection>		ref_TreeSelection_SourceFile;
    

    Die Methode:

    // Move Selected Source Files Up
    void treeview_merge_sourcefile::moveSourceFileUp(){
    
    	std::vector<Gtk::TreePath>	list_selection	= ref_TreeSelection_SourceFile->get_selected_rows();
    
    	if( list_selection.size() > 0 ){
    
    		Gtk::TreeModel::iterator	iter_selection	= ref_ListStore_SourceFile->get_iter( list_selection.front() );
    		Gtk::TreeModel::iterator	iter_upper;
    
    		Gtk::TreeModel::Children	children		= ref_ListStore_SourceFile->children();
    
    		// Move any Row only if the first selected Row is not the first Row at the ListStore
    		if( iter_selection != children.begin() ){
    
    			while( list_selection.size() > 0 ){
    
    				iter_selection	= ref_ListStore_SourceFile->get_iter( list_selection.front() );
    
    				iter_upper = iter_selection;
    				ref_ListStore_SourceFile->iter_swap( iter_selection, --iter_upper );
    
    				list_selection.erase( list_selection.begin() );
    			}
    		}
    	}
    
    	return;
    }
    

    Den Hinweis auf std::vector<> habe ich mit Google Code Search im Projekt Inkscape gefunden. Das obige Beispiel ist von mir ~(wie man am Schrumpelcode sieht 😃 )~.

    Hoffentlich konnte ich helfen.
    Grüße.


Anmelden zum Antworten