From 30fc14d85cf0279d521acce6ec70517ffd910ebe Mon Sep 17 00:00:00 2001 Message-Id: <30fc14d85cf0279d521acce6ec70517ffd910ebe.1717874552.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 29 Jun 2008 20:52:22 +0100 Subject: [PATCH] When moving to a search result, only move if it's not visible already. Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/choose-search.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/disobedience/choose-search.c b/disobedience/choose-search.c index d822250..8637687 100644 --- a/disobedience/choose-search.c +++ b/disobedience/choose-search.c @@ -69,6 +69,9 @@ static guint choose_search_timeout_id; static void choose_search_entry_changed(GtkEditable *editable, gpointer user_data); +static gboolean choose_get_visible_range(GtkTreeView *tree_view, + GtkTreePath **startpathp, + GtkTreePath **endpathp); int choose_is_search_result(const char *track) { return choose_search_hash && hash_find(choose_search_hash, track); @@ -190,18 +193,23 @@ static int choose_compare_references(const void *av, const void *bv) { * * If @p row_align is negative no row alignemt is performed. Otherwise * it must be between 0 (the top) and 1 (the bottom). - * - * TODO: if the row is already visible do nothing. */ static int choose_make_path_visible(GtkTreePath *path, gfloat row_align) { /* Make sure that the target's parents are all expanded */ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(choose_view), path); + /* Find out what's currently visible */ + GtkTreePath *startpath, *endpath; + choose_get_visible_range(GTK_TREE_VIEW(choose_view), &startpath, &endpath); /* Make sure the target is visible */ - gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(choose_view), path, NULL, - row_align >= 0.0, - row_align, - 0); + if(gtk_tree_path_compare(path, startpath) < 0 + || gtk_tree_path_compare(path, endpath) > 0) + gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(choose_view), path, NULL, + row_align >= 0.0, + row_align, + 0); + gtk_tree_path_free(startpath); + gtk_tree_path_free(endpath); return 0; } -- [mdw]