Re: drag-data-received signal not being emitted



Chris Morrison wrote:
On Wed, 2007-06-27 at 10:43 +0100, Dave Howorth wrote:
I wrote:
In particular, I believe you will also need to call
gtk_tree_view_enable_model_drag_dest and/or
gtk_tree_view_enable_model_drag_dest on the tree_view.
Oops. Second one should be gtk_tree_view_enable_model_drag_source of course.

I tried using gtk_tree_view_enable_model_drag_dest() on my tree view and
it caused some really strange stuff to happen:

Odd, I've just had a good experience with it. I looked at the code that
implements gtk_tree_view_set_reorderable and saw that it calls the two
functions I mentioned. So it's a layered API but that's helpfully not
mentioned in the doc. Anyway, once I realized that, it was obvious that
I needed to replace my call to set_reorderable with my calls to
enable_model_drag_dest and enable_model_drag_source, rather than call
them in addition to it. It was also obvious that I needed to make sure
that I used the same arguments that it did so that the whole built-in
drag'n'drop mechanism kept working. Except I needed to change the one
argument that I wanted different behaviour for.

Now I can drag nodes from one view of the tree and drop them on another
view. Eliminates dragging/scrolling across thousands of nodes.

I'm using the Perl bindings, so my actual working code looks like this:

    # The target entry must match that used by
    # gtk_tree_view_set_reorderable in order for the built-in
    # drag'n'drop support to keep working
    # Except I use 'same-app' instead of 'same-widget'
    #
    my $target_entry = {
        target  => 'GTK_TREE_MODEL_ROW',
        flags   => ['same-app'],# Gtk2::TargetFlags
        info    => 0,
        };

# Alternatively:
#    my $target_entry = [ 'GTK_TREE_MODEL_ROW', 'same-app', 0 ];

    $tree_view->enable_model_drag_dest(
                        ['move'],
                        $target_entry,
                );

    $tree_view->enable_model_drag_source(
                        'button1-mask', # $start_button_mask,
                        ['move'],
                        $target_entry,
                );

I got a segmentation fault when ever I tried to access the GList of
targets in drag_context->targets in my drag_drop handler.

If I returned FALSE from my drag_drop handler (i.e. to indicate the drop
was not over a valid area of the widget) the drag-data-received signal
was emitted but then I got a GTK critical assertion failed error.

I think I might give up on the GtkTreeView and use a GtkIconView widget
instead.

Not an option for me, since I'm playing with trees. I'd have to abandon
gtk altogether and move to another widget set, and probably language.
Swing, anybody? :)

Cheers, Dave



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]