1 // Copyright 2014 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/system/user/button_from_view.h" 6 7 #include "ash/ash_constants.h" 8 #include "ash/system/tray/tray_constants.h" 9 #include "ui/gfx/canvas.h" 10 #include "ui/views/background.h" 11 #include "ui/views/border.h" 12 #include "ui/views/layout/box_layout.h" 13 14 namespace ash { 15 16 namespace { 17 18 // The border color of the user button. 19 const SkColor kBorderColor = 0xffdcdcdc; 20 21 } // namespace 22 23 namespace tray { 24 25 ButtonFromView::ButtonFromView(views::View* content, 26 views::ButtonListener* listener, 27 bool highlight_on_hover, 28 const gfx::Insets& tab_frame_inset) 29 : CustomButton(listener), 30 content_(content), 31 highlight_on_hover_(highlight_on_hover), 32 button_hovered_(false), 33 show_border_(false), 34 tab_frame_inset_(tab_frame_inset) { 35 set_notify_enter_exit_on_child(true); 36 SetLayoutManager( 37 new views::BoxLayout(views::BoxLayout::kHorizontal, 1, 1, 0)); 38 AddChildView(content_); 39 ShowActive(); 40 // Only make it focusable when we are active/interested in clicks. 41 if (listener) 42 SetFocusable(true); 43 } 44 45 ButtonFromView::~ButtonFromView() {} 46 47 void ButtonFromView::ForceBorderVisible(bool show) { 48 show_border_ = show; 49 ShowActive(); 50 } 51 52 void ButtonFromView::OnMouseEntered(const ui::MouseEvent& event) { 53 button_hovered_ = true; 54 ShowActive(); 55 } 56 57 void ButtonFromView::OnMouseExited(const ui::MouseEvent& event) { 58 button_hovered_ = false; 59 ShowActive(); 60 } 61 62 void ButtonFromView::OnPaint(gfx::Canvas* canvas) { 63 View::OnPaint(canvas); 64 if (HasFocus()) { 65 gfx::Rect rect(GetLocalBounds()); 66 rect.Inset(tab_frame_inset_); 67 canvas->DrawSolidFocusRect(rect, kFocusBorderColor); 68 } 69 } 70 71 void ButtonFromView::OnFocus() { 72 View::OnFocus(); 73 // Adding focus frame. 74 SchedulePaint(); 75 } 76 77 void ButtonFromView::OnBlur() { 78 View::OnBlur(); 79 // Removing focus frame. 80 SchedulePaint(); 81 } 82 83 void ButtonFromView::ShowActive() { 84 bool border_visible = 85 (button_hovered_ && highlight_on_hover_) || show_border_; 86 SkColor border_color = border_visible ? kBorderColor : SK_ColorTRANSPARENT; 87 SetBorder(views::Border::CreateSolidBorder(1, border_color)); 88 if (highlight_on_hover_) { 89 SkColor background_color = 90 button_hovered_ ? kHoverBackgroundColor : kBackgroundColor; 91 content_->set_background( 92 views::Background::CreateSolidBackground(background_color)); 93 set_background(views::Background::CreateSolidBackground(background_color)); 94 } 95 SchedulePaint(); 96 } 97 98 } // namespace tray 99 } // namespace ash 100