diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-13 16:46:17 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-13 16:46:17 +0000 |
commit | 15d14dc5a93bdcb508bd2002f593ac8d1a900743 (patch) | |
tree | 25a9f8ba68ade5bdf11bf191e5b58c39b017c7e4 /views | |
parent | 624a6e8a36e1ee5933e29d68fcc25b8385379143 (diff) | |
download | chromium_src-15d14dc5a93bdcb508bd2002f593ac8d1a900743.zip chromium_src-15d14dc5a93bdcb508bd2002f593ac8d1a900743.tar.gz chromium_src-15d14dc5a93bdcb508bd2002f593ac8d1a900743.tar.bz2 |
Fixes bug in bookmark menus where using arrow keys would select
invisible menu items.
BUG=54800
TEST=see bug
Review URL: http://codereview.chromium.org/3315021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59226 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/menu/menu_controller.cc | 25 | ||||
-rw-r--r-- | views/controls/menu/menu_controller.h | 7 |
2 files changed, 29 insertions, 3 deletions
diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc index 9b4a0b3..06c86fc 100644 --- a/views/controls/menu/menu_controller.cc +++ b/views/controls/menu/menu_controller.cc @@ -1527,10 +1527,11 @@ void MenuController::IncrementSelection(int delta) { if (parent_count > 1) { for (int i = 0; i < parent_count; ++i) { if (parent->GetSubmenu()->GetMenuItemAt(i) == item) { - int next_index = (i + delta + parent_count) % parent_count; - ScrollToVisible(parent->GetSubmenu()->GetMenuItemAt(next_index)); MenuItemView* to_select = - parent->GetSubmenu()->GetMenuItemAt(next_index); + FindNextSelectableMenuItem(parent, i, delta); + if (!to_select) + break; + ScrollToVisible(to_select); SetSelection(to_select, false, false); View* to_make_hot = GetInitialFocusableView(to_select, delta == 1); if (to_make_hot) @@ -1542,6 +1543,24 @@ void MenuController::IncrementSelection(int delta) { } } +MenuItemView* MenuController::FindNextSelectableMenuItem(MenuItemView* parent, + int index, + int delta) { + int start_index = index; + int parent_count = parent->GetSubmenu()->GetMenuItemCount(); + // Loop through the menu items skipping any invisible menus. The loop stops + // when we wrap or find a visible child. + do { + index = (index + delta + parent_count) % parent_count; + if (index == start_index) + return NULL; + MenuItemView* child = parent->GetSubmenu()->GetMenuItemAt(index); + if (child->IsVisible()) + return child; + } while (index != start_index); + return NULL; +} + void MenuController::OpenSubmenuChangeSelectionIfCan() { MenuItemView* item = pending_state_.item; if (item->HasSubmenu()) { diff --git a/views/controls/menu/menu_controller.h b/views/controls/menu/menu_controller.h index 3c641c1..fe379b8 100644 --- a/views/controls/menu/menu_controller.h +++ b/views/controls/menu/menu_controller.h @@ -311,6 +311,13 @@ class MenuController : public MessageLoopForUI::Dispatcher { // Selects the next/previous menu item. void IncrementSelection(int delta); + // Returns the next selectable child menu item of |parent| starting at |index| + // and incrementing index by |delta|. If there are no more selected menu items + // NULL is returned. + MenuItemView* FindNextSelectableMenuItem(MenuItemView* parent, + int index, + int delta); + // If the selected item has a submenu and it isn't currently open, the // the selection is changed such that the menu opens immediately. void OpenSubmenuChangeSelectionIfCan(); |