File: multitask_button.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (115 lines) | stat: -rw-r--r-- 4,442 bytes parent folder | download | duplicates (6)
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
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ui/frame/multitask_menu/multitask_button.h"

#include "chromeos/ui/frame/multitask_menu/multitask_menu_constants.h"
#include "chromeos/utils/haptics_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/events/devices/haptic_touchpad_effects.h"
#include "ui/gfx/canvas.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/controls/highlight_path_generator.h"

namespace chromeos {

MultitaskButton::MultitaskButton(PressedCallback callback,
                                 Type type,
                                 bool is_portrait_mode,
                                 bool paint_as_active,
                                 const std::u16string& name)
    : views::Button(std::move(callback)),
      type_(type),
      paint_as_active_(paint_as_active) {
  views::InstallRoundRectHighlightPathGenerator(
      this, gfx::Insets(), kMultitaskBaseButtonBorderRadius);
  GetViewAccessibility().SetName(name);
}

void MultitaskButton::StateChanged(views::Button::ButtonState old_state) {
  if (GetState() == views::Button::STATE_HOVERED) {
    haptics_util::PlayHapticTouchpadEffect(
        ui::HapticTouchpadEffect::kSnap,
        ui::HapticTouchpadEffectStrength::kMedium);
  }
}

void MultitaskButton::PaintButtonContents(gfx::Canvas* canvas) {
  cc::PaintFlags fill_flags;
  fill_flags.setAntiAlias(true);
  fill_flags.setStyle(cc::PaintFlags::kFill_Style);

  cc::PaintFlags border_flags;
  border_flags.setAntiAlias(true);
  border_flags.setStyle(cc::PaintFlags::kStroke_Style);

  cc::PaintFlags pattern_flags;
  pattern_flags.setAntiAlias(true);
  pattern_flags.setStyle(cc::PaintFlags::kFill_Style);

  const auto* color_provider = GetColorProvider();
  if (paint_as_active_ || GetState() == Button::STATE_HOVERED ||
      GetState() == Button::STATE_PRESSED) {
    const SkColor primary_color =
        color_provider->GetColor(ui::kColorSysPrimary);
    fill_flags.setColor(
        SkColorSetA(primary_color, kMultitaskHoverBackgroundOpacity));
    border_flags.setColor(primary_color);
    pattern_flags.setColor(primary_color);
  } else if (GetState() == Button::STATE_DISABLED) {
    fill_flags.setColor(SK_ColorTRANSPARENT);
    const SkColor disabled_color =
        SkColorSetA(color_provider->GetColor(ui::kColorSysOnSurface),
                    kMultitaskDisabledButtonOpacity);
    border_flags.setColor(disabled_color);
    pattern_flags.setColor(disabled_color);
  } else {
    fill_flags.setColor(SK_ColorTRANSPARENT);
    const auto default_color =
        SkColorSetA(color_provider->GetColor(ui::kColorSysOnSurface),
                    kMultitaskDefaultButtonOpacity);
    border_flags.setColor(default_color);
    pattern_flags.setColor(default_color);
  }

  const gfx::RectF local_bounds_f(GetLocalBounds());
  canvas->DrawRoundRect(local_bounds_f, kMultitaskBaseButtonBorderRadius,
                        fill_flags);

  // Draw a border on the background circle. Inset by half the stroke width,
  // otherwise half of the stroke will be out of bounds.
  gfx::RectF border_bounds = local_bounds_f;
  border_bounds.Inset(kButtonBorderSize / 2.f);
  border_flags.setStrokeWidth(kButtonBorderSize);
  canvas->DrawRoundRect(border_bounds, kMultitaskBaseButtonBorderRadius,
                        border_flags);

  gfx::RectF pattern_bounds;
  switch (type_) {
    case Type::kFloat: {
      // Float pattern is located at the bottom left or bottom right with a
      // little padding. Default is bottom right, mirrored is bottom left.
      gfx::Rect float_pattern_bounds(GetLocalBounds().bottom_right(),
                                     kFloatPatternSize);
      float_pattern_bounds.Offset(-kFloatPatternSize.width() - kButtonPadding,
                                  -kFloatPatternSize.height() - kButtonPadding);
      float_pattern_bounds = GetMirroredRect(float_pattern_bounds);
      pattern_bounds = gfx::RectF(float_pattern_bounds);
      break;
    }
    case Type::kFull: {
      pattern_bounds = local_bounds_f;
      pattern_bounds.Inset(gfx::InsetsF(kButtonPadding));
      break;
    }
  }

  canvas->DrawRoundRect(pattern_bounds, kButtonCornerRadius, pattern_flags);
}

BEGIN_METADATA(MultitaskButton)
END_METADATA

}  // namespace chromeos