2010-12-22 [colin] 3.7.8cvs21

* src/folderview.c
	* src/folderview.h
		Implement a nicer scroll when drag and dropping
This commit is contained in:
Colin Leroy 2010-12-22 18:16:32 +00:00
parent 6e8dac6f33
commit 2c569bc412
5 changed files with 52 additions and 9 deletions

View file

@ -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

View file

@ -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

View file

@ -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=

View file

@ -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;
}

View file

@ -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