File: toggle_button.h

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 (131 lines) | stat: -rw-r--r-- 4,129 bytes parent folder | download | duplicates (5)
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
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_VIEWS_CONTROLS_BUTTON_TOGGLE_BUTTON_H_
#define UI_VIEWS_CONTROLS_BUTTON_TOGGLE_BUTTON_H_

#include <optional>
#include <variant>

#include "base/memory/raw_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/color/color_id.h"
#include "ui/color/color_variant.h"
#include "ui/gfx/animation/slide_animation.h"
#include "ui/views/controls/button/button.h"

namespace ui {
class Event;
}  // namespace ui

namespace views {

// This view presents a button that has two states: on and off. This is similar
// to a checkbox but has no text and looks more like a two-state horizontal
// slider.
class VIEWS_EXPORT ToggleButton : public Button {
  METADATA_HEADER(ToggleButton, Button)

 public:
  explicit ToggleButton(PressedCallback callback = PressedCallback());
  ToggleButton(PressedCallback callback, bool has_thumb_shadow);

  ToggleButton(const ToggleButton&) = delete;
  ToggleButton& operator=(const ToggleButton&) = delete;

  ~ToggleButton() override;

  // AnimateIsOn() animates the state change to |is_on|; SetIsOn() doesn't.
  void AnimateIsOn(bool is_on);
  void SetIsOn(bool is_on);
  bool GetIsOn() const;

  // Sets custom thumb and track colors.
  void SetThumbOnColor(ui::ColorVariant thumb_on_color);
  void SetThumbOffColor(ui::ColorVariant thumb_off_color);
  void SetTrackOnColor(ui::ColorVariant track_on_color);
  void SetTrackOffColor(ui::ColorVariant track_off_color);

  // Sets if the inner border is drawn. If `enabled`, it is drawn when the
  // switch is off. If `enabled` is false, it's never drawn.
  void SetInnerBorderEnabled(bool enabled);
  bool GetInnerBorderEnabled() const;

  void SetAcceptsEvents(bool accepts_events);
  bool GetAcceptsEvents() const;

  // views::View:
  void AddLayerToRegion(ui::Layer* layer, LayerRegion region) override;
  void RemoveLayerFromRegions(ui::Layer* layer) override;
  gfx::Size CalculatePreferredSize(
      const SizeBounds& /*available_size*/) const override;

 protected:
  // views::View:
  void OnThemeChanged() override;

  // views::Button:
  void NotifyClick(const ui::Event& event) override;
  void StateChanged(ButtonState old_state) override;
  void UpdateAccessibleCheckedState() override;

  // Returns the path to draw the focus ring around for this ToggleButton.
  virtual SkPath GetFocusRingPath() const;

  // Calculates and returns the bounding box for the track.
  virtual gfx::Rect GetTrackBounds() const;

  // Calculates and returns the bounding box for the thumb (the circle).
  virtual gfx::Rect GetThumbBounds() const;

  // Gets current slide animation progress.
  double GetAnimationProgress() const;

 private:
  friend class TestToggleButton;
  class FocusRingHighlightPathGenerator;
  class ThumbView;

  // Updates position of the thumb.
  void UpdateThumb();

  SkColor GetTrackColor(bool is_on) const;

  SkColor GetHoverColor() const;
  SkColor GetPressedColor() const;

  // views::View:
  bool CanAcceptEvent(const ui::Event& event) override;
  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;

  // Button:
  void PaintButtonContents(gfx::Canvas* canvas) override;

  // gfx::AnimationDelegate:
  void AnimationEnded(const gfx::Animation* animation) override;
  void AnimationProgressed(const gfx::Animation* animation) override;

  bool inner_border_enabled_ = true;

  gfx::SlideAnimation slide_animation_{this};
  gfx::SlideAnimation hover_animation_{this};
  raw_ptr<ThumbView> thumb_view_;

  std::optional<ui::ColorVariant> track_on_color_;
  std::optional<ui::ColorVariant> track_off_color_;

  // When false, this button won't accept input. Different from View::SetEnabled
  // in that the view retains focus when this is false but not when disabled.
  bool accepts_events_ = true;
};

BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ToggleButton, Button)
VIEW_BUILDER_PROPERTY(bool, IsOn)
END_VIEW_BUILDER

}  // namespace views

DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ToggleButton)

#endif  // UI_VIEWS_CONTROLS_BUTTON_TOGGLE_BUTTON_H_