File: mahi_condensed_menu_view.cc

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (134 lines) | stat: -rw-r--r-- 4,866 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// 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 "chrome/browser/ui/views/mahi/mahi_condensed_menu_view.h"

#include <memory>
#include <string>
#include <utility>

#include "base/functional/bind.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_functions.h"
#include "chrome/browser/ui/views/mahi/mahi_menu_constants.h"
#include "chromeos/components/mahi/public/cpp/mahi_util.h"
#include "chromeos/components/mahi/public/cpp/mahi_web_contents_manager.h"
#include "chromeos/strings/grit/chromeos_strings.h"
#include "chromeos/ui/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/models/image_model.h"
#include "ui/color/color_id.h"
#include "ui/display/screen.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/layout/flex_layout_view.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/style/typography.h"
#include "ui/views/view.h"
#include "ui/views/view_shadow.h"
#include "ui/views/widget/widget.h"

namespace chromeos::mahi {

namespace {

constexpr int kButtonIconSize = 16;
constexpr int kButtonIconLabelSpacing = 8;
constexpr auto kButtonBorderInsets = gfx::Insets::VH(12, 16);

// View for the button which makes up most of the condensed Mahi menu.
class MahiCondensedMenuButton : public views::LabelButton {
  METADATA_HEADER(MahiCondensedMenuButton, views::LabelButton)

 public:
  MahiCondensedMenuButton() {
    SetCallback(base::BindRepeating(&MahiCondensedMenuButton::OnButtonClicked,
                                    weak_ptr_factory_.GetWeakPtr()));
    SetText(
        l10n_util::GetStringUTF16(IDS_ASH_MAHI_CONDENSED_MENU_BUTTON_LABEL));
    SetLabelStyle(views::style::STYLE_BODY_3_EMPHASIS);
    SetImageModel(views::Button::ButtonState::STATE_NORMAL,
                  ui::ImageModel::FromVectorIcon(
                      kMahiSparkIcon, ui::kColorSysOnSurface, kButtonIconSize));
    SetImageLabelSpacing(kButtonIconLabelSpacing);
    SetBorder(views::CreateEmptyBorder(kButtonBorderInsets));
    SetInstallFocusRingOnFocus(false);
  }
  MahiCondensedMenuButton(const MahiCondensedMenuButton&) = delete;
  MahiCondensedMenuButton& operator=(const MahiCondensedMenuButton&) = delete;
  ~MahiCondensedMenuButton() override = default;

  // views::LabelButton:
  void OnFocus() override { SetBackgroundHighlighted(true); }

  void OnBlur() override { SetBackgroundHighlighted(false); }

  void StateChanged(views::Button::ButtonState old_state) override {
    views::Button::StateChanged(old_state);
    SetBackgroundHighlighted(GetState() == views::Button::STATE_HOVERED);
  }

 private:
  void OnButtonClicked() {
    // TODO(b/324647147): Add separate button type for condensed menu.
    chromeos::MahiWebContentsManager::Get()->OnContextMenuClicked(
        display::Screen::GetScreen()
            ->GetDisplayNearestWindow(GetWidget()->GetNativeWindow())
            .id(),
        /*button_type=*/::chromeos::mahi::ButtonType::kSummary,
        /*question=*/std::u16string(),
        /*mahi_menu_bounds=*/
        parent() ? parent()->GetBoundsInScreen() : gfx::Rect());

    base::UmaHistogramEnumeration(kMahiContextMenuButtonClickHistogram,
                                  MahiMenuButton::kCondensedMenuButton);
  }

  void SetBackgroundHighlighted(bool background_highlighted) {
    if (background_highlighted) {
      SetBackground(views::CreateRoundedRectBackground(
          ui::kColorMenuItemBackgroundHighlighted,
          views::LayoutProvider::Get()->GetCornerRadiusMetric(
              views::ShapeContextTokens::kMenuRadius)));
    } else {
      SetBackground(nullptr);
    }
  }

  base::WeakPtrFactory<MahiCondensedMenuButton> weak_ptr_factory_{this};
};

BEGIN_METADATA(MahiCondensedMenuButton)
END_METADATA

}  // namespace

MahiCondensedMenuView::MahiCondensedMenuView()
    : view_shadow_(std::make_unique<views::ViewShadow>(this, /*elevation=*/2)) {
  const int corner_radius = views::LayoutProvider::Get()->GetCornerRadiusMetric(
      views::ShapeContextTokens::kMenuRadius);
  view_shadow_->SetRoundedCornerRadius(corner_radius);

  SetUseDefaultFillLayout(true);
  SetBackground(
      views::CreateRoundedRectBackground(ui::kColorSysSurface, corner_radius));

  menu_button_ = AddChildView(std::make_unique<MahiCondensedMenuButton>());
}

MahiCondensedMenuView::~MahiCondensedMenuView() = default;

void MahiCondensedMenuView::RequestFocus() {
  menu_button_->RequestFocus();
}

BEGIN_METADATA(MahiCondensedMenuView)
END_METADATA

}  // namespace chromeos::mahi