changeset 1631:2349fa90226d

better implementation of tree_view_row_get_visibility, gtk_tree_view_set_cursor is not sufficient in some cases, call also tree_view_row_make_visible
author nadvornik
date Sat, 06 Jun 2009 16:14:07 +0000
parents a5c1930c4437
children 390166358aae
files src/ui_tree_edit.c src/view_dir_tree.c
diffstat 2 files changed, 50 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ui_tree_edit.c	Sat Jun 06 15:33:56 2009 +0000
+++ b/src/ui_tree_edit.c	Sat Jun 06 16:14:07 2009 +0000
@@ -343,6 +343,51 @@
 	*height = MIN(*height, wy + wh - (*y));
 }
 
+#if GTK_CHECK_VERSION(2,8,0)
+/* an implementation that uses gtk_tree_view_get_visible_range */
+gint tree_view_row_get_visibility(GtkTreeView *widget, GtkTreeIter *iter, gboolean fully_visible)
+{
+	GtkTreeModel *store;
+	GtkTreePath *tpath, *start_path, *end_path;
+	gint ret = 0;
+
+	if (!gtk_tree_view_get_visible_range(widget, &start_path, &end_path)) return -1; /* we will most probably scroll down, needed for tree_view_row_make_visible */
+
+	store = gtk_tree_view_get_model(widget);
+	tpath = gtk_tree_model_get_path(store, iter);
+
+	if (fully_visible)
+		{
+		if (gtk_tree_path_compare(tpath, start_path) <= 0)
+			{
+			ret = -1;
+			}
+		else if (gtk_tree_path_compare(tpath, end_path) >= 0)
+			{
+			ret = 1;
+			}
+		}
+	else
+		{
+		if (gtk_tree_path_compare(tpath, start_path) < 0)
+			{
+			ret = -1;
+			}
+		else if (gtk_tree_path_compare(tpath, end_path) > 0)
+			{
+			ret = 1;
+			}
+		}
+
+	gtk_tree_path_free(tpath);
+	gtk_tree_path_free(start_path);
+	gtk_tree_path_free(end_path);
+	return ret;
+}
+
+#else 
+/* an implementation that uses gtk_tree_view_get_visible_rect, it seems to be more error prone than the variant above */
+
 gint tree_view_row_get_visibility(GtkTreeView *widget, GtkTreeIter *iter, gboolean fully_visible)
 {
 	GtkTreeModel *store;
@@ -379,6 +424,7 @@
 	if (cy > vrect.y + vrect.height) return 1;
 	return 0;
 }
+#endif
 
 gint tree_view_row_make_visible(GtkTreeView *widget, GtkTreeIter *iter, gboolean center)
 {
--- a/src/view_dir_tree.c	Sat Jun 06 15:33:56 2009 +0000
+++ b/src/view_dir_tree.c	Sat Jun 06 16:14:07 2009 +0000
@@ -720,6 +720,10 @@
 			{
 			/* setting the cursor scrolls the view; do not do that unless it is necessary */
 			gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, NULL, FALSE);
+			
+			/* gtk_tree_view_set_cursor scrolls the window itself, but it sometimes
+			   does not work (switch from dir_list to dir_tree) */
+			tree_view_row_make_visible(GTK_TREE_VIEW(vd->view), &iter, TRUE);
 			}
 		gtk_tree_path_free(tpath);
 		gtk_tree_path_free(old_tpath);