#include "ash/quick_insert/views/quick_insert_pseudo_focus.h"
#include "ash/quick_insert/views/quick_insert_item_view.h"
#include "ash/quick_insert/views/quick_insert_list_item_view.h"
#include "ash/quick_insert/views/quick_insert_search_bar_textfield.h"
#include "base/functional/bind.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/types/event_type.h"
#include "ui/views/controls/focus_ring.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/view.h"
#include "ui/views/view_utils.h"
namespace ash {
void ApplyQuickInsertPseudoFocusToView(views::View* view) {
if (view == nullptr) {
return;
}
if (auto* item_view = views::AsViewClass<QuickInsertItemView>(view)) {
item_view->SetItemState(QuickInsertItemView::ItemState::kPseudoFocused);
if (auto* list_item_view =
views::AsViewClass<QuickInsertListItemView>(view)) {
list_item_view->SetBadgeVisible(true);
}
return;
}
if (auto* textfield =
views::AsViewClass<QuickInsertSearchBarTextfield>(view)) {
textfield->SetShouldShowFocusIndicator(true);
return;
}
if (views::FocusRing* focus_ring = views::FocusRing::Get(view)) {
focus_ring->SetHasFocusPredicate(
base::BindRepeating([](const views::View* view) { return true; }));
focus_ring->SchedulePaint();
}
}
void RemoveQuickInsertPseudoFocusFromView(views::View* view) {
if (view == nullptr) {
return;
}
if (auto* item_view = views::AsViewClass<QuickInsertItemView>(view)) {
item_view->SetItemState(QuickInsertItemView::ItemState::kNormal);
if (auto* list_item_view =
views::AsViewClass<QuickInsertListItemView>(view)) {
list_item_view->SetBadgeVisible(false);
}
return;
}
if (auto* textfield =
views::AsViewClass<QuickInsertSearchBarTextfield>(view)) {
textfield->SetShouldShowFocusIndicator(false);
return;
}
if (views::FocusRing* focus_ring = views::FocusRing::Get(view)) {
focus_ring->SetHasFocusPredicate(
base::BindRepeating([](const views::View* view) { return false; }));
focus_ring->SchedulePaint();
}
}
bool DoQuickInsertPseudoFocusedActionOnView(views::View* view) {
if (view == nullptr) {
return false;
}
if (views::IsViewClass<QuickInsertSearchBarTextfield>(view)) {
return true;
}
if (auto* item_view = views::AsViewClass<QuickInsertItemView>(view)) {
item_view->SelectItem();
return true;
}
CHECK(!view->HasFocus());
ui::KeyEvent key_event(ui::EventType::kKeyPressed, ui::VKEY_RETURN,
ui::DomCode::ENTER, ui::EF_NONE);
view->OnKeyEvent(&key_event);
return key_event.handled();
}
views::View* GetNextQuickInsertPseudoFocusableView(
views::View* view,
QuickInsertPseudoFocusDirection direction,
bool should_loop) {
return view == nullptr || view->GetFocusManager() == nullptr
? nullptr
: view->GetFocusManager()->GetNextFocusableView(
view, view->GetWidget(),
direction == QuickInsertPseudoFocusDirection::kBackward,
!should_loop);
}
}