aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-06-09 07:48:25 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-06-09 07:48:25 +0000
commit86a9c9697f25177a3b0953dbbf38544885987511 (patch)
tree8a319519b13a122d9a2d12a4e49e3809b811ec1e /src
parent7931ec60671f8c66c9bcca030fb510180975765e (diff)
fixed scroll positon problem after some operations.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@322 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/gtkutils.c150
-rw-r--r--src/gtkutils.h18
-rw-r--r--src/summaryview.c41
3 files changed, 53 insertions, 156 deletions
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);