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_
|