[gthumb/ext] autoscroll the list when dragging files out the list limits
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext] autoscroll the list when dragging files out the list limits
- Date: Sun, 30 Aug 2009 11:23:53 +0000 (UTC)
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]