[gtkmm] TreeView: Row aus einem TreeStore in einen anderen kopieren



  • Hallo!
    Ich versuche gerade das im Topic genannte. Folgendes habe ich schon versucht:

    void MainWindow::add_to_playlist(const TreePath& path, TreeViewColumn* column)
    {
      TreeRow row = *mp3ListStore->get_iter(path);
      TreeRow newrow = *playListStore->append();
      newrow = row;
      cout << "adding " << row[listCols.file] << " to playlist..." << endl;
    }
    

    Das gibt aber nur leere Zeilen im Ziel-TreeView.
    Also wollte ich column für column kopieren:

    void MainWindow::add_to_playlist(const TreePath& path, TreeViewColumn* column)
    {
      TreeRow row = *mp3ListStore->get_iter(path);
      TreeRow newrow = *playListStore->append();
      newrow[listCols.artist] = row[listCols.artist];
      newrow[listCols.title] = row[listCols.title];
      newrow[listCols.file] = row[listCols.file];
      cout << "adding " << row[listCols.file] << " to playlist..." << endl;
    }
    

    Das ergibt aber die folgenden Fehler:

    cd ~/projects/juke/
    make -k
    g++ -c juke_MainWindow.cpp -o juke_MainWindow.o `pkg-config gtkmm-2.4 --cflags` `taglib-config --cflags`
    juke_MainWindow.cpp: In member function void MainWindow::add\_to_playlist(const Gtk::TreePath&, Gtk::TreeViewColumn*)': /usr/include/gtkmm-2.4/gtkmm/treeiter.h:240: error:Gtk::TreeValueProxy<ColumnType>& Gtk::TreeValueProxy<ColumnType>::operator=(const Gtk::TreeValueProxy<ColumnType>&) [with ColumnType = Glib::ustring]' is private
    juke_MainWindow.cpp:120: error: within this context
    /usr/include/gtkmm-2.4/gtkmm/treeiter.h:240: error: Gtk::TreeValueProxy<ColumnType>& Gtk::TreeValueProxy<ColumnType>::operator=(const Gtk::TreeValueProxy<ColumnType>&) [with ColumnType = Glib::ustring]' is private juke_MainWindow.cpp:121: error: within this context /usr/include/gtkmm-2.4/gtkmm/treeiter.h:240: error:Gtk::TreeValueProxy<ColumnType>& Gtk::TreeValueProxy<ColumnType>::operator=(const Gtk::TreeValueProxy<ColumnType>&) [with ColumnType = Glib::ustring]' is private
    juke_MainWindow.cpp:122: error: within this context
    make: *** [juke_MainWindow.o] Error 1
    make: Target `all' not remade because of errors.

    Wenn ich nun column für column über umwege kopiere geht es aber:

    void MainWindow::add_to_playlist(const TreePath& path, TreeViewColumn* column)
    {
      TreeRow row = *mp3ListStore->get_iter(path);
      TreeRow newrow = *playListStore->append();
      ustring temp;
      temp = row[listCols.artist];
      newrow[listCols.artist] = temp;
      temp = row[listCols.title];
      newrow[listCols.title] = temp;
      temp = row[listCols.file];
      newrow[listCols.file] = temp;
      cout << "adding " << row[listCols.file] << " to playlist..." << endl;
    }
    

    Ist das normal? Für mich sieht das ein Bisschen wie ein Bug aus.
    Gibt es vielleicht einen einfacheren Weg um ein Row aus einem TreeStore in einen anderen kopieren?
    Danke im Voraus.



  • Steht doch da was los ist. operator= ist private, sprich TreeValueProxy<>, welche die daten enthalten, dürfen nicht kopiert werden. Von daher: Ja es ist normal.

    BR

    Edit: Korrektur



  • Wo ist denn jetzt der Unterschied zwischen

    newrow[listCols.artist] = row[listCols.artist];
    

    und

    ustring temp;
    temp = row[listCols.artist];
    newrow[listCols.artist] = temp;
    

    😕

    Es ist doch egal, ob ich

    a = b;
    

    oder

    c = b; a = c;
    

    schreibe?

    Und gibt es keine einfachere Möglichkeit eine row zu kopieren? Die obige Methode ist doch ineffizient. Besonders, wenn ich ein paar mehr Colomns habe, oder gar nicht weiß, wie viele..

    Sorry, I'm new to gtkmm.

    BTW: Frohe Ostern!



  • Es ist in dem fall schon ein Unterschied ob du

    b = a;
    oder
    c = a;
    b = c;

    schreibst.

    Denn Glib::ustring kann zwar kopiert werden. Aber TreeValueProxyGlib::ustring nicht. => du musst den umständlicheren weg gehen.

    Ehrlich gesagt kenn ich auch gerade keinen anderen.

    Tut mir leid aber so etwas habe ich bisher nicht gebraucht. Du kannst ja mal an die gtkmm mailingliste schreiben. Da kann dir sicherlich geholfen werden.

    http://gtkmm.org/mailinglist.shtml

    BR


Log in to reply