chromium/ash/picker/views/picker_key_event_handler.cc

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ash/picker/views/picker_key_event_handler.h"

#include "ash/picker/views/picker_pseudo_focus.h"
#include "ash/picker/views/picker_pseudo_focus_handler.h"
#include "base/i18n/rtl.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/views/focus/focus_manager.h"

namespace ash {

PickerKeyEventHandler::PickerKeyEventHandler() = default;

PickerKeyEventHandler::~PickerKeyEventHandler() = default;

bool PickerKeyEventHandler::HandleKeyEvent(const ui::KeyEvent& event) {
  if (active_pseudo_focus_handler_ == nullptr || event.handled() ||
      event.type() != ui::EventType::kKeyPressed) {
    return false;
  }

  if (views::FocusManager::IsTabTraversalKeyEvent(event)) {
    active_pseudo_focus_handler_->AdvancePseudoFocus(
        event.IsShiftDown() ? PickerPseudoFocusDirection::kBackward
                            : PickerPseudoFocusDirection::kForward);
    return true;
  }

  const bool has_modifier =
      event.IsShiftDown() || event.IsControlDown() || event.IsAltDown();
  const bool is_rtl = base::i18n::IsRTL();
  switch (event.key_code()) {
    case ui::VKEY_RETURN:
      return active_pseudo_focus_handler_->DoPseudoFocusedAction();
    case ui::VKEY_UP:
      return has_modifier ? false
                          : active_pseudo_focus_handler_->MovePseudoFocusUp();
    case ui::VKEY_DOWN:
      return has_modifier ? false
                          : active_pseudo_focus_handler_->MovePseudoFocusDown();
    case ui::VKEY_LEFT:
      return has_modifier
                 ? false
                 : (is_rtl
                        ? active_pseudo_focus_handler_->MovePseudoFocusRight()
                        : active_pseudo_focus_handler_->MovePseudoFocusLeft());
    case ui::VKEY_RIGHT:
      return has_modifier
                 ? false
                 : (is_rtl
                        ? active_pseudo_focus_handler_->MovePseudoFocusLeft()
                        : active_pseudo_focus_handler_->MovePseudoFocusRight());
    default:
      return false;
  }
}

void PickerKeyEventHandler::SetActivePseudoFocusHandler(
    PickerPseudoFocusHandler* active_pseudo_focus_handler) {
  active_pseudo_focus_handler_ = active_pseudo_focus_handler;
}

}  // namespace ash