| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 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 |
| 5 #include "ash/common/system/tray/system_menu_toggle_button.h" |
| 6 |
| 7 #include "ash/common/ash_constants.h" |
| 8 #include "ash/common/system/tray/tray_constants.h" |
| 9 #include "ui/base/l10n/l10n_util.h" |
| 10 #include "ui/views/controls/button/toggle_button.h" |
| 11 #include "ui/views/layout/box_layout.h" |
| 12 #include "ui/views/painter.h" |
| 13 |
| 14 namespace ash { |
| 15 |
| 16 // TODO(tdanderson): Update the focus rect color, border thickness, and |
| 17 // location for material design. |
| 18 SystemMenuToggleButton::SystemMenuToggleButton(views::ButtonListener* listener, |
| 19 int accessible_name_id) |
| 20 : views::Button(nullptr), |
| 21 focus_painter_(views::Painter::CreateSolidFocusPainter(kFocusBorderColor, |
| 22 gfx::Insets(1))) { |
| 23 SetTooltipText(l10n_util::GetStringUTF16(accessible_name_id)); |
| 24 |
| 25 // Center ToggleButton in this container. |
| 26 views::BoxLayout* container_layout = |
| 27 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); |
| 28 container_layout->set_main_axis_alignment( |
| 29 views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); |
| 30 container_layout->set_cross_axis_alignment( |
| 31 views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); |
| 32 SetLayoutManager(container_layout); |
| 33 |
| 34 toggle_ = new views::ToggleButton(listener); |
| 35 toggle_->SetFocusForPlatform(); |
| 36 AddChildView(toggle_); |
| 37 } |
| 38 |
| 39 SystemMenuToggleButton::~SystemMenuToggleButton() {} |
| 40 |
| 41 void SystemMenuToggleButton::SetIsOn(bool is_on, bool animate) { |
| 42 toggle_->SetIsOn(is_on, animate); |
| 43 } |
| 44 |
| 45 bool SystemMenuToggleButton::is_on() const { |
| 46 return toggle_->is_on(); |
| 47 } |
| 48 |
| 49 void SystemMenuToggleButton::NativeViewHierarchyChanged() { |
| 50 views::FocusManager* focus_manager = GetFocusManager(); |
| 51 if (focus_manager_ != focus_manager) { |
| 52 UnregisterFocusObserver(); |
| 53 if (focus_manager) |
| 54 RegisterFocusObserver(); |
| 55 } |
| 56 views::Button::NativeViewHierarchyChanged(); |
| 57 } |
| 58 |
| 59 void SystemMenuToggleButton::ViewHierarchyChanged( |
| 60 const ViewHierarchyChangedDetails& details) { |
| 61 if (details.is_add) { |
| 62 RegisterFocusObserver(); |
| 63 } else if (details.child == this) { |
| 64 UnregisterFocusObserver(); |
| 65 } |
| 66 } |
| 67 |
| 68 gfx::Size SystemMenuToggleButton::GetPreferredSize() const { |
| 69 return gfx::Size(kMenuButtonSize, kMenuButtonSize); |
| 70 } |
| 71 |
| 72 int SystemMenuToggleButton::GetHeightForWidth(int w) const { |
| 73 // Make row height fixed avoiding layout manager adjustments. |
| 74 return GetPreferredSize().height(); |
| 75 } |
| 76 |
| 77 void SystemMenuToggleButton::OnPaint(gfx::Canvas* canvas) { |
| 78 // Call the base class first to paint any background/borders. |
| 79 views::Button::OnPaint(canvas); |
| 80 if (toggle_->HasFocus()) { |
| 81 views::Painter::PaintPainterAt(canvas, focus_painter(), GetLocalBounds()); |
| 82 } |
| 83 } |
| 84 |
| 85 void SystemMenuToggleButton::OnWillChangeFocus(views::View* focused_before, |
| 86 views::View* focused_now) {} |
| 87 |
| 88 void SystemMenuToggleButton::OnDidChangeFocus(views::View* focused_before, |
| 89 views::View* focused_now) { |
| 90 if (focused_now == toggle_ || focused_before == toggle_) |
| 91 SchedulePaint(); |
| 92 } |
| 93 |
| 94 void SystemMenuToggleButton::RegisterFocusObserver() { |
| 95 if (!GetWidget()) |
| 96 return; |
| 97 views::FocusManager* focus_manager = GetFocusManager(); |
| 98 if (focus_manager_ == focus_manager) |
| 99 return; |
| 100 focus_manager_ = focus_manager; |
| 101 if (focus_manager_) |
| 102 focus_manager_->AddFocusChangeListener(this); |
| 103 } |
| 104 |
| 105 void SystemMenuToggleButton::UnregisterFocusObserver() { |
| 106 if (GetWidget() && focus_manager_) { |
| 107 focus_manager_->RemoveFocusChangeListener(this); |
| 108 focus_manager_ = NULL; |
| 109 } |
| 110 } |
| 111 |
| 112 } // namespace ash |
| OLD | NEW |