talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 2c569bc4121eb41f4df3c805d4a78a27f1e7bfdc
parent 6e8dac6f33c59aa1b32424394deb55040bbd55ac
Author: Colin Leroy <colin@colino.net>
Date:   Wed, 22 Dec 2010 18:16:32 +0000

2010-12-22 [colin]	3.7.8cvs21

	* src/folderview.c
	* src/folderview.h
		Implement a nicer scroll when drag and dropping

Diffstat:
MChangeLog | 6++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/folderview.c | 50++++++++++++++++++++++++++++++++++++++++++--------
Msrc/folderview.h | 2++
5 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,9 @@ +2010-12-22 [colin] 3.7.8cvs21 + + * src/folderview.c + * src/folderview.h + Implement a nicer scroll when drag and dropping + 2010-12-22 [colin] 3.7.8cvs20 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS @@ -4094,3 +4094,4 @@ ( cvs diff -u -r 1.149.2.101 -r 1.149.2.102 src/inc.c; cvs diff -u -r 1.17.2.57 -r 1.17.2.58 src/send_message.c; cvs diff -u -r 1.23.2.24 -r 1.23.2.25 src/common/session.c; cvs diff -u -r 1.8.2.16 -r 1.8.2.17 src/common/session.h; ) > 3.7.8cvs18.patchset ( cvs diff -u -r 1.96.2.226 -r 1.96.2.227 src/textview.c; ) > 3.7.8cvs19.patchset ( cvs diff -u -r 1.382.2.563 -r 1.382.2.564 src/compose.c; ) > 3.7.8cvs20.patchset +( cvs diff -u -r 1.207.2.217 -r 1.207.2.218 src/folderview.c; cvs diff -u -r 1.20.2.26 -r 1.20.2.27 src/folderview.h; ) > 3.7.8cvs21.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=7 MICRO_VERSION=8 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=20 +EXTRA_VERSION=21 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/folderview.c b/src/folderview.c @@ -604,7 +604,7 @@ FolderView *folderview_create(void) folderview->target_list = gtk_target_list_new(folderview_drag_types, 2); folderview_list = g_list_append(folderview_list, folderview); folderview->deferred_refresh_id = -1; - + folderview->scroll_timeout_id = -1; return folderview; } @@ -2818,6 +2818,29 @@ static gboolean folderview_update_folder(gpointer source, gpointer userdata) return FALSE; } +static gboolean folderview_dnd_scroll_cb(gpointer data) +{ + FolderView *folderview = (FolderView *)data; + GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment( + GTK_SCROLLED_WINDOW(folderview->scrolledwin)); + gint new_val = (int)pos->value + folderview->scroll_value; + gint max = (int)pos->upper - (int)pos->page_size; + + if (folderview->scroll_value == 0) { + folderview->scroll_timeout_id = -1; + return FALSE; + } + + if (folderview->scroll_value > 0 && new_val > max) { + new_val = max; + } else if (folderview->scroll_value < 0 && new_val < 0) { + new_val = 0; + } + gtk_adjustment_set_value(pos, new_val); + + return TRUE; +} + static gboolean folderview_drag_motion_cb(GtkWidget *widget, GdkDragContext *context, gint x, @@ -2835,18 +2858,25 @@ static gboolean folderview_drag_motion_cb(GtkWidget *widget, int total_height = (int)pos->upper; int vpos = (int) pos->value; int offset = prefs_common.show_col_headers ? 24:0; - + int dist; + if (gtk_cmclist_get_selection_info (GTK_CMCLIST(widget), x - offset, y - offset, &row, &column)) { GtkWidget *srcwidget; - if (y > height - 24 && height + vpos < total_height) { - gtk_adjustment_set_value(pos, (vpos+5 > total_height ? total_height : vpos+5)); - gtk_adjustment_changed(pos); + if (y > height - (48 - offset) && height + vpos < total_height) { + dist = -(height - (48 - offset) - y); + folderview->scroll_value = 1.41f * (1+(dist / 6)); + } else if (y < 72 - (24 - offset) && y >= 0) { + dist = 72 - (24 - offset) - y; + folderview->scroll_value = -1.41f * (1+(dist / 6)); + } else { + folderview->scroll_value = 0; } - if (y < 48 && y > 0) { - gtk_adjustment_set_value(pos, (vpos-5 < 0 ? 0 : vpos-5)); - gtk_adjustment_changed(pos); + if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == -1) { + folderview->scroll_timeout_id = + g_timeout_add(30, folderview_dnd_scroll_cb, + folderview); } node = gtk_cmctree_node_nth(GTK_CMCTREE(widget), row); @@ -2912,6 +2942,7 @@ static void folderview_drag_leave_cb(GtkWidget *widget, FolderView *folderview) { drag_state_stop(folderview); + folderview->scroll_value = 0; gtk_cmctree_select(GTK_CMCTREE(widget), folderview->opened); } @@ -2978,6 +3009,8 @@ static void folderview_drag_received_cb(GtkWidget *widget, GtkCMCTreeNode *node; int offset = prefs_common.show_col_headers ? 24:0; + folderview->scroll_value = 0; + if (info == TARGET_DUMMY) { drag_state_stop(folderview); if ((void *)strstr(data->data, "FROM_OTHER_FOLDER") != (void *)data->data) { @@ -3076,6 +3109,7 @@ static void folderview_drag_end_cb(GtkWidget *widget, FolderView *folderview) { drag_state_stop(folderview); + folderview->scroll_value = 0; g_slist_free(folderview->nodes_to_recollapse); folderview->nodes_to_recollapse = NULL; } diff --git a/src/folderview.h b/src/folderview.h @@ -83,6 +83,8 @@ struct _FolderView GtkUIManager *ui_manager; GtkActionGroup *popup_common_action_group; GtkActionGroup *popup_specific_action_group; + gint scroll_timeout_id; + gint scroll_value; }; struct _FolderViewPopup