X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/fd9faf1603455f8698cc57786b7305591df3801d..b56bb147b52671fb2e4dc667e69c9ca476863367:/disobedience/choose-search.c diff --git a/disobedience/choose-search.c b/disobedience/choose-search.c index d822250..acfddfa 100644 --- a/disobedience/choose-search.c +++ b/disobedience/choose-search.c @@ -2,23 +2,21 @@ * This file is part of DisOrder * Copyright (C) 2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . */ -/** @file disobedience/search.c - * @brief Search support +/** @file disobedience/choose-search.c + * @brief Search support for Disobedience choose window */ #include "disobedience.h" #include "choose.h" @@ -69,6 +67,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 +191,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; } @@ -509,15 +515,15 @@ GtkWidget *choose_search_widget(void) { gtk_widget_set_style(choose_search_entry, tool_style); g_signal_connect(choose_search_entry, "changed", G_CALLBACK(choose_search_entry_changed), 0); - gtk_tooltips_set_tip(tips, choose_search_entry, - "Enter search terms here; search is automatic", ""); + gtk_widget_set_tooltip_text(choose_search_entry, + "Enter search terms here; search is automatic"); /* Cancel button to clear the search */ choose_clear = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_widget_set_style(choose_clear, tool_style); g_signal_connect(G_OBJECT(choose_clear), "clicked", G_CALLBACK(choose_clear_clicked), 0); - gtk_tooltips_set_tip(tips, choose_clear, "Clear search terms", ""); + gtk_widget_set_tooltip_text(choose_clear, "Clear search terms"); /* Up and down buttons to find previous/next results; initially they are not * usable as there are no search results. */