private void HandleKeyboardNavigation(SearchContext context) { // TODO: support page down and page up var evt = Event.current; if (evt.type == EventType.KeyDown) { var prev = m_SelectedIndex; if (evt.keyCode == KeyCode.DownArrow) { if (m_SelectedIndex == -1 && evt.modifiers.HasFlag(EventModifiers.Alt)) { m_CycledSearch = SearchService.CyclePreviousSearch(-1); GUI.FocusControl(null); } else { m_SelectedIndex = Math.Min(m_SelectedIndex + 1, m_FilteredItems.Count - 1); Event.current.Use(); } } else if (evt.keyCode == KeyCode.UpArrow) { if (m_SelectedIndex >= 0) { m_SelectedIndex = Math.Max(-1, m_SelectedIndex - 1); if (m_SelectedIndex == -1) { m_SearchBoxFocus = true; } Event.current.Use(); } else if (evt.modifiers.HasFlag(EventModifiers.Alt)) { m_CycledSearch = SearchService.CyclePreviousSearch(+1); GUI.FocusControl(null); } } else if (evt.keyCode == KeyCode.PageDown) { m_SelectedIndex = Math.Min(m_SelectedIndex + GetDisplayItemCount() - 1, m_FilteredItems.Count - 1); Event.current.Use(); } else if (evt.keyCode == KeyCode.PageUp) { m_SelectedIndex = Math.Max(0, m_SelectedIndex - GetDisplayItemCount()); Event.current.Use(); } else if (evt.keyCode == KeyCode.RightArrow && evt.modifiers.HasFlag(EventModifiers.Alt)) { if (m_SelectedIndex != -1) { var item = m_FilteredItems.ElementAt(m_SelectedIndex); var menuPositionY = (m_SelectedIndex + 1) * Styles.itemRowHeight - m_ScrollPosition.y + Styles.itemRowHeight / 2.0f; ShowItemContextualMenu(item, context, new Rect(position.width - Styles.actionButtonSize, menuPositionY, 1, 1)); Event.current.Use(); } } else if (evt.keyCode == KeyCode.LeftArrow && evt.modifiers.HasFlag(EventModifiers.Alt)) { m_ShowFilterWindow = true; Event.current.Use(); } else if (evt.keyCode == KeyCode.KeypadEnter || evt.keyCode == KeyCode.Return) { var selectedIndex = m_SelectedIndex; if (selectedIndex == -1 && m_FilteredItems != null && m_FilteredItems.Count > 0) { selectedIndex = 0; } if (selectedIndex != -1 && m_FilteredItems != null) { int actionIndex = 0; if (evt.modifiers.HasFlag(EventModifiers.Alt)) { actionIndex = 1; if (evt.modifiers.HasFlag(EventModifiers.Control)) { actionIndex = 2; if (evt.modifiers.HasFlag(EventModifiers.Shift)) { actionIndex = 3; } } } var item = m_FilteredItems.ElementAt(selectedIndex); if (item.provider.actions.Any()) { Event.current.Use(); actionIndex = Math.Max(0, Math.Min(actionIndex, item.provider.actions.Count - 1)); ExecuteAction(item.provider.actions[actionIndex], item, context); GUIUtility.ExitGUI(); } } } else if (evt.keyCode == KeyCode.Escape) { CloseSearchWindow(); Event.current.Use(); } else { GUI.FocusControl(k_QuickSearchBoxName); } if (prev != m_SelectedIndex) { m_FocusSelectedItem = true; Repaint(); } } if (m_FilteredItems == null || m_FilteredItems.Count == 0) { m_SearchBoxFocus = true; } }