unified_slider_view.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/unified/unified_slider_view.h"
  5. #include "ash/style/ash_color_provider.h"
  6. #include "ash/system/tray/tray_popup_utils.h"
  7. #include "ui/base/l10n/l10n_util.h"
  8. #include "ui/compositor/layer.h"
  9. #include "ui/views/accessibility/view_accessibility.h"
  10. #include "ui/views/border.h"
  11. #include "ui/views/controls/label.h"
  12. #include "ui/views/layout/box_layout.h"
  13. #include "ui/views/view_class_properties.h"
  14. #include "ui/views/widget/widget.h"
  15. namespace ash {
  16. using ContentLayerType = AshColorProvider::ContentLayerType;
  17. namespace {
  18. // Custom the slider to use different colors.
  19. class SystemSlider : public views::Slider {
  20. public:
  21. explicit SystemSlider(views::SliderListener* listener = nullptr)
  22. : views::Slider(listener) {}
  23. SystemSlider(const SystemSlider&) = delete;
  24. SystemSlider& operator=(const SystemSlider&) = delete;
  25. ~SystemSlider() override {}
  26. private:
  27. // views::Slider:
  28. SkColor GetThumbColor() const override {
  29. using Type = AshColorProvider::ContentLayerType;
  30. return AshColorProvider::Get()->GetContentLayerColor(
  31. (style() == RenderingStyle::kMinimalStyle) ? Type::kSliderColorInactive
  32. : Type::kSliderColorActive);
  33. }
  34. // views::Slider:
  35. SkColor GetTroughColor() const override {
  36. return AshColorProvider::Get()->GetSecondToneColor(GetThumbColor());
  37. }
  38. // views::View:
  39. void OnThemeChanged() override {
  40. views::Slider::OnThemeChanged();
  41. SchedulePaint();
  42. }
  43. };
  44. // A slider that ignores inputs.
  45. class ReadOnlySlider : public SystemSlider {
  46. public:
  47. ReadOnlySlider() : SystemSlider() {}
  48. ReadOnlySlider(const ReadOnlySlider&) = delete;
  49. ReadOnlySlider& operator=(const ReadOnlySlider&) = delete;
  50. ~ReadOnlySlider() override {}
  51. private:
  52. // views::View:
  53. bool OnMousePressed(const ui::MouseEvent& event) override { return false; }
  54. bool OnMouseDragged(const ui::MouseEvent& event) override { return false; }
  55. void OnMouseReleased(const ui::MouseEvent& event) override {}
  56. bool OnKeyPressed(const ui::KeyEvent& event) override { return false; }
  57. const char* GetClassName() const override { return "ReadOnlySlider"; }
  58. // ui::EventHandler:
  59. void OnGestureEvent(ui::GestureEvent* event) override {}
  60. };
  61. std::unique_ptr<views::Slider> CreateSlider(UnifiedSliderListener* listener,
  62. bool readonly) {
  63. return readonly ? std::make_unique<ReadOnlySlider>()
  64. : std::make_unique<SystemSlider>(listener);
  65. }
  66. } // namespace
  67. UnifiedSliderView::UnifiedSliderView(views::Button::PressedCallback callback,
  68. UnifiedSliderListener* listener,
  69. const gfx::VectorIcon& icon,
  70. int accessible_name_id,
  71. bool readonly)
  72. : button_(
  73. AddChildView(std::make_unique<IconButton>(std::move(callback),
  74. IconButton::Type::kSmall,
  75. &icon,
  76. accessible_name_id,
  77. /*is_togglable=*/true,
  78. /*has_border=*/true))),
  79. slider_(AddChildView(CreateSlider(listener, readonly))) {
  80. auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
  81. views::BoxLayout::Orientation::kHorizontal, kUnifiedSliderRowPadding,
  82. kUnifiedSliderViewSpacing));
  83. // Prevent an accessibility event while initiallizing this view. Typically
  84. // the first update of the slider value is conducted by the caller function
  85. // to reflect the current value.
  86. slider_->SetEnableAccessibilityEvents(false);
  87. slider_->GetViewAccessibility().OverrideName(
  88. l10n_util::GetStringUTF16(accessible_name_id));
  89. slider_->SetBorder(views::CreateEmptyBorder(kUnifiedSliderPadding));
  90. slider_->SetPreferredSize(gfx::Size(0, kTrayItemSize));
  91. layout->SetFlexForView(slider_, 1);
  92. layout->set_cross_axis_alignment(
  93. views::BoxLayout::CrossAxisAlignment::kCenter);
  94. SetPaintToLayer();
  95. layer()->SetFillsBoundsOpaquely(false);
  96. }
  97. void UnifiedSliderView::SetSliderValue(float value, bool by_user) {
  98. // SetValue() calls |listener|, so we should ignore the call when the widget
  99. // is closed, because controllers are already deleted.
  100. // It should allow the case GetWidget() returning null, so that initial
  101. // position can be properly set by controllers before the view is attached to
  102. // a widget.
  103. if (GetWidget() && GetWidget()->IsClosed())
  104. return;
  105. slider_->SetValue(value);
  106. if (by_user)
  107. slider_->SetEnableAccessibilityEvents(true);
  108. }
  109. const char* UnifiedSliderView::GetClassName() const {
  110. return "UnifiedSliderView";
  111. }
  112. UnifiedSliderView::~UnifiedSliderView() = default;
  113. void UnifiedSliderView::CreateToastLabel() {
  114. toast_label_ = AddChildView(std::make_unique<views::Label>());
  115. TrayPopupUtils::SetLabelFontList(toast_label_,
  116. TrayPopupUtils::FontStyle::kPodMenuHeader);
  117. }
  118. void UnifiedSliderView::OnThemeChanged() {
  119. views::View::OnThemeChanged();
  120. if (toast_label_) {
  121. toast_label_->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
  122. AshColorProvider::ContentLayerType::kTextColorPrimary));
  123. }
  124. }
  125. } // namespace ash