From 86a9c9697f25177a3b0953dbbf38544885987511 Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 9 Jun 2005 07:48:25 +0000 Subject: fixed scroll positon problem after some operations. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@322 ee746299-78ed-0310-b773-934348b2243d --- src/gtkutils.c | 150 ++++++++++-------------------------------------------- src/gtkutils.h | 18 ++----- src/summaryview.c | 41 ++++++++------- 3 files changed, 53 insertions(+), 156 deletions(-) (limited to 'src') diff --git a/src/gtkutils.c b/src/gtkutils.c index a4ca0605..dc1dac24 100644 --- a/src/gtkutils.c +++ b/src/gtkutils.c @@ -243,54 +243,6 @@ ComboButton *gtkut_combo_button_create(GtkWidget *button, return combo; } -#define CELL_SPACING 1 -#define ROW_TOP_YPIXEL(clist, row) (((clist)->row_height * (row)) + \ - (((row) + 1) * CELL_SPACING) + \ - (clist)->voffset) -#define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \ - ((clist)->row_height + CELL_SPACING)) - -void gtkut_ctree_node_move_if_on_the_edge(GtkCTree *ctree, GtkCTreeNode *node) -{ - GtkCList *clist = GTK_CLIST(ctree); - gint row; - GtkVisibility row_visibility, prev_row_visibility, next_row_visibility; - - g_return_if_fail(ctree != NULL); - g_return_if_fail(node != NULL); - - row = g_list_position(clist->row_list, (GList *)node); - if (row < 0 || row >= clist->rows || clist->row_height == 0) return; - row_visibility = gtk_clist_row_is_visible(clist, row); - prev_row_visibility = gtk_clist_row_is_visible(clist, row - 1); - next_row_visibility = gtk_clist_row_is_visible(clist, row + 1); - - if (row_visibility == GTK_VISIBILITY_NONE) { - gtk_clist_moveto(clist, row, -1, 0.5, 0); - return; - } - if (row_visibility == GTK_VISIBILITY_FULL && - prev_row_visibility == GTK_VISIBILITY_FULL && - next_row_visibility == GTK_VISIBILITY_FULL) - return; - if (prev_row_visibility != GTK_VISIBILITY_FULL && - next_row_visibility != GTK_VISIBILITY_FULL) - return; - - if (prev_row_visibility != GTK_VISIBILITY_FULL) { - gtk_clist_moveto(clist, row, -1, 0.2, 0); - return; - } - if (next_row_visibility != GTK_VISIBILITY_FULL) { - gtk_clist_moveto(clist, row, -1, 0.8, 0); - return; - } -} - -#undef CELL_SPACING -#undef ROW_TOP_YPIXEL -#undef ROW_FROM_YPIXEL - gint gtkut_ctree_get_nth_from_node(GtkCTree *ctree, GtkCTreeNode *node) { g_return_val_if_fail(ctree != NULL, -1); @@ -299,82 +251,6 @@ gint gtkut_ctree_get_nth_from_node(GtkCTree *ctree, GtkCTreeNode *node) return g_list_position(GTK_CLIST(ctree)->row_list, (GList *)node); } -/* get the next node, including the invisible one */ -GtkCTreeNode *gtkut_ctree_node_next(GtkCTree *ctree, GtkCTreeNode *node) -{ - GtkCTreeNode *parent; - - if (!node) return NULL; - - if (GTK_CTREE_ROW(node)->children) - return GTK_CTREE_ROW(node)->children; - - if (GTK_CTREE_ROW(node)->sibling) - return GTK_CTREE_ROW(node)->sibling; - - for (parent = GTK_CTREE_ROW(node)->parent; parent != NULL; - parent = GTK_CTREE_ROW(parent)->parent) { - if (GTK_CTREE_ROW(parent)->sibling) - return GTK_CTREE_ROW(parent)->sibling; - } - - return NULL; -} - -/* get the previous node, including the invisible one */ -GtkCTreeNode *gtkut_ctree_node_prev(GtkCTree *ctree, GtkCTreeNode *node) -{ - GtkCTreeNode *prev; - GtkCTreeNode *child; - - if (!node) return NULL; - - prev = GTK_CTREE_NODE_PREV(node); - if (prev == GTK_CTREE_ROW(node)->parent) - return prev; - - child = prev; - while (GTK_CTREE_ROW(child)->children != NULL) { - child = GTK_CTREE_ROW(child)->children; - while (GTK_CTREE_ROW(child)->sibling != NULL) - child = GTK_CTREE_ROW(child)->sibling; - } - - return child; -} - -gboolean gtkut_ctree_node_is_selected(GtkCTree *ctree, GtkCTreeNode *node) -{ - GtkCList *clist = GTK_CLIST(ctree); - GList *cur; - - for (cur = clist->selection; cur != NULL; cur = cur->next) { - if (node == GTK_CTREE_NODE(cur->data)) - return TRUE; - } - - return FALSE; -} - -GtkCTreeNode *gtkut_ctree_find_collapsed_parent(GtkCTree *ctree, - GtkCTreeNode *node) -{ - if (!node) return NULL; - - while ((node = GTK_CTREE_ROW(node)->parent) != NULL) { - if (!GTK_CTREE_ROW(node)->expanded) - return node; - } - - return NULL; -} - -void gtkut_ctree_expand_parent_all(GtkCTree *ctree, GtkCTreeNode *node) -{ - while ((node = gtkut_ctree_find_collapsed_parent(ctree, node)) != NULL) - gtk_ctree_expand(ctree, node); -} - void gtkut_ctree_set_focus_row(GtkCTree *ctree, GtkCTreeNode *node) { gtkut_clist_set_focus_row(GTK_CLIST(ctree), @@ -643,6 +519,32 @@ void gtkut_tree_view_vertical_autoscroll(GtkTreeView *treeview) gtk_adjustment_set_value(vadj, value); } +/* modified version of gtk_tree_view_scroll_to_cell */ +void gtkut_tree_view_scroll_to_cell(GtkTreeView *treeview, GtkTreePath *path) +{ + GdkRectangle cell_rect; + GdkRectangle vis_rect; + gint dest_x, dest_y; + + if (!path) + return; + + gtk_tree_view_get_cell_area(treeview, path, NULL, &cell_rect); + gtk_tree_view_widget_to_tree_coords(treeview, cell_rect.x, cell_rect.y, + NULL, &(cell_rect.y)); + gtk_tree_view_get_visible_rect(treeview, &vis_rect); + + dest_x = vis_rect.x; + dest_y = vis_rect.y; + + if (cell_rect.y < vis_rect.y) + dest_y = cell_rect.y; + if (cell_rect.y + cell_rect.height > vis_rect.y + vis_rect.height) + dest_y = cell_rect.y + cell_rect.height - vis_rect.height; + + gtk_tree_view_scroll_to_point(treeview, dest_x, dest_y); +} + void gtkut_combo_set_items(GtkCombo *combo, const gchar *str1, ...) { va_list args; diff --git a/src/gtkutils.h b/src/gtkutils.h index bb936c19..8f46b603 100644 --- a/src/gtkutils.h +++ b/src/gtkutils.h @@ -110,25 +110,10 @@ ComboButton *gtkut_combo_button_create (GtkWidget *button, /* CTree functions */ -void gtkut_ctree_node_move_if_on_the_edge - (GtkCTree *ctree, - GtkCTreeNode *node); gint gtkut_ctree_get_nth_from_node (GtkCTree *ctree, GtkCTreeNode *node); -GtkCTreeNode *gtkut_ctree_node_next (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCTreeNode *gtkut_ctree_node_prev (GtkCTree *ctree, - GtkCTreeNode *node); -gboolean gtkut_ctree_node_is_selected (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCTreeNode *gtkut_ctree_find_collapsed_parent - (GtkCTree *ctree, - GtkCTreeNode *node); -void gtkut_ctree_expand_parent_all (GtkCTree *ctree, - GtkCTreeNode *node); void gtkut_ctree_set_focus_row (GtkCTree *ctree, GtkCTreeNode *node); - void gtkut_clist_set_focus_row (GtkCList *clist, gint row); @@ -168,6 +153,9 @@ void gtkut_tree_view_expand_parent_all (GtkTreeView *treeview, void gtkut_tree_view_vertical_autoscroll(GtkTreeView *treeview); +void gtkut_tree_view_scroll_to_cell (GtkTreeView *treeview, + GtkTreePath *path); + void gtkut_combo_set_items (GtkCombo *combo, const gchar *str1, ...); diff --git a/src/summaryview.c b/src/summaryview.c index c05e571d..973794a5 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -119,7 +119,8 @@ static void summary_msgid_table_destroy (SummaryView *summaryview); static void summary_set_menu_sensitive (SummaryView *summaryview); -static void summary_scroll_to_selected (SummaryView *summaryview); +static void summary_scroll_to_selected (SummaryView *summaryview, + gboolean align_center); static guint summary_get_msgnum (SummaryView *summaryview, GtkTreeRowReference *row); @@ -689,6 +690,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item, GTK_MOVEMENT_BUFFER_ENDS, item->sort_type == SORT_DESCENDING ? -1 : 1, &moved); + summary_scroll_to_selected(summaryview, TRUE); } } } else { @@ -712,6 +714,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item, item->sort_type == SORT_DESCENDING ? -1 : 1, &moved); summary_lock(summaryview); + summary_scroll_to_selected(summaryview, TRUE); } } @@ -1255,20 +1258,19 @@ void summary_select_row(SummaryView *summaryview, GtkTreeIter *iter, iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(summaryview->treeview), path, NULL, FALSE); - if (do_refresh) { + if (do_refresh) gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(summaryview->treeview), path, NULL, TRUE, 0.5, 0.0); - } else { - gtk_tree_view_scroll_to_cell - (GTK_TREE_VIEW(summaryview->treeview), - path, NULL, FALSE, 0.0, 0.0); - } + else + gtkut_tree_view_scroll_to_cell + (GTK_TREE_VIEW(summaryview->treeview), path); gtk_tree_path_free(path); } -static void summary_scroll_to_selected(SummaryView *summaryview) +static void summary_scroll_to_selected(SummaryView *summaryview, + gboolean align_center) { GtkTreePath *path; @@ -1277,9 +1279,13 @@ static void summary_scroll_to_selected(SummaryView *summaryview) path = gtk_tree_row_reference_get_path(summaryview->selected); if (path) { - gtk_tree_view_scroll_to_cell - (GTK_TREE_VIEW(summaryview->treeview), - path, NULL, FALSE, 0.0, 0.0); + if (align_center) + gtk_tree_view_scroll_to_cell + (GTK_TREE_VIEW(summaryview->treeview), + path, NULL, TRUE, 0.5, 0.0); + else + gtkut_tree_view_scroll_to_cell + (GTK_TREE_VIEW(summaryview->treeview), path); gtk_tree_path_free(path); } } @@ -1568,7 +1574,7 @@ void summary_attract_by_subject(SummaryView *summaryview) summaryview->folder_item->cache_dirty = TRUE; summary_selection_list_free(summaryview); - summary_scroll_to_selected(summaryview); + summary_scroll_to_selected(summaryview, TRUE); debug_print("done.\n"); STATUSBAR_POP(summaryview->mainwin); @@ -1748,6 +1754,8 @@ void summary_sort(SummaryView *summaryview, summary_set_column_titles(summaryview); summary_set_menu_sensitive(summaryview); + summary_scroll_to_selected(summaryview, TRUE); + debug_print("done.\n"); STATUSBAR_POP(summaryview->mainwin); @@ -2149,9 +2157,6 @@ static void summary_display_msg_full(SummaryView *summaryview, if (!messageview_is_visible(msgview)) { main_window_toggle_message_view(summaryview->mainwin); GTK_EVENTS_FLUSH(); - gtk_tree_view_scroll_to_cell - (GTK_TREE_VIEW(summaryview->treeview), - path, NULL, FALSE, 0.0, 0.0); } val = messageview_show(msgview, msginfo, all_headers); if (msgview->type == MVIEW_TEXT || @@ -2160,6 +2165,8 @@ static void summary_display_msg_full(SummaryView *summaryview, gtk_notebook_get_current_page (GTK_NOTEBOOK(msgview->notebook)) == 0))) gtk_widget_grab_focus(summaryview->treeview); + gtkut_tree_view_scroll_to_cell + (GTK_TREE_VIEW(summaryview->treeview), path); gtk_tree_path_free(path); } @@ -3300,7 +3307,7 @@ void summary_thread_build(SummaryView *summaryview) if (prefs_common.expand_thread) gtk_tree_view_expand_all(GTK_TREE_VIEW(summaryview->treeview)); - summary_scroll_to_selected(summaryview); + summary_scroll_to_selected(summaryview, TRUE); debug_print(_("done.\n")); STATUSBAR_POP(summaryview->mainwin); @@ -3373,7 +3380,7 @@ void summary_unthread(SummaryView *summaryview) summary_unthread_node(summaryview, &iter); } - summary_scroll_to_selected(summaryview); + summary_scroll_to_selected(summaryview, TRUE); debug_print(_("done.\n")); STATUSBAR_POP(summaryview->mainwin); -- cgit v1.2.3