From d1cd95032702aa4db940f26829db650bd8ac8946 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 17 Aug 2013 13:40:05 +0100 Subject: Improve keyboard nav slightly. --- desktop/treeview.c | 111 +++++++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 55 deletions(-) (limited to 'desktop/treeview.c') diff --git a/desktop/treeview.c b/desktop/treeview.c index f52068e82..49402ff8e 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -1740,10 +1740,9 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, .n_selected = 0, .prev_n_selected = 0 }; + int h = tree->root->height; bool redraw = false; - rect->y1 = tree->root->height; - /* Fill out the nav. state struct, by examining the current selection * state */ treeview_walk_internal(tree->root, false, NULL, @@ -1818,14 +1817,68 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, rect->x0 = 0; rect->y0 = 0; rect->x1 = REDRAW_MAX; - if (rect->y1 < tree->root->height) + if (tree->root->height > h) rect->y1 = tree->root->height; + else + rect->y1 = h; redraw = true; return redraw; } +/* Exported interface, documented in treeview.h */ +bool treeview_keypress(treeview *tree, uint32_t key) +{ + struct rect r; /**< Redraw rectangle */ + bool redraw = false; + nserror err; + + assert(tree != NULL); + + switch (key) { + case KEY_SELECT_ALL: + redraw = treeview_select_all(tree, &r); + break; + case KEY_COPY_SELECTION: + /* TODO: Copy selection as text */ + break; + case KEY_DELETE_LEFT: + case KEY_DELETE_RIGHT: + redraw = treeview_delete_selection(tree, &r); + + if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) { + /* Delete any empty nodes */ + err = treeview_delete_empty_nodes(tree, true); + r.y0 = 0; + } + break; + case KEY_CR: + case KEY_NL: + err = treeview_launch_selection(tree); + break; + case KEY_ESCAPE: + case KEY_CLEAR_SELECTION: + redraw = treeview_clear_selection(tree, &r); + break; + case KEY_LEFT: + case KEY_RIGHT: + case KEY_UP: + case KEY_DOWN: + redraw = treeview_keyboard_navigation(tree, key, &r); + break; + default: + return false; + } + + if (redraw) { + tree->cw_t->redraw_request(tree->cw_h, r); + } + + return true; +} + + /** * Set the drag&drop drop indicator * @@ -1956,58 +2009,6 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw, } -/* Exported interface, documented in treeview.h */ -bool treeview_keypress(treeview *tree, uint32_t key) -{ - struct rect r; /**< Redraw rectangle */ - bool redraw = false; - nserror err; - - assert(tree != NULL); - - switch (key) { - case KEY_SELECT_ALL: - redraw = treeview_select_all(tree, &r); - break; - case KEY_COPY_SELECTION: - /* TODO: Copy selection as text */ - break; - case KEY_DELETE_LEFT: - case KEY_DELETE_RIGHT: - redraw = treeview_delete_selection(tree, &r); - - if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) { - /* Delete any empty nodes */ - err = treeview_delete_empty_nodes(tree, true); - r.y0 = 0; - } - break; - case KEY_CR: - case KEY_NL: - err = treeview_launch_selection(tree); - break; - case KEY_ESCAPE: - case KEY_CLEAR_SELECTION: - redraw = treeview_clear_selection(tree, &r); - break; - case KEY_LEFT: - case KEY_RIGHT: - case KEY_UP: - case KEY_DOWN: - redraw = treeview_keyboard_navigation(tree, key, &r); - break; - default: - return false; - } - - if (redraw) { - tree->cw_t->redraw_request(tree->cw_h, r); - } - - return true; -} - - struct treeview_mouse_action { treeview *tree; browser_mouse_state mouse; -- cgit v1.2.3