[evolution] Bug #593700 - Opens folder on top



commit 62a56d5d8f66fe0e47b6a2cda9be8e227922a29a
Author: Milan Crha <mcrha redhat com>
Date:   Wed Feb 10 18:27:35 2010 +0100

    Bug #593700 - Opens folder on top

 mail/message-list.c    |    2 +
 widgets/table/e-tree.c |   60 +++++++++++++++++++++++++++++++++++------------
 widgets/table/e-tree.h |    2 +
 3 files changed, 48 insertions(+), 16 deletions(-)
---
diff --git a/mail/message-list.c b/mail/message-list.c
index 78709e1..277b116 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -4645,6 +4645,8 @@ regen_list_done (struct _regen_list_msg *m)
 
 	tree = E_TREE (m->ml);
 
+	e_tree_show_cursor_after_reflow (tree);
+
 	g_signal_handlers_block_by_func (e_tree_get_table_adapter (tree), ml_tree_sorting_changed, m->ml);
 
 	e_profile_event_emit("list.buildtree", m->folder->full_name, 0);
diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c
index 3d5c604..5e17390 100644
--- a/widgets/table/e-tree.c
+++ b/widgets/table/e-tree.c
@@ -137,6 +137,8 @@ struct ETreePriv {
 	gint scroll_idle_id;
 	gint hover_idle_id;
 
+	gboolean show_cursor_after_reflow;
+
 	gint table_model_change_id;
 	gint table_row_change_id;
 	gint table_cell_change_id;
@@ -561,6 +563,8 @@ e_tree_init (ETree *e_tree)
 	e_tree->priv->scroll_idle_id         = 0;
 	e_tree->priv->hover_idle_id          = 0;
 
+	e_tree->priv->show_cursor_after_reflow = FALSE;
+
 	e_tree->priv->table_model_change_id  = 0;
 	e_tree->priv->table_row_change_id    = 0;
 	e_tree->priv->table_cell_change_id   = 0;
@@ -729,6 +733,29 @@ e_tree_setup_header (ETree *e_tree)
 		E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height);
 }
 
+static void
+scroll_to_cursor (ETree *e_tree)
+{
+	ETreePath path;
+	GtkAdjustment *adj;
+	gint x, y, w, h;
+
+	path = e_tree_get_cursor (e_tree);
+	adj = GTK_LAYOUT (e_tree->priv->table_canvas)->vadjustment;
+	x = y = w = h = 0;
+	if (path) {
+		gint row = e_tree_row_of_node(e_tree, path);
+		gint col = 0;
+
+		if (row >= 0)
+			e_table_item_get_cell_geometry (E_TABLE_ITEM (e_tree->priv->item),
+							&row, &col, &x, &y, &w, &h);
+	}
+
+	if (y < adj->value || y + h > adj->value + adj->page_size)
+		gtk_adjustment_set_value(adj, CLAMP(y - adj->page_size / 2, adj->lower, adj->upper - adj->page_size));
+}
+
 static gboolean
 tree_canvas_reflow_idle (ETree *e_tree)
 {
@@ -753,6 +780,12 @@ tree_canvas_reflow_idle (ETree *e_tree)
 		set_header_canvas_width (e_tree);
 	}
 	e_tree->priv->reflow_idle_id = 0;
+
+	if (e_tree->priv->show_cursor_after_reflow) {
+		e_tree->priv->show_cursor_after_reflow = FALSE;
+		scroll_to_cursor (e_tree);
+	}
+
 	return FALSE;
 }
 
@@ -762,9 +795,6 @@ tree_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
 {
 	gdouble width;
 	gdouble height;
-	GtkAdjustment *adj = GTK_LAYOUT(e_tree->priv->table_canvas)->vadjustment;
-	ETreePath path = e_tree_get_cursor (e_tree);
-	gint x, y, w, h;
 	GValue *val = g_new0 (GValue, 1);
 	g_value_init (val, G_TYPE_DOUBLE);
 
@@ -784,19 +814,7 @@ tree_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
 	if (e_tree->priv->reflow_idle_id)
 		g_source_remove(e_tree->priv->reflow_idle_id);
 	tree_canvas_reflow_idle(e_tree);
-
-	x = y = w = h = 0;
-	if (path) {
-		gint row = e_tree_row_of_node(e_tree, path);
-		gint col = 0;
-
-		if (row >= 0)
-			e_table_item_get_cell_geometry (E_TABLE_ITEM (e_tree->priv->item),
-							&row, &col, &x, &y, &w, &h);
-	}
-
-	if (y < adj->value || y + h > adj->value + adj->page_size)
-		gtk_adjustment_set_value(adj, CLAMP(y - adj->page_size / 2, adj->lower, adj->upper - adj->page_size));
+	scroll_to_cursor (e_tree);
 }
 
 static void
@@ -1684,6 +1702,16 @@ e_tree_new_from_spec_file (ETreeModel *etm, ETableExtras *ete, const gchar *spec
 }
 
 void
+e_tree_show_cursor_after_reflow (ETree *e_tree)
+{
+	g_return_if_fail (e_tree != NULL);
+	g_return_if_fail (E_IS_TREE (e_tree));
+
+	e_tree->priv->show_cursor_after_reflow = TRUE;
+}
+
+
+void
 e_tree_set_cursor (ETree *e_tree, ETreePath path)
 {
 #ifndef E_TREE_USE_TREE_SELECTION
diff --git a/widgets/table/e-tree.h b/widgets/table/e-tree.h
index b746156..5657751 100644
--- a/widgets/table/e-tree.h
+++ b/widgets/table/e-tree.h
@@ -173,6 +173,8 @@ void            e_tree_set_state_object           (ETree                *e_tree,
 						   ETableState          *state);
 void            e_tree_load_state                 (ETree                *e_tree,
 						   const gchar          *filename);
+void		e_tree_show_cursor_after_reflow   (ETree *e_tree);
+
 void            e_tree_set_cursor                 (ETree                *e_tree,
 						   ETreePath             path);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]