## rb-tree-dnd

rb-tree-dnd —

## Synopsis

    #define     RB_TYPE_TREE_DRAG_DEST
    #define     RB_TREE_DRAG_DEST               (obj)
    #define     RB_IS_TREE_DRAG_DEST            (obj)
    #define     RB_TREE_DRAG_DEST_GET_IFACE     (obj)
                RbTreeDragSource;
                RbTreeDragSourceIface;
                RbTreeDragDest;
                RbTreeDragDestIface;
    enum        RbTreeDestFlag;
    gboolean    rb_tree_drag_source_row_draggable
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list);
    gboolean    rb_tree_drag_source_drag_data_delete
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list);
    gboolean    rb_tree_drag_source_drag_data_get
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list,
                                                 GtkSelectionData *selection_data);
    GType       rb_tree_drag_dest_get_type      (void);
    gboolean    rb_tree_drag_dest_drag_data_received
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest,
                                                 GtkTreeViewDropPosition pos,
                                                 GtkSelectionData *selection_data);
    gboolean    rb_tree_drag_dest_row_drop_possible
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest_path,
                                                 GtkTreeViewDropPosition pos,
                                                 GtkSelectionData *selection_data);
    gboolean    rb_tree_drag_dest_row_drop_position
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest_path,
                                                 GList *targets,
                                                 GtkTreeViewDropPosition *pos);
    void        rb_tree_dnd_add_drag_dest_support
                                                (GtkTreeView *tree_view,
                                                 RbTreeDestFlag flags,
                                                 const GtkTargetEntry *targets,
                                                 gint n_targets,
                                                 GdkDragAction actions);
    void        rb_tree_dnd_add_drag_source_support
                                                (GtkTreeView *tree_view,
                                                 GdkModifierType start_button_mask,
                                                 const GtkTargetEntry *targets,
                                                 gint n_targets,
                                                 GdkDragAction actions);

## Object Hierarchy

      GInterface
       +----RbTreeDragSource

      GInterface
       +----RbTreeDragDest

## Description

## Details

### RB_TYPE_TREE_DRAG_DEST

    #define RB_TYPE_TREE_DRAG_DEST              (rb_tree_drag_dest_get_type ())

### RB_TREE_DRAG_DEST()

    #define RB_TREE_DRAG_DEST(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), RB_TYPE_TREE_DRAG_DEST, RbTreeDragDest))

`obj` : |

### RB_IS_TREE_DRAG_DEST()

    #define RB_IS_TREE_DRAG_DEST(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RB_TYPE_TREE_DRAG_DEST))

`obj` : |

### RB_TREE_DRAG_DEST_GET_IFACE()

    #define RB_TREE_DRAG_DEST_GET_IFACE(obj)    (G_TYPE_INSTANCE_GET_INTERFACE ((obj), RB_TYPE_TREE_DRAG_DEST, RbTreeDragDestIface))

`obj` : |

### RbTreeDragSource

    typedef struct _RbTreeDragSource RbTreeDragSource;

### RbTreeDragSourceIface

    typedef struct {
    	GTypeInterface g_iface;

    	/* VTable - not signals */
    	gboolean     (* row_draggable)        (RbTreeDragSource   *drag_source,
    	                              GList              *path_list);

    	gboolean     (* drag_data_get)        (RbTreeDragSource   *drag_source,
                                             GList              *path_list,
                                             GtkSelectionData   *selection_data);

    	gboolean     (* drag_data_delete)     (RbTreeDragSource *drag_source,
                                             GList            *path_list);
    } RbTreeDragSourceIface;

### RbTreeDragDest

    typedef struct _RbTreeDragDest RbTreeDragDest;

### RbTreeDragDestIface

    typedef struct {
    	GTypeInterface g_iface;

    	/* VTable - not signals */

    	gboolean (* drag_data_received) (RbTreeDragDest   *drag_dest,
    					 GtkTreePath       *dest,
    					 GtkTreeViewDropPosition pos,
    					 GtkSelectionData  *selection_data);

    	gboolean (* row_drop_possible)  (RbTreeDragDest   *drag_dest,
    					 GtkTreePath       *dest_path,
    					 GtkTreeViewDropPosition pos,
    					 GtkSelectionData  *selection_data);

    	gboolean (* row_drop_position) (RbTreeDragDest   *drag_dest,
    					GtkTreePath       *dest_path,
    					GList *targets,
    					GtkTreeViewDropPosition *pos);

    	/* optional */
    	GdkAtom  (* get_drag_target)    (RbTreeDragDest   *drag_dest,
    					 GtkWidget        *widget,
    					 GdkDragContext   *context,
    					 GtkTreePath      *dest_path,
    					 GtkTargetList    *target_list);
    } RbTreeDragDestIface;

### enum RbTreeDestFlag

    typedef enum {
    	RB_TREE_DEST_EMPTY_VIEW_DROP = 1 << 0,
    	RB_TREE_DEST_CAN_DROP_INTO = 1 << 1,
    	RB_TREE_DEST_CAN_DROP_BETWEEN = 1 << 2,
    	RB_TREE_DEST_SELECT_ON_DRAG_TIMEOUT = 1 << 3
    } RbTreeDestFlag;

### rb_tree_drag_source_row_draggable ()

    gboolean    rb_tree_drag_source_row_draggable
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list);

Asks the EggTreeMultiDragSource whether a particular row can be used as the source of a DND operation. If the source doesn't implement this interface, the row is assumed draggable.

`drag_source` : | a EggTreeMultiDragSource
`path_list` : |
Returns : | `TRUE` if the row can be dragged

### rb_tree_drag_source_drag_data_delete ()

    gboolean    rb_tree_drag_source_drag_data_delete
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list);

Asks the EggTreeMultiDragSource to delete the row at `path`, because it was moved somewhere else via drag-and-drop. Returns `FALSE` if the deletion fails because `path` no longer exists, or for some model-specific reason. Should robustly handle a `path` no longer found in the model!

`drag_source` : | a EggTreeMultiDragSource
`path_list` : |
Returns : | `TRUE` if the row was successfully deleted

### rb_tree_drag_source_drag_data_get ()

    gboolean    rb_tree_drag_source_drag_data_get
                                                (RbTreeDragSource *drag_source,
                                                 GList *path_list,
                                                 GtkSelectionData *selection_data);

Asks the EggTreeMultiDragSource to fill in `selection_data` with a representation of the row at `path`. `selection_data->target` gives the required type of the data. Should robustly handle a `path` no longer found in the model!

`drag_source` : | a EggTreeMultiDragSource
`path_list` : |
`selection_data` : | a EggSelectionData to fill with data from the dragged row
Returns : | `TRUE` if data of the required type was provided

### rb_tree_drag_dest_get_type ()

    GType       rb_tree_drag_dest_get_type      (void);

Returns : |

### rb_tree_drag_dest_drag_data_received ()

    gboolean    rb_tree_drag_dest_drag_data_received
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest,
                                                 GtkTreeViewDropPosition pos,
                                                 GtkSelectionData *selection_data);

`drag_dest` : |
`dest` : |
`pos` : |
`selection_data` : |
Returns : |

### rb_tree_drag_dest_row_drop_possible ()

    gboolean    rb_tree_drag_dest_row_drop_possible
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest_path,
                                                 GtkTreeViewDropPosition pos,
                                                 GtkSelectionData *selection_data);

`drag_dest` : |
`dest_path` : |
`pos` : |
`selection_data` : |
Returns : |

### rb_tree_drag_dest_row_drop_position ()

    gboolean    rb_tree_drag_dest_row_drop_position
                                                (RbTreeDragDest *drag_dest,
                                                 GtkTreePath *dest_path,
                                                 GList *targets,
                                                 GtkTreeViewDropPosition *pos);

`drag_dest` : |
`dest_path` : |
`targets` : |
`pos` : |
Returns : |

### rb_tree_dnd_add_drag_dest_support ()

    void        rb_tree_dnd_add_drag_dest_support
                                                (GtkTreeView *tree_view,
                                                 RbTreeDestFlag flags,
                                                 const GtkTargetEntry *targets,
                                                 gint n_targets,
                                                 GdkDragAction actions);

`tree_view` : |
`flags` : |
`targets` : |
`n_targets` : |
`actions` : |

### rb_tree_dnd_add_drag_source_support ()

    void        rb_tree_dnd_add_drag_source_support
                                                (GtkTreeView *tree_view,
                                                 GdkModifierType start_button_mask,
                                                 const GtkTargetEntry *targets,
                                                 gint n_targets,
                                                 GdkDragAction actions);

`tree_view` : |
`start_button_mask` : |
`targets` : |
`n_targets` : |
`actions` : |