r1012@localhost: muntyan | 2005-11-25 16:43:13 -0600

Continuing working on drop destination support
This commit is contained in:
Yevgen Muntyan 2005-11-26 04:43:38 +00:00
parent 827f25e224
commit 3ca3dcf643
6 changed files with 519 additions and 88 deletions

View File

@ -50,7 +50,6 @@ typedef struct {
typedef struct {
MooFileView base;
MooEditWindow *window;
GtkWidget *button;
guint open_pane_timeout;
} MooFileSelector;
@ -93,23 +92,23 @@ static GObject *moo_file_selector_constructor (GType type,
guint n_props,
GObjectConstructParam *props);
static gboolean moo_file_selector_chdir (MooFileView *fileview,
const char *dir,
GError **error);
static void moo_file_selector_activate (MooFileView *fileview,
const char *path);
static gboolean moo_file_selector_chdir (MooFileView *fileview,
const char *dir,
GError **error);
static void moo_file_selector_activate (MooFileView *fileview,
const char *path);
static void button_drag_leave (GtkWidget *button,
GdkDragContext *context,
guint time,
MooFileSelector *filesel);
static gboolean button_drag_motion (GtkWidget *button,
GdkDragContext *context,
int x,
int y,
guint time,
MooFileSelector *filesel);
static void button_drag_leave (GtkWidget *button,
GdkDragContext *context,
guint time,
MooFileSelector *filesel);
static gboolean button_drag_motion (GtkWidget *button,
GdkDragContext *context,
int x,
int y,
guint time,
MooFileSelector *filesel);
static void

View File

@ -62,6 +62,10 @@ static GtkTargetEntry source_targets[] = {
{(char*) "text/uri-list", 0, 0}
};
static GtkTargetEntry dest_targets[] = {
{(char*) "text/uri-list", 0, 0}
};
typedef struct _History History;
typedef struct _Typeahead Typeahead;
@ -255,8 +259,47 @@ static void icon_drag_data_get (MooFileView *fileview,
guint info,
guint time,
MooIconView *iconview);
static void icon_drag_end (MooFileView *fileview,
GdkDragContext *context,
MooIconView *iconview);
static void icon_drag_data_received (MooFileView *fileview,
GdkDragContext *context,
int x,
int y,
GtkSelectionData *data,
guint info,
guint time,
MooIconView *iconview);
static gboolean icon_drag_drop (MooFileView *fileview,
GdkDragContext *context,
int x,
int y,
guint time,
MooIconView *iconview);
static void icon_drag_leave (MooFileView *fileview,
GdkDragContext *context,
guint time,
MooIconView *iconview);
static gboolean icon_drag_motion (MooIconView *iconview,
GdkDragContext *context,
int x,
int y,
guint time,
MooFileView *fileview);
static gboolean moo_file_view_drop (MooFileView *fileview,
const char *path,
GtkWidget *widget,
GdkDragContext *context,
guint time);
static gboolean moo_file_view_drop_data_received
(MooFileView *fileview,
const char *path,
GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *data,
guint info,
guint time);
/* MOO_TYPE_FILE_VIEW */
@ -294,6 +337,8 @@ enum {
PROPERTIES_DIALOG,
DELETE_SELECTED,
CREATE_FOLDER,
DROP,
DROP_DATA_RECEIVED,
LAST_SIGNAL
};
@ -312,6 +357,8 @@ static void moo_file_view_class_init (MooFileViewClass *klass)
widget_class->popup_menu = moo_file_view_popup_menu;
klass->chdir = moo_file_view_chdir_real;
klass->drop = moo_file_view_drop;
klass->drop_data_received = moo_file_view_drop_data_received;
g_object_class_install_property (gobject_class,
PROP_HAS_SELECTION,
@ -537,6 +584,34 @@ static void moo_file_view_class_init (MooFileViewClass *klass)
_moo_marshal_VOID__VOID,
G_TYPE_NONE, 0);
signals[DROP] =
g_signal_new ("drop",
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (MooFileViewClass, drop),
g_signal_accumulator_true_handled, NULL,
_moo_marshal_BOOLEAN__STRING_OBJECT_OBJECT_UINT,
G_TYPE_BOOLEAN, 4,
G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
GTK_TYPE_WIDGET,
GDK_TYPE_DRAG_CONTEXT,
G_TYPE_UINT);
signals[DROP_DATA_RECEIVED] =
g_signal_new ("drop-data-received",
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (MooFileViewClass, drop_data_received),
g_signal_accumulator_true_handled, NULL,
_moo_marshal_BOOLEAN__STRING_OBJECT_OBJECT_POINTER_UINT_UINT,
G_TYPE_BOOLEAN, 6,
G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
GTK_TYPE_WIDGET,
GDK_TYPE_DRAG_CONTEXT,
G_TYPE_POINTER,
G_TYPE_UINT,
G_TYPE_UINT);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set,
@ -1257,14 +1332,31 @@ create_iconview (MooFileView *fileview)
source_targets,
G_N_ELEMENTS (source_targets),
GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
moo_icon_view_enable_drag_dest (MOO_ICON_VIEW (iconview),
dest_targets,
G_N_ELEMENTS (dest_targets),
GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
g_signal_connect_swapped (iconview, "drag-begin",
G_CALLBACK (icon_drag_begin),
fileview);
g_signal_connect_swapped (iconview, "drag-data-get",
G_CALLBACK (icon_drag_data_get),
fileview);
// targets = moo_icon_view_get_source_targets (MOO_ICON_VIEW (iconview));
g_signal_connect_swapped (iconview, "drag-end",
G_CALLBACK (icon_drag_end),
fileview);
g_signal_connect_swapped (iconview, "drag-data-received",
G_CALLBACK (icon_drag_data_received),
fileview);
g_signal_connect_swapped (iconview, "drag-drop",
G_CALLBACK (icon_drag_drop),
fileview);
g_signal_connect_swapped (iconview, "drag-leave",
G_CALLBACK (icon_drag_leave),
fileview);
g_signal_connect_after (iconview, "drag-motion",
G_CALLBACK (icon_drag_motion),
fileview);
return iconview;
}
@ -2091,6 +2183,23 @@ static void fileview_set_use_filter (MooFileView *fileview,
/* File manager functionality
*/
/* path in the filter model; result must be unrefed */
static MooFile *
file_view_get_file_at_path (MooFileView *fileview,
GtkTreePath *path)
{
GtkTreeIter iter;
MooFile *file = NULL;
g_return_val_if_fail (path != NULL, NULL);
gtk_tree_model_get_iter (fileview->priv->filter_model, &iter, path);
gtk_tree_model_get (fileview->priv->filter_model, &iter, COLUMN_FILE, &file, -1);
return file;
}
/* returned files must be unrefed and list freed */
static GList *file_view_get_selected_files (MooFileView *fileview)
{
@ -3914,12 +4023,12 @@ static gboolean typeahead_find_match_hidden (MooFileView *fileview,
/***************************************************************************/
/* Drag'n'drop
/* Drag source
*/
static void
icon_drag_begin (MooFileView *fileview,
GdkDragContext *context,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED MooIconView *iconview)
{
GList *files, *l;
@ -3942,8 +4051,10 @@ icon_drag_begin (MooFileView *fileview,
uris[i] = moo_folder_get_file_uri (folder, file);
}
g_object_set_data_full (G_OBJECT (context), "moo-file-view-source-files",
g_object_set_data_full (G_OBJECT (fileview), "moo-file-view-source-uris",
uris, (GDestroyNotify) g_strfreev);
g_object_set_data_full (G_OBJECT (fileview), "moo-file-view-source-dir",
g_object_ref (folder), g_object_unref);
g_list_foreach (files, (GFunc) moo_file_unref, NULL);
g_list_free (files);
@ -3951,8 +4062,8 @@ icon_drag_begin (MooFileView *fileview,
static void
icon_drag_data_get (G_GNUC_UNUSED MooFileView *fileview,
GdkDragContext *context,
icon_drag_data_get (MooFileView *fileview,
G_GNUC_UNUSED GdkDragContext *context,
GtkSelectionData *data,
G_GNUC_UNUSED guint info,
G_GNUC_UNUSED guint time,
@ -3960,8 +4071,197 @@ icon_drag_data_get (G_GNUC_UNUSED MooFileView *fileview,
{
char **uris;
uris = g_object_get_data (G_OBJECT (context), "moo-file-view-source-files");
uris = g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-uris");
g_return_if_fail (uris && *uris);
gtk_selection_data_set_uris (data, uris);
}
static void
icon_drag_end (MooFileView *fileview,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED MooIconView *iconview)
{
g_object_set_data (G_OBJECT (fileview), "moo-file-view-source-uris", NULL);
g_object_set_data (G_OBJECT (fileview), "moo-file-view-source-dir", NULL);
}
/***************************************************************************/
/* Drag destination
*/
static void
icon_drag_data_received (MooFileView *fileview,
GdkDragContext *context,
int x,
int y,
GtkSelectionData *data,
guint info,
guint time,
MooIconView *iconview)
{
gboolean dummy;
char *dir = NULL;
GtkTreePath *path = NULL;
MooFolder *current_dir;
current_dir = fileview->priv->current_dir;
if (!current_dir)
{
g_critical ("%s: oops", G_STRLOC);
gtk_drag_finish (context, FALSE, FALSE, time);
return;
}
if (moo_icon_view_get_path_at_pos (iconview, x, y, &path, NULL, NULL, NULL))
{
MooFile *file = file_view_get_file_at_path (fileview, path);
if (MOO_FILE_IS_DIR (file))
dir = moo_folder_get_file_path (current_dir, file);
moo_file_unref (file);
}
if (!dir)
dir = g_strdup (moo_folder_get_path (current_dir));
g_signal_emit (fileview, signals[DROP_DATA_RECEIVED], 0,
dir, iconview, context, data, info, time, &dummy);
gtk_tree_path_free (path);
g_free (dir);
}
static gboolean
icon_drag_drop (MooFileView *fileview,
GdkDragContext *context,
int x,
int y,
guint time,
MooIconView *iconview)
{
gboolean dummy;
char *dir = NULL;
GtkTreePath *path = NULL;
MooFolder *current_dir;
current_dir = fileview->priv->current_dir;
if (!current_dir)
{
g_critical ("%s: oops", G_STRLOC);
gtk_drag_finish (context, FALSE, FALSE, time);
return FALSE;
}
if (moo_icon_view_get_path_at_pos (iconview, x, y, &path, NULL, NULL, NULL))
{
MooFile *file = file_view_get_file_at_path (fileview, path);
if (MOO_FILE_IS_DIR (file))
dir = moo_folder_get_file_path (current_dir, file);
moo_file_unref (file);
}
if (!dir)
dir = g_strdup (moo_folder_get_path (current_dir));
g_signal_emit (fileview, signals[DROP], 0, dir, iconview, context, time, &dummy);
moo_icon_view_set_drag_dest_row (iconview, NULL);
gtk_tree_path_free (path);
g_free (dir);
return TRUE;
}
static gboolean
moo_file_view_drop (G_GNUC_UNUSED MooFileView *fileview,
G_GNUC_UNUSED const char *path,
GtkWidget *widget,
GdkDragContext *context,
guint time)
{
gtk_drag_get_data (widget, context,
gdk_atom_intern ("text/uri-list", FALSE),
time);
return TRUE;
}
static gboolean
moo_file_view_drop_data_received (MooFileView *fileview,
const char *path,
GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *data,
guint info,
guint time)
{
g_print ("got uris dropped to %s!!!\n", path);
gtk_drag_finish (context, FALSE, FALSE, time);
return TRUE;
}
static void
icon_drag_leave (G_GNUC_UNUSED MooFileView *fileview,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED guint time,
MooIconView *iconview)
{
moo_icon_view_set_drag_dest_row (iconview, NULL);
}
static gboolean
icon_drag_motion (MooIconView *iconview,
GdkDragContext *context,
int x,
int y,
guint time,
MooFileView *fileview)
{
MooFolder *source_dir;
MooFolder *current_dir;
GtkTreePath *path = NULL;
gboolean drag_to_current_dir = TRUE;
current_dir = fileview->priv->current_dir;
source_dir = g_object_get_data (G_OBJECT (fileview), "moo-file-view-source-dir");
if (!current_dir)
goto out;
if (moo_icon_view_get_path_at_pos (iconview, x, y, &path, NULL, NULL, NULL))
{
MooFile *file = file_view_get_file_at_path (fileview, path);
if (MOO_FILE_IS_DIR (file))
drag_to_current_dir = FALSE;
moo_file_unref (file);
}
if (drag_to_current_dir)
moo_icon_view_set_drag_dest_row (iconview, NULL);
else
moo_icon_view_set_drag_dest_row (iconview, path);
if (!drag_to_current_dir || source_dir != current_dir)
gdk_drag_status (context, context->suggested_action, time);
else
gdk_drag_status (context, 0, time);
out:
if (path)
gtk_tree_path_free (path);
return TRUE;
}

View File

@ -41,8 +41,8 @@ typedef struct _MooFileViewClass MooFileViewClass;
struct _MooFileView
{
GtkVBox vbox;
GtkWidget *toolbar;
GtkVBox vbox;
GtkWidget *toolbar;
MooFileViewPrivate *priv;
};
@ -50,17 +50,27 @@ struct _MooFileViewClass
{
GtkVBoxClass vbox_class;
/* methods */
gboolean (*chdir) (MooFileView *fileview,
const char *dir,
GError **error);
/* signals */
void (*populate_popup) (MooFileView *fileview,
GList *selected,
GtkMenu *menu);
void (*activate) (MooFileView *fileview,
const char *path);
gboolean (*drop) (MooFileView *fileview,
const char *path,
GtkWidget *widget,
GdkDragContext *context,
guint time);
gboolean (*drop_data_received) (MooFileView *fileview,
const char *path,
GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *data,
guint info,
guint time);
};

View File

@ -68,6 +68,9 @@ struct _DndInfo {
GtkTargetList *source_targets;
GdkDragAction source_actions;
guint scroll_timeout;
guint drag_dest_inside : 1;
guint source_enabled : 1;
guint dest_enabled : 1;
};
@ -90,6 +93,7 @@ struct _MooIconViewPrivate {
Layout *layout;
Selection *selection;
GtkTreeRowReference *cursor;
GtkTreeRowReference *drop_dest;
gboolean mapped;
@ -155,6 +159,7 @@ static gboolean moo_icon_view_drag_motion (GtkWidget *widget,
int x,
int y,
guint time);
static void drag_scroll_stop (MooIconView *view);
static void row_changed (GtkTreeModel *model,
GtkTreePath *path,
@ -262,10 +267,10 @@ static void moo_icon_view_class_init (MooIconViewClass *klass)
widget_class->motion_notify_event = moo_icon_view_motion_notify;
widget_class->drag_begin = moo_icon_view_drag_begin;
widget_class->drag_end = moo_icon_view_drag_end;
// widget_class->drag_data_received = moo_icon_drag_data_received;
// widget_class->drag_drop = moo_icon_view_drag_drop;
// widget_class->drag_leave = moo_icon_view_drag_leave;
// widget_class->drag_motion = moo_icon_view_drag_motion;
widget_class->drag_data_received = moo_icon_drag_data_received;
widget_class->drag_drop = moo_icon_view_drag_drop;
widget_class->drag_leave = moo_icon_view_drag_leave;
widget_class->drag_motion = moo_icon_view_drag_motion;
klass->set_scroll_adjustments = moo_icon_view_set_scroll_adjustments;
@ -448,8 +453,6 @@ static void moo_icon_view_init (MooIconView *view)
view->priv = g_new0 (MooIconViewPrivate, 1);
view->priv->model = NULL;
view->priv->pixbuf.cell = gtk_cell_renderer_pixbuf_new ();
gtk_object_sink (g_object_ref (view->priv->pixbuf.cell));
view->priv->pixbuf.attributes = NULL;
@ -476,7 +479,6 @@ static void moo_icon_view_init (MooIconView *view)
init_layout (view);
init_selection (view);
view->priv->cursor = NULL;
view->priv->dnd_info = g_new0 (DndInfo, 1);
}
@ -506,6 +508,7 @@ static void moo_icon_view_finalize (GObject *object)
free_selection (view);
gtk_tree_row_reference_free (view->priv->cursor);
gtk_tree_row_reference_free (view->priv->scroll_to);
gtk_tree_row_reference_free (view->priv->drop_dest);
if (view->priv->dnd_info->source_targets)
gtk_target_list_unref (view->priv->dnd_info->source_targets);
@ -634,9 +637,12 @@ void moo_icon_view_set_model (MooIconView *view,
selection_clear (view);
if (view->priv->cursor)
gtk_tree_row_reference_free (view->priv->cursor);
gtk_tree_row_reference_free (view->priv->cursor);
gtk_tree_row_reference_free (view->priv->drop_dest);
gtk_tree_row_reference_free (view->priv->scroll_to);
view->priv->cursor = NULL;
view->priv->drop_dest = NULL;
view->priv->scroll_to = NULL;
}
if (model)
@ -1057,19 +1063,24 @@ static void draw_entry (MooIconView *view,
GtkWidget *widget = GTK_WIDGET (view);
GdkRectangle cell_area = *entry_rect;
GtkCellRendererState state = 0;
GtkTreePath *cursor_path;
gboolean selected, cursor;
GtkTreePath *cursor_path, *drop_path;
gboolean selected, cursor, drop;
selected = moo_icon_view_path_is_selected (view, path);
cursor_path = moo_icon_view_get_cursor (view);
cursor = (cursor_path != NULL && !gtk_tree_path_compare (cursor_path, path));
cursor = cursor_path != NULL && !gtk_tree_path_compare (cursor_path, path);
gtk_tree_path_free (cursor_path);
if (selected)
drop_path = moo_icon_view_get_drop_dest_row (view);
drop = drop_path != NULL && !gtk_tree_path_compare (drop_path, path);
gtk_tree_path_free (drop_path);
if (selected || drop)
{
GdkGC *selection_gc;
if (GTK_WIDGET_HAS_FOCUS (widget))
if (GTK_WIDGET_HAS_FOCUS (widget) || drop)
{
selection_gc = widget->style->base_gc [GTK_STATE_SELECTED];
state = GTK_CELL_RENDERER_SELECTED | GTK_CELL_RENDERER_FOCUSED;
@ -1122,7 +1133,7 @@ static void draw_entry (MooIconView *view,
state);
}
if (cursor)
if (cursor || drop)
{
gtk_paint_focus (widget->style,
widget->window,
@ -1461,6 +1472,7 @@ static void row_changed (G_GNUC_UNUSED GtkTreeModel *model,
if (gtk_tree_path_get_depth (path) != 1)
return;
drag_scroll_stop (view);
moo_icon_view_invalidate_layout (view);
}
@ -1479,6 +1491,7 @@ static void row_deleted (G_GNUC_UNUSED GtkTreeModel *model,
!GTK_WIDGET_MAPPED (view))
return;
drag_scroll_stop (view);
moo_icon_view_invalidate_layout (view);
}
@ -1495,6 +1508,7 @@ static void row_inserted (G_GNUC_UNUSED GtkTreeModel *model,
if (gtk_tree_path_get_depth (path) != 1)
return;
drag_scroll_stop (view);
moo_icon_view_invalidate_layout (view);
}
@ -1512,6 +1526,7 @@ static void rows_reordered (G_GNUC_UNUSED GtkTreeModel *model,
if (gtk_tree_path_get_depth (path) != 0)
return;
drag_scroll_stop (view);
moo_icon_view_invalidate_layout (view);
}
@ -1687,6 +1702,7 @@ moo_icon_view_motion_notify (GtkWidget *widget,
GdkEventMotion *event)
{
MooIconView *view = MOO_ICON_VIEW (widget);
drag_scroll_stop (view);
return moo_icon_view_maybe_drag (view, event);
}
@ -2357,15 +2373,15 @@ moo_icon_view_set_selection_mode (MooIconView *view,
if (!view->priv->model || model_empty (view->priv->model))
return;
if (mode == GTK_SELECTION_MULTIPLE)
return;
switch (mode)
{
case GTK_SELECTION_NONE:
moo_icon_view_unselect_all (view);
return;
case GTK_SELECTION_MULTIPLE:
return;
case GTK_SELECTION_BROWSE:
case GTK_SELECTION_SINGLE:
break;
@ -2988,7 +3004,6 @@ static void
moo_icon_view_drag_end (G_GNUC_UNUSED GtkWidget *widget,
G_GNUC_UNUSED GdkDragContext *context)
{
g_print ("drag-end!!!!\n");
}
@ -3041,42 +3056,144 @@ moo_icon_view_disable_drag_dest (MooIconView *view)
}
// static void
// moo_icon_drag_data_received (G_GNUC_UNUSED GtkWidget *widget,
// G_GNUC_UNUSED GdkDragContext *context,
// G_GNUC_UNUSED int x,
// G_GNUC_UNUSED int y,
// G_GNUC_UNUSED GtkSelectionData *data,
// G_GNUC_UNUSED guint info,
// G_GNUC_UNUSED guint time)
// {
// }
//
//
// static gboolean
// moo_icon_view_drag_drop (GtkWidget *widget,
// GdkDragContext *context,
// int x,
// int y,
// guint time)
// {
// return FALSE;
// }
//
//
// static void
// moo_icon_view_drag_leave (GtkWidget *widget,
// GdkDragContext *context,
// guint time)
// {
// }
//
//
// static gboolean
// moo_icon_view_drag_motion (GtkWidget *widget,
// GdkDragContext *context,
// int x,
// int y,
// guint time)
// {
// }
static void
moo_icon_drag_data_received (G_GNUC_UNUSED GtkWidget *widget,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED int x,
G_GNUC_UNUSED int y,
G_GNUC_UNUSED GtkSelectionData *data,
G_GNUC_UNUSED guint info,
G_GNUC_UNUSED guint time)
{
g_print ("drag-data-received\n");
}
static gboolean
moo_icon_view_drag_drop (G_GNUC_UNUSED GtkWidget *widget,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED int x,
G_GNUC_UNUSED int y,
G_GNUC_UNUSED guint time)
{
g_print ("drag-drop\n");
return FALSE;
}
static void
moo_icon_view_drag_leave (G_GNUC_UNUSED GtkWidget *widget,
G_GNUC_UNUSED GdkDragContext *context,
G_GNUC_UNUSED guint time)
{
DndInfo *info;
MooIconView *view = MOO_ICON_VIEW (widget);
info = view->priv->dnd_info;
if (!info->drag_dest_inside)
g_warning ("drag_leave: oops\n");
info->drag_dest_inside = FALSE;
drag_scroll_stop (view);
g_print ("drag-leave\n");
}
static void
drag_scroll_check (G_GNUC_UNUSED MooIconView *view,
G_GNUC_UNUSED int x,
G_GNUC_UNUSED int y)
{
g_print ("drag_scroll_check\n");
}
static gboolean
moo_icon_view_drag_motion (GtkWidget *widget,
G_GNUC_UNUSED GdkDragContext *context,
int x,
int y,
G_GNUC_UNUSED guint time)
{
DndInfo *info;
MooIconView *view = MOO_ICON_VIEW (widget);
info = view->priv->dnd_info;
if (!info->drag_dest_inside)
{
info->drag_dest_inside = TRUE;
g_print ("drag-enter\n");
}
else
{
drag_scroll_check (view, x, y);
}
g_print ("drag-motion\n");
return FALSE;
}
static void
drag_scroll_stop (MooIconView *view)
{
DndInfo *info = view->priv->dnd_info;
if (info->scroll_timeout)
{
g_source_remove (info->scroll_timeout);
info->scroll_timeout = 0;
g_print ("drag_scroll_stop\n");
}
}
void
moo_icon_view_set_drag_dest_row (MooIconView *view,
GtkTreePath *path)
{
GtkTreeRowReference *ref = NULL;
g_return_if_fail (MOO_IS_ICON_VIEW (view));
if (path)
ref = gtk_tree_row_reference_new (view->priv->model, path);
if (view->priv->drop_dest)
{
GtkTreePath *old_path;
old_path = gtk_tree_row_reference_get_path (view->priv->drop_dest);
if (old_path)
{
invalidate_path_rectangle (view, old_path);
gtk_tree_path_free (old_path);
}
gtk_tree_row_reference_free (view->priv->drop_dest);
view->priv->drop_dest = NULL;
}
if (ref)
{
view->priv->drop_dest = ref;
invalidate_path_rectangle (view, path);
}
}
GtkTreePath *
moo_icon_view_get_drop_dest_row (MooIconView *view)
{
g_return_val_if_fail (MOO_IS_ICON_VIEW (view), NULL);
if (view->priv->drop_dest)
return gtk_tree_row_reference_get_path (view->priv->drop_dest);
else
return NULL;
}

View File

@ -158,6 +158,9 @@ void moo_icon_view_enable_drag_dest (MooIconView *view,
GdkDragAction actions);
GtkTargetList *moo_icon_view_get_dest_targets (MooIconView *view);
void moo_icon_view_disable_drag_dest (MooIconView *view);
void moo_icon_view_set_drag_dest_row (MooIconView *view,
GtkTreePath *path);
GtkTreePath *moo_icon_view_get_drop_dest_row (MooIconView *view);
G_END_DECLS

View File

@ -5,6 +5,8 @@ BOOL:INT
BOOL:OBJECT,OBJECT
BOOL:STRING
BOOL:STRING,BOOL
BOOL:STRING,OBJECT,OBJECT,UINT
BOOL:STRING,OBJECT,OBJECT,POINTER,UINT,UINT
BOOL:STRING,POINTER
BOOL:VOID
BOOL:VOID