From ba0b8895f89ff97f424371ff4efab48dbccc0e18 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 1 Aug 2013 17:46:42 +0200 Subject: Bug #699603 - Message list scrolls to cursor on style change --- e-util/e-table-item.c | 15 +++++++++++++++ e-util/e-table-item.h | 2 ++ e-util/e-tree.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) (limited to 'e-util') diff --git a/e-util/e-table-item.c b/e-util/e-table-item.c index ad6c0890f4..b8314dc777 100644 --- a/e-util/e-table-item.c +++ b/e-util/e-table-item.c @@ -4071,3 +4071,18 @@ e_table_item_is_editing (ETableItem *eti) return eti_editing (eti); } + +/** + * e_table_item_cursor_scrolled: + * @eti: an %ETableItem + * + * Does necessary recalculations after cursor scrolled, like whether + * the cursor is on screen or not anymore. + **/ +void +e_table_item_cursor_scrolled (ETableItem *eti) +{ + g_return_if_fail (E_IS_TABLE_ITEM (eti)); + + eti_check_cursor_bounds (eti); +} diff --git a/e-util/e-table-item.h b/e-util/e-table-item.h index 01e6a227dd..47ae5caa00 100644 --- a/e-util/e-table-item.h +++ b/e-util/e-table-item.h @@ -258,6 +258,8 @@ gint e_table_item_row_diff (ETableItem *eti, gboolean e_table_item_is_editing (ETableItem *eti); +void e_table_item_cursor_scrolled (ETableItem *eti); + G_END_DECLS #endif /* _E_TABLE_ITEM_H_ */ diff --git a/e-util/e-tree.c b/e-util/e-tree.c index 42ec7aadb2..0bea168dc9 100644 --- a/e-util/e-tree.c +++ b/e-util/e-tree.c @@ -158,6 +158,8 @@ struct _ETreePrivate { gint length_threshold; + GtkAdjustment *table_canvas_vadjustment; + /* * Configuration settings */ @@ -497,10 +499,16 @@ et_dispose (GObject *object) priv->info_text_resize_id = 0; if (priv->table_canvas != NULL) { + g_signal_handlers_disconnect_by_data (priv->table_canvas, object); gtk_widget_destroy (GTK_WIDGET (priv->table_canvas)); priv->table_canvas = NULL; } + if (priv->table_canvas_vadjustment) { + g_signal_handlers_disconnect_by_data (priv->table_canvas_vadjustment, object); + g_clear_object (&priv->table_canvas_vadjustment); + } + /* do not unref it, it was owned by priv->table_canvas */ priv->item = NULL; @@ -1235,6 +1243,40 @@ table_canvas_focus_event_cb (GtkWidget *widget, return TRUE; } +static void +e_tree_table_canvas_scrolled_cb (GtkAdjustment *vadjustment, + GParamSpec *param, + ETree *tree) +{ + g_return_if_fail (E_IS_TREE (tree)); + + if (tree->priv->item) + e_table_item_cursor_scrolled (E_TABLE_ITEM (tree->priv->item)); +} + +static void +et_setup_table_canvas_vadjustment (ETree *tree) +{ + GtkAdjustment *vadjustment = NULL; + + g_return_if_fail (E_IS_TREE (tree)); + + if (tree->priv->table_canvas_vadjustment) { + g_signal_handlers_disconnect_by_data (tree->priv->table_canvas_vadjustment, tree); + g_clear_object (&tree->priv->table_canvas_vadjustment); + } + + if (tree->priv->table_canvas) + vadjustment = gtk_scrollable_get_vadjustment ( + GTK_SCROLLABLE (tree->priv->table_canvas)); + + if (vadjustment) { + tree->priv->table_canvas_vadjustment = g_object_ref (vadjustment); + g_signal_connect (vadjustment, "notify::value", + G_CALLBACK (e_tree_table_canvas_scrolled_cb), tree); + } +} + static void e_tree_setup_table (ETree *e_tree) { @@ -1281,6 +1323,10 @@ e_tree_setup_table (ETree *e_tree) e_tree->priv->table_canvas, "reflow", G_CALLBACK (tree_canvas_reflow), e_tree); + et_setup_table_canvas_vadjustment (e_tree); + g_signal_connect_swapped (e_tree->priv->table_canvas, "notify::vadjustment", + G_CALLBACK (et_setup_table_canvas_vadjustment), e_tree); + widget = GTK_WIDGET (e_tree->priv->table_canvas); style = gtk_widget_get_style (widget); -- cgit v1.2.3