[gthumb/ext] autoscroll the list when dragging files out the list limits



commit 5bda0bf58155a949001cc6945138479e47080e00
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Aug 30 13:21:06 2009 +0200

    autoscroll the list when dragging files out the list limits

 extensions/file_manager/callbacks.c |   70 ++++++++++++++++++++++++
 gthumb/gth-file-list.c              |   15 ++++--
 gthumb/gth-file-list.h              |   99 ++++++++++++++++++-----------------
 3 files changed, 131 insertions(+), 53 deletions(-)
---
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index 17dca99..7a1a50d 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -33,6 +33,7 @@
 
 #define BROWSER_DATA_KEY "file-manager-browser-data"
 #define URI_LIST_TARGET (gdk_atom_intern_static_string ("text/uri-list"))
+#define SCROLL_TIMEOUT 30 /* autoscroll timeout in milliseconds */
 
 
 static const char *vfs_ui_info =
@@ -205,6 +206,8 @@ typedef struct {
 	guint           folder_popup_merge_id;
 	gboolean        can_paste;
 	int             drop_pos;
+	int             scroll_diff;
+	guint           scroll_event;
 } BrowserData;
 
 
@@ -334,6 +337,32 @@ gth_file_list_drag_drop (GtkWidget      *widget,
 
 
 static gboolean
+drag_motion_autoscroll_cb (gpointer user_data)
+{
+	GthBrowser    *browser = user_data;
+	BrowserData   *data;
+	GtkAdjustment *adj;
+	double         max_value;
+	double         value;
+
+	GDK_THREADS_ENTER ();
+
+	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
+
+	adj = gth_file_list_get_vadjustment (GTH_FILE_LIST (gth_browser_get_file_list (browser)));
+	max_value = gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj);
+	value = gtk_adjustment_get_value (adj) + data->scroll_diff;
+	if (value > max_value)
+		value = max_value;
+	gtk_adjustment_set_value (adj, value);
+
+	GDK_THREADS_LEAVE();
+
+	return TRUE;
+}
+
+
+static gboolean
 gth_file_list_drag_motion (GtkWidget      *file_view,
 			   GdkDragContext *context,
 			   gint            x,
@@ -355,6 +384,22 @@ gth_file_list_drag_motion (GtkWidget      *file_view,
 	if ((gtk_drag_get_source_widget (context) == file_view) && gth_file_source_is_reorderable (gth_browser_get_location_source (browser))) {
 		gdk_drag_status (context, GDK_ACTION_MOVE, time);
 		gth_file_view_set_drag_dest_pos (GTH_FILE_VIEW (file_view), context, x, y, time, &data->drop_pos);
+
+		if (y < 10)
+			data->scroll_diff = - (10 - y);
+		else if (y > file_view->allocation.height - 10)
+			data->scroll_diff = (10 - (file_view->allocation.height - y));
+		else
+			data->scroll_diff = 0;
+
+		if (data->scroll_diff != 0) {
+			if (data->scroll_event == 0)
+				data->scroll_event = g_timeout_add (SCROLL_TIMEOUT, drag_motion_autoscroll_cb, browser);
+		}
+		else if (data->scroll_event != 0) {
+			g_source_remove (data->scroll_event);
+			data->scroll_event = 0;
+		}
 	}
 	else
 		gdk_drag_status (context, GDK_ACTION_COPY, time);
@@ -376,6 +421,23 @@ gth_file_list_drag_leave (GtkWidget      *file_view,
 }
 
 
+static void
+gth_file_list_drag_end (GtkWidget      *widget,
+			GdkDragContext *drag_context,
+			gpointer        user_data)
+{
+	GthBrowser  *browser = user_data;
+	BrowserData *data;
+
+	data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
+
+	if (data->scroll_event != 0) {
+		g_source_remove (data->scroll_event);
+		data->scroll_event = 0;
+	}
+}
+
+
 void
 fm__gth_browser_construct_cb (GthBrowser *browser)
 {
@@ -412,6 +474,10 @@ fm__gth_browser_construct_cb (GthBrowser *browser)
 	                  "drag_leave",
 	                  G_CALLBACK (gth_file_list_drag_leave),
 	                  browser);
+	g_signal_connect (file_view,
+	                  "drag_end",
+	                  G_CALLBACK (gth_file_list_drag_end),
+	                  browser);
 
 	file_view = gth_file_list_get_empty_view (GTH_FILE_LIST (gth_browser_get_file_list (browser)));
 	g_signal_connect (file_view,
@@ -430,6 +496,10 @@ fm__gth_browser_construct_cb (GthBrowser *browser)
 	                  "drag_leave",
 	                  G_CALLBACK (gth_file_list_drag_leave),
 	                  browser);
+	g_signal_connect (file_view,
+	                  "drag_end",
+	                  G_CALLBACK (gth_file_list_drag_end),
+	                  browser);
 
 	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
 }
diff --git a/gthumb/gth-file-list.c b/gthumb/gth-file-list.c
index 7c5d9b5..3dec2db 100644
--- a/gthumb/gth-file-list.c
+++ b/gthumb/gth-file-list.c
@@ -84,6 +84,7 @@ enum {
 struct _GthFileListPrivateData
 {
 	GthFileListType  type;
+	GtkAdjustment   *vadj;
 	GtkWidget       *notebook;
 	GtkWidget       *view;
 	GtkWidget       *message;
@@ -471,7 +472,6 @@ gth_file_list_construct (GthFileList     *file_list,
 			 GthFileListType  list_type)
 {
 	GtkWidget       *scrolled;
-	GtkAdjustment   *vadj;
 	GtkWidget       *viewport;
 	GtkCellRenderer *renderer;
 	GthFileStore    *model;
@@ -514,12 +514,12 @@ gth_file_list_construct (GthFileList     *file_list,
 	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
 					     GTK_SHADOW_ETCHED_IN);
 
-	vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled));
-	g_signal_connect (G_OBJECT (vadj),
+	file_list->priv->vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled));
+	g_signal_connect (G_OBJECT (file_list->priv->vadj),
 			  "changed",
 			  G_CALLBACK (vadj_changed_cb),
 			  file_list);
-	g_signal_connect (G_OBJECT (vadj),
+	g_signal_connect (G_OBJECT (file_list->priv->vadj),
 			  "value-changed",
 			  G_CALLBACK (vadj_changed_cb),
 			  file_list);
@@ -1178,6 +1178,13 @@ gth_file_list_get_empty_view (GthFileList *file_list)
 }
 
 
+GtkAdjustment *
+gth_file_list_get_vadjustment (GthFileList *file_list)
+{
+	return file_list->priv->vadj;
+}
+
+
 /* thumbs */
 
 
diff --git a/gthumb/gth-file-list.h b/gthumb/gth-file-list.h
index 5996540..0f4c03c 100644
--- a/gthumb/gth-file-list.h
+++ b/gthumb/gth-file-list.h
@@ -57,55 +57,56 @@ struct _GthFileListClass {
 	GtkVBoxClass __parent;
 };
 
-GType          gth_file_list_get_type       (void);
-GtkWidget *    gth_file_list_new            (GthFileListType       list_type);
-void           gth_file_list_cancel         (GthFileList          *file_list,
-					     DoneFunc              done_func,
-					     gpointer              user_data);
-void           gth_file_list_set_files      (GthFileList          *file_list,
-					     GList                *list);
-GList *        gth_file_list_get_files      (GthFileList          *file_list,
-					     GList                *tree_path_list);
-void           gth_file_list_clear          (GthFileList          *file_list,
-					     const char           *message);
-void           gth_file_list_add_files      (GthFileList          *file_list,
-					     GList                *list /* GthFileData */);
-void           gth_file_list_delete_files   (GthFileList          *file_list,
-					     GList                *list /* GFile */);
-void           gth_file_list_update_files   (GthFileList          *file_list,
-					     GList                *list /* GthFileData */);
-void           gth_file_list_rename_file    (GthFileList          *file_list,
-					     GFile                *file,
-					     GthFileData          *file_data);
-void           gth_file_list_set_filter     (GthFileList          *file_list,
-					     GthTest              *filter);
-void           gth_file_list_set_sort_func  (GthFileList          *file_list,
-					     GthFileDataCompFunc   cmp_func,
-					     gboolean              inverse_sort);
-void           gth_file_list_enable_thumbs  (GthFileList          *file_list,
-					     gboolean              enable);
-void           gth_file_list_set_thumb_size (GthFileList          *file_list,
-					     int                   size);
-void           gth_file_list_set_caption    (GthFileList          *file_list,
-					     const char           *attribute);
-GtkWidget *    gth_file_list_get_view       (GthFileList          *file_list);
-GtkWidget *    gth_file_list_get_empty_view (GthFileList          *file_list);
-int            gth_file_list_first_file     (GthFileList          *file_list,
-					     gboolean              skip_broken,
-					     gboolean              only_selected);
-int            gth_file_list_last_file      (GthFileList          *file_list,
-					     gboolean              skip_broken,
-					     gboolean              only_selected);
-int            gth_file_list_next_file      (GthFileList          *file_list,
-					     int                   pos,
-					     gboolean              skip_broken,
-					     gboolean              only_selected,
-					     gboolean              wrap);
-int            gth_file_list_prev_file      (GthFileList          *file_list,
-					     int                   pos,
-					     gboolean              skip_broken,
-					     gboolean              only_selected,
-					     gboolean              wrap);
+GType           gth_file_list_get_type        (void);
+GtkWidget *     gth_file_list_new             (GthFileListType       list_type);
+void            gth_file_list_cancel          (GthFileList          *file_list,
+					       DoneFunc              done_func,
+					       gpointer              user_data);
+void            gth_file_list_set_files       (GthFileList          *file_list,
+					       GList                *list);
+GList *         gth_file_list_get_files       (GthFileList          *file_list,
+					       GList                *tree_path_list);
+void            gth_file_list_clear           (GthFileList          *file_list,
+					       const char           *message);
+void            gth_file_list_add_files       (GthFileList          *file_list,
+					       GList                *list /* GthFileData */);
+void            gth_file_list_delete_files    (GthFileList          *file_list,
+					       GList                *list /* GFile */);
+void            gth_file_list_update_files    (GthFileList          *file_list,
+					       GList                *list /* GthFileData */);
+void            gth_file_list_rename_file     (GthFileList          *file_list,
+					       GFile                *file,
+					       GthFileData          *file_data);
+void            gth_file_list_set_filter      (GthFileList          *file_list,
+					       GthTest              *filter);
+void            gth_file_list_set_sort_func   (GthFileList          *file_list,
+					       GthFileDataCompFunc   cmp_func,
+					       gboolean              inverse_sort);
+void            gth_file_list_enable_thumbs   (GthFileList          *file_list,
+					       gboolean              enable);
+void            gth_file_list_set_thumb_size  (GthFileList          *file_list,
+					       int                   size);
+void            gth_file_list_set_caption     (GthFileList          *file_list,
+					       const char           *attribute);
+GtkWidget *     gth_file_list_get_view        (GthFileList          *file_list);
+GtkWidget *     gth_file_list_get_empty_view  (GthFileList          *file_list);
+GtkAdjustment * gth_file_list_get_vadjustment (GthFileList          *file_list);
+int             gth_file_list_first_file      (GthFileList          *file_list,
+					       gboolean              skip_broken,
+					       gboolean              only_selected);
+int             gth_file_list_last_file       (GthFileList          *file_list,
+					       gboolean              skip_broken,
+					       gboolean              only_selected);
+int             gth_file_list_next_file       (GthFileList          *file_list,
+					       int                   pos,
+					       gboolean              skip_broken,
+					       gboolean              only_selected,
+					       gboolean              wrap);
+int             gth_file_list_prev_file       (GthFileList          *file_list,
+					       int                   pos,
+					       gboolean              skip_broken,
+					       gboolean              only_selected,
+					       gboolean              wrap);
 
 G_END_DECLS
 



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