GTK - treeview + drag&drop



  • Moin!

    Ich beisse mir seit gestern Abend echt die Zähne aus. In meinem Fenster ist links ein Treeview mit einem Filebrowser. Der Anwender soll nun per drag & drop Ordner in ein Treeview auf die Rechte Seite ziehen können.

    Das Treeview vom Filebrowser sieht so aus:

    dialog->treeLocal = gtk_tree_view_new ();
    		gtk_tree_view_set_enable_search (GTK_TREE_VIEW (dialog->treeLocal), FALSE);
    		gtk_drag_source_set (dialog->treeLocal, GDK_BUTTON1_MASK|GDK_BUTTON3_MASK,
    			winWizard_collection_folders_dnd_targets,
    			sizeof (winWizard_collection_folders_dnd_targets) / sizeof (GtkTargetEntry),
    			GDK_ACTION_COPY);
    		gtk_container_add (GTK_CONTAINER (scrLocal), dialog->treeLocal);
    
    		liststore = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
    
    		// first column (folder icon & folder name):
    		column = gtk_tree_view_column_new ();
    		gtk_tree_view_column_set_title (column, get_text (config.general.language,
    			"/windows/window[@name=\"wizard_collection_folders\"]/treeview[@name=\"local\"]/"
    			"column[@number=\"1\"]"));
    		gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
    
    		// renderer for pixmap (folder icon):
    		renderer = gtk_cell_renderer_pixbuf_new ();
    		gtk_tree_view_column_pack_start (column, renderer, FALSE);
    		gtk_tree_view_column_add_attribute (column, renderer, "pixbuf", 0);
    		// renderer for text (folder name):
    		renderer = gtk_cell_renderer_text_new ();
    		gtk_tree_view_column_pack_start (column, renderer, TRUE);
    		gtk_tree_view_column_add_attribute (column, renderer, "text", 1);
    
    		// add column to treeview:
    		gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->treeLocal), column);
    
    		// second column (absolute path):
    		column = gtk_tree_view_column_new ();
    		gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
     		gtk_tree_view_column_set_visible (column, FALSE);
    
    		// renderer for text (absolute path):
    		renderer = gtk_cell_renderer_text_new ();
    		gtk_tree_view_column_pack_start (column, renderer, TRUE);
    		gtk_tree_view_column_add_attribute (column, renderer, "text", 2);
    
    		// add column to treeview:
    		gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->treeLocal), column);
    
    		gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeLocal),
    			GTK_TREE_MODEL (liststore));
    
    		gtk_tree_sortable_set_sort_column_id
    			(GTK_TREE_SORTABLE (liststore), 1, GTK_SORT_ASCENDING);
    

    Das hier ist das Treeview, in welches die Ordner gezogen werden sollen:

    dialog->treeFolders = gtk_tree_view_new ();
    		gtk_tree_view_set_enable_search (GTK_TREE_VIEW (dialog->treeFolders), FALSE);
    		gtk_drag_dest_set (dialog->treeFolders, GTK_DEST_DEFAULT_ALL,
    			winWizard_collection_folders_dnd_targets,
    			sizeof (winWizard_collection_folders_dnd_targets) / sizeof (GtkTargetEntry),
    			GDK_ACTION_COPY);
    		gtk_container_add (GTK_CONTAINER (scrFolders), dialog->treeFolders);
    
    		liststore = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
    
    		// first column (folder icon & folder name):
    		column = gtk_tree_view_column_new ();
    		gtk_tree_view_column_set_title (column, get_text (config.general.language,
    			"/windows/window[@name=\"wizard_collection_folders\"]/treeview[@name=\"folders\"]/"
    			"column[@number=\"1\"]"));
    
    		// renderer for pixmap (folder icon):
    		renderer = gtk_cell_renderer_pixbuf_new ();
    		gtk_tree_view_column_pack_start (column, renderer, FALSE);
    		gtk_tree_view_column_add_attribute (column, renderer, "pixbuf", 0);
    		// renderer for text (folder name):
    		renderer = gtk_cell_renderer_text_new ();
    		gtk_tree_view_column_pack_start (column, renderer, TRUE);
    		gtk_tree_view_column_add_attribute (column, renderer, "text", 1);
    
    		// add column to treeview:
    		gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->treeFolders), column);
    
    		gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->treeFolders),
    			GTK_TREE_MODEL (liststore));
    
    		gtk_tree_sortable_set_sort_column_id
    			(GTK_TREE_SORTABLE (liststore), 1, GTK_SORT_ASCENDING);
    

    Da ich nicht so wirklich mit dem GtkTargetEntry klar komme, sieht der zur Zeit so aus:

    static const GtkTargetEntry winWizard_collection_folders_dnd_targets[] = {
    	 {"text/plain", 0, 2}
    };
    

    Das Ziehen in das zweite Treeview scheint an sich zu funktionieren, nur wird das Signal "drag_data_received" nicht ausgelöst. Hat vielleicht jemand 'nen Tipp, woran das liegen könnte?

    Mfg, Lord Kefir



  • Morgen,

    hm, mit D'n'D hab ich bisher auch noch nichts gemacht, probieren wir das mal aus...
    das Beispiel kennt du schätzungsweise?!
    Okay, jedenfalls seh ich bei dir nirgends, dass du die drag_data_get und drag_data_received Signale überschreibst 😕
    Außerdem glaube ich, dass die Art, wie du GtkTarget "benutzt", nicht funkioniert. Wieso machst du nicht einfach ne std::listGtk::TargetEntry, die die Informationen enthält (analog wie in dem Beispiel)?

    MfG

    GPC



  • Danke für die Antwort. Das Problem hat sich erledigt. Nachdem ich gestern noch ein wenig weiter gegoogelt habe, wurde ich eines brauchbaren Tutorials fündig. Mensch, DND ist echt nicht so doll dokumentiert...

    Mfg, Lord Kefir



  • Lord Kefir schrieb:

    Danke für die Antwort. Das Problem hat sich erledigt. Nachdem ich gestern noch ein wenig weiter gegoogelt habe, wurde ich eines brauchbaren Tutorials fündig.

    Bitte posten, damit andere auch was davon haben.

    Mensch, DND ist echt nicht so doll dokumentiert...

    Vieles, was über "Und so fügt man einen Gtk::Button zur ner Gtk::HBox hinzu" rausgeht, ist nicht üppig dokumentiert 😞


Anmelden zum Antworten