| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/ash/input_method/undo_window.h" |
| |
| #include <iostream> |
| |
| #include "ash/public/cpp/style/color_provider.h" |
| #include "chrome/app/vector_icons/vector_icons.h" |
| #include "chrome/browser/ash/input_method/assistive_window_properties.h" |
| #include "chrome/browser/ui/ash/input_method/border_factory.h" |
| #include "chrome/browser/ui/ash/input_method/colors.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/strings/grit/components_strings.h" |
| #include "components/vector_icons/vector_icons.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/base/mojom/dialog_button.mojom.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| #include "ui/views/bubble/bubble_border.h" |
| #include "ui/views/bubble/bubble_frame_view.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/layout/layout_provider.h" |
| #include "ui/wm/core/window_animations.h" |
| namespace ui { |
| namespace ime { |
| |
| namespace { |
| constexpr int kHeight = 28; |
| constexpr int kPadding = 0; |
| constexpr int kIconSize = 16; |
| // TODO(crbug/1099044): Update and use cros_colors.json5 |
| constexpr cros_styles::ColorName kButtonHighlightColor = |
| cros_styles::ColorName::kRippleColor; |
| |
| void SetHighlighted(views::View& view, bool highlighted) { |
| if (!!view.background() != highlighted) { |
| view.SetBackground(highlighted |
| ? views::CreateRoundedRectBackground( |
| ResolveSemanticColor(kButtonHighlightColor), 2) |
| : nullptr); |
| } |
| } |
| |
| } // namespace |
| |
| UndoWindow::UndoWindow(gfx::NativeView parent, AssistiveDelegate* delegate) |
| : delegate_(delegate) { |
| DialogDelegate::SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone)); |
| SetCanActivate(false); |
| DCHECK(parent); |
| set_parent_window(parent); |
| set_margins(gfx::Insets(kPadding)); |
| SetArrow(views::BubbleBorder::Arrow::BOTTOM_LEFT); |
| SetLayoutManager(std::make_unique<views::BoxLayout>( |
| views::BoxLayout::Orientation::kHorizontal)); |
| |
| std::u16string undo_button_text = |
| l10n_util::GetStringUTF16(IDS_SUGGESTION_AUTOCORRECT_UNDO_TEXT); |
| |
| undo_button_ = AddChildView(std::make_unique<views::LabelButton>( |
| base::BindRepeating(&UndoWindow::UndoButtonPressed, |
| base::Unretained(this)), |
| undo_button_text)); |
| undo_button_->SetText(undo_button_text); |
| undo_button_->SetImageLabelSpacing( |
| views::LayoutProvider::Get()->GetDistanceMetric( |
| views::DistanceMetric::DISTANCE_RELATED_BUTTON_HORIZONTAL)); |
| undo_button_->SetBackground(nullptr); |
| undo_button_->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); |
| undo_button_->SetMaxSize( |
| gfx::Size(std::numeric_limits<int>::max(), kHeight - 2 * kPadding)); |
| |
| learn_more_button_ = |
| AddChildView(std::make_unique<views::ImageButton>(base::BindRepeating( |
| &AssistiveDelegate::AssistiveWindowButtonClicked, |
| base::Unretained(delegate_), |
| AssistiveWindowButton{ |
| .id = ui::ime::ButtonId::kLearnMore, |
| .window_type = ash::ime::AssistiveWindowType::kLearnMore}))); |
| learn_more_button_->SetImageHorizontalAlignment( |
| views::ImageButton::ALIGN_CENTER); |
| learn_more_button_->SetImageVerticalAlignment( |
| views::ImageButton::ALIGN_MIDDLE); |
| learn_more_button_->SetTooltipText(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); |
| learn_more_button_->SetVisible(false); |
| } |
| |
| void UndoWindow::OnThemeChanged() { |
| undo_button_->SetImageModel( |
| views::Button::ButtonState::STATE_NORMAL, |
| ui::ImageModel::FromVectorIcon( |
| kAutocorrectUndoIcon, |
| ash::ColorProvider::Get()->GetContentLayerColor( |
| ash::ColorProvider::ContentLayerType::kIconColorPrimary), |
| kIconSize)); |
| undo_button_->SetEnabledTextColors( |
| ash::ColorProvider::Get()->GetContentLayerColor( |
| ash::ColorProvider::ContentLayerType::kTextColorSecondary)); |
| |
| const auto* const color_provider = GetColorProvider(); |
| learn_more_button_->SetBorder(views::CreatePaddedBorder( |
| views::CreateSolidSidedBorder( |
| gfx::Insets::TLBR(4, 0, 4, 4), |
| color_provider->GetColor(ui::kColorButtonBackground)), |
| views::LayoutProvider::Get()->GetInsetsMetric( |
| views::INSETS_VECTOR_IMAGE_BUTTON))); |
| |
| // TODO(crbug.com/1099044): Update and use cros colors. |
| learn_more_button_->SetImageModel( |
| views::Button::ButtonState::STATE_NORMAL, |
| ui::ImageModel::FromVectorIcon(vector_icons::kSettingsOutlineIcon, |
| ui::kColorIconSecondary)); |
| |
| BubbleDialogDelegateView::OnThemeChanged(); |
| } |
| |
| UndoWindow::~UndoWindow() = default; |
| |
| views::Widget* UndoWindow::InitWidget() { |
| views::Widget* widget = BubbleDialogDelegateView::CreateBubble(this); |
| |
| wm::SetWindowVisibilityAnimationTransition(widget->GetNativeView(), |
| wm::ANIMATE_NONE); |
| |
| GetBubbleFrameView()->SetBubbleBorder( |
| GetBorderForWindow(WindowBorderType::Undo)); |
| GetBubbleFrameView()->OnThemeChanged(); |
| return widget; |
| } |
| |
| void UndoWindow::Hide() { |
| GetWidget()->Close(); |
| } |
| |
| void UndoWindow::Show(const bool show_setting_link) { |
| learn_more_button_->SetVisible(show_setting_link); |
| GetWidget()->Show(); |
| SizeToContents(); |
| } |
| |
| void UndoWindow::SetBounds(const gfx::Rect& word_bounds) { |
| SetAnchorRect(word_bounds); |
| } |
| |
| void UndoWindow::SetButtonHighlighted(const AssistiveWindowButton& button, |
| bool highlighted) { |
| if (button.id == ButtonId::kUndo) { |
| SetHighlighted(*undo_button_, highlighted); |
| } else if (button.id == ButtonId::kLearnMore) { |
| SetHighlighted(*learn_more_button_, highlighted); |
| } |
| } |
| |
| views::Button* UndoWindow::GetUndoButtonForTesting() { |
| return undo_button_; |
| } |
| |
| void UndoWindow::UndoButtonPressed() { |
| const AssistiveWindowButton button = { |
| .id = ButtonId::kUndo, |
| .window_type = ash::ime::AssistiveWindowType::kUndoWindow}; |
| SetButtonHighlighted(button, true); |
| delegate_->AssistiveWindowButtonClicked(button); |
| } |
| |
| BEGIN_METADATA(UndoWindow) |
| END_METADATA |
| |
| } // namespace ime |
| } // namespace ui |