# HG changeset patch # User Nathan Walp # Date 1176937023 0 # Node ID 50e1b269598e424e45feed8e442971a02ca7abcc # Parent ff2cd3f29f9bf218c7034ee81ee1d67d6ed8b522# Parent f02e611bdb6bd0256b7828daa6334507ab071107 merge of '2bafabcca7d12b1fb39369f54333c5309a7cead1' and '2bc4c67a691dc5b511af8298e1da45e14de48c0d' diff -r ff2cd3f29f9b -r 50e1b269598e finch/libgnt/gnttree.c --- a/finch/libgnt/gnttree.c Wed Apr 18 22:00:41 2007 +0000 +++ b/finch/libgnt/gnttree.c Wed Apr 18 22:57:03 2007 +0000 @@ -7,6 +7,7 @@ #include #define SEARCH_TIMEOUT 4000 /* 4 secs */ +#define SEARCHING(tree) (tree->search && tree->search->len > 0) enum { @@ -503,6 +504,14 @@ mvwaddch(widget->window, widget->priv.height - pos - 1, scrcol, (row ? ACS_DARROW : ' ') | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + /* If there's a search-text, show it in the bottom of the tree */ + if (tree->search && tree->search->len > 0) { + const char *str = gnt_util_onscreen_width_to_pointer(tree->search->str, scrcol - 1, NULL); + wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_HIGHLIGHT_D)); + mvwaddnstr(widget->window, widget->priv.height - pos - 1, pos, + tree->search->str, str - tree->search->str); + } + gnt_widget_queue_update(widget); } @@ -576,15 +585,17 @@ { GntTree *tree = GNT_TREE(bind); GntTreeRow *row = tree->current; - if (row->parent) { - int dist; - tree->current = row->parent; - if ((dist = get_distance(tree->current, tree->top)) > 0) - gnt_tree_scroll(tree, -dist); - else - redraw_tree(tree); - tree_selection_changed(tree, row, tree->current); - } + int dist; + + if (!row->parent || SEARCHING(tree)) + return FALSE; + + tree->current = row->parent; + if ((dist = get_distance(tree->current, tree->top)) > 0) + gnt_tree_scroll(tree, -dist); + else + redraw_tree(tree); + tree_selection_changed(tree, row, tree->current); return TRUE; } @@ -693,8 +704,15 @@ end_search(tree); gnt_widget_activate(widget); } else if (tree->search) { + gboolean changed = TRUE; if (isalnum(*text)) { tree->search = g_string_append_c(tree->search, *text); + } else if (g_utf8_collate(text, GNT_KEY_BACKSPACE) == 0) { + if (tree->search->len) + tree->search->str[--tree->search->len] = '\0'; + } else + changed = FALSE; + if (changed) { redraw_tree(tree); g_source_remove(tree->search_timeout); tree->search_timeout = g_timeout_add(SEARCH_TIMEOUT, search_timeout, tree);