OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/system/tray/system_tray.h" | 5 #include "ash/system/tray/system_tray.h" |
6 | 6 |
7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
8 #include "ash/shell/panel_window.h" | 8 #include "ash/shell/panel_window.h" |
9 #include "ash/shell_window_ids.h" | 9 #include "ash/shell_window_ids.h" |
10 #include "ash/system/tray/tray_constants.h" | 10 #include "ash/system/tray/tray_constants.h" |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include "grit/ash_strings.h" | 21 #include "grit/ash_strings.h" |
22 #include "third_party/skia/include/core/SkCanvas.h" | 22 #include "third_party/skia/include/core/SkCanvas.h" |
23 #include "third_party/skia/include/core/SkColor.h" | 23 #include "third_party/skia/include/core/SkColor.h" |
24 #include "third_party/skia/include/core/SkPaint.h" | 24 #include "third_party/skia/include/core/SkPaint.h" |
25 #include "third_party/skia/include/core/SkPath.h" | 25 #include "third_party/skia/include/core/SkPath.h" |
26 #include "ui/aura/root_window.h" | 26 #include "ui/aura/root_window.h" |
27 #include "ui/base/events.h" | 27 #include "ui/base/events.h" |
28 #include "ui/base/accessibility/accessible_view_state.h" | 28 #include "ui/base/accessibility/accessible_view_state.h" |
29 #include "ui/base/l10n/l10n_util.h" | 29 #include "ui/base/l10n/l10n_util.h" |
30 #include "ui/gfx/canvas.h" | 30 #include "ui/gfx/canvas.h" |
31 #include "ui/gfx/compositor/layer.h" | |
31 #include "ui/gfx/skia_util.h" | 32 #include "ui/gfx/skia_util.h" |
32 #include "ui/views/border.h" | 33 #include "ui/views/border.h" |
33 #include "ui/views/bubble/bubble_delegate.h" | 34 #include "ui/views/bubble/bubble_delegate.h" |
34 #include "ui/views/controls/label.h" | 35 #include "ui/views/controls/label.h" |
35 #include "ui/views/layout/fill_layout.h" | 36 #include "ui/views/layout/fill_layout.h" |
36 #include "ui/views/layout/box_layout.h" | 37 #include "ui/views/layout/box_layout.h" |
37 #include "ui/views/view.h" | 38 #include "ui/views/view.h" |
38 #include "ui/views/widget/widget.h" | 39 #include "ui/views/widget/widget.h" |
39 | 40 |
40 namespace ash { | 41 namespace ash { |
41 | 42 |
42 namespace { | 43 namespace { |
43 | 44 |
44 const int kPaddingFromRightEdgeOfScreen = 15; | 45 const int kPaddingFromRightEdgeOfScreen = 15; |
45 const int kPaddingFromBottomOfScreen = 10; | 46 const int kPaddingFromBottomOfScreen = 10; |
46 | 47 |
47 const int kAnimationDurationForPopupMS = 200; | 48 const int kAnimationDurationForPopupMS = 200; |
49 const int kTrayItemAnimationDurationMS = 200; | |
48 | 50 |
49 const int kArrowHeight = 10; | 51 const int kArrowHeight = 10; |
50 const int kArrowWidth = 20; | 52 const int kArrowWidth = 20; |
51 const int kArrowPaddingFromRight = 20; | 53 const int kArrowPaddingFromRight = 20; |
52 | 54 |
53 const int kShadowOffset = 3; | 55 const int kShadowOffset = 3; |
54 const int kShadowHeight = 3; | 56 const int kShadowHeight = 3; |
55 | 57 |
56 const int kLeftPadding = 4; | 58 const int kLeftPadding = 4; |
57 const int kBottomLineHeight = 1; | 59 const int kBottomLineHeight = 1; |
58 | 60 |
59 const int kTrayIconHeight = 29; | 61 const int kTrayIconHeight = 29; |
60 | 62 |
61 const SkColor kShadowColor = SkColorSetARGB(25, 0, 0, 0); | 63 const SkColor kShadowColor = SkColorSetARGB(25, 0, 0, 0); |
62 | 64 |
63 const SkColor kTrayBackgroundAlpha = 100; | 65 const SkColor kTrayBackgroundAlpha = 100; |
64 const SkColor kTrayBackgroundHoverAlpha = 150; | 66 const SkColor kTrayBackgroundHoverAlpha = 150; |
65 | 67 |
66 // Container for items in the tray. It makes sure the widget is updated | 68 // Container for items in the tray. It makes sure the widget is updated |
67 // correctly when the visibility/size of the tray item changes. | 69 // correctly when the visibility/size of the tray item changes. |
68 // TODO: setup animation. | 70 class TrayItemContainer : public views::View, |
69 class TrayItemContainer : public views::View { | 71 public ui::AnimationDelegate { |
70 public: | 72 public: |
71 explicit TrayItemContainer(views::View* view) : child_(view) { | 73 explicit TrayItemContainer(views::View* view) |
74 : child_(view), | |
75 processing_(false) { | |
72 AddChildView(child_); | 76 AddChildView(child_); |
73 SetVisible(child_->visible()); | 77 SetVisible(child_->visible()); |
78 | |
79 child_->SetPaintToLayer(true); | |
80 child_->SetFillsBoundsOpaquely(false); | |
74 } | 81 } |
75 | 82 |
76 virtual ~TrayItemContainer() {} | 83 virtual ~TrayItemContainer() {} |
77 | 84 |
78 private: | 85 private: |
79 // Makes sure the widget relayouts after the size/visibility of the view | 86 // Makes sure the widget relayouts after the size/visibility of the view |
80 // changes. | 87 // changes. |
81 void ApplyChange() { | 88 void ApplyChange() { |
82 // Forcing the widget to the new size is sufficient. The positing is taken | 89 // Forcing the widget to the new size is sufficient. The positioning is |
83 // care of by the layout manager (ShelfLayoutManager). | 90 // taken care of by the layout manager (ShelfLayoutManager). |
84 GetWidget()->SetSize(GetWidget()->GetContentsView()->GetPreferredSize()); | 91 GetWidget()->SetSize(GetWidget()->GetContentsView()->GetPreferredSize()); |
85 } | 92 } |
86 | 93 |
87 // Overridden from views::View. | 94 // Overridden from views::View. |
88 virtual void Layout() { | 95 virtual void Layout() { |
89 child_->SetBoundsRect(gfx::Rect(size())); | 96 child_->SetBoundsRect(gfx::Rect(size())); |
90 } | 97 } |
91 | 98 |
92 virtual gfx::Size GetPreferredSize() OVERRIDE { | 99 virtual gfx::Size GetPreferredSize() OVERRIDE { |
100 if (!animation_.get() || !animation_->is_animating()) | |
101 return child_->GetPreferredSize(); | |
93 gfx::Size size = child_->GetPreferredSize(); | 102 gfx::Size size = child_->GetPreferredSize(); |
103 size.set_width(std::max(1, | |
104 static_cast<int>(size.width() * animation_->GetCurrentValue()))); | |
94 size.set_height(kTrayIconHeight); | 105 size.set_height(kTrayIconHeight); |
95 return size; | 106 return size; |
96 } | 107 } |
97 | 108 |
98 virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { | 109 virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { |
99 ApplyChange(); | 110 ApplyChange(); |
100 } | 111 } |
101 | 112 |
102 virtual void ChildVisibilityChanged(views::View* child) OVERRIDE { | 113 virtual void ChildVisibilityChanged(views::View* child) OVERRIDE { |
103 if (visible() == child_->visible()) | 114 if (processing_) |
104 return; | 115 return; |
105 SetVisible(child_->visible()); | 116 processing_ = true; |
117 if (!animation_.get()) { | |
118 animation_.reset(new ui::SlideAnimation(this)); | |
119 animation_->SetSlideDuration(kTrayItemAnimationDurationMS); | |
120 animation_->SetTweenType(ui::Tween::LINEAR); | |
121 } | |
122 | |
123 if (!child_->visible()) { | |
124 // child_ is hiding. To animate nicely, it is necessary to redisplay the | |
125 // child view during animation. | |
126 child_->SetVisible(true); | |
sadrul
2012/04/02 20:41:12
This is a bit hacky. This can cause a bug if the i
| |
127 animation_->Hide(); | |
128 AnimationProgressed(animation_.get()); | |
129 } else { | |
130 SetVisible(true); | |
131 animation_->Show(); | |
132 AnimationProgressed(animation_.get()); | |
133 } | |
134 processing_ = false; | |
135 } | |
136 | |
137 // Overridden from ui::AnimationDelegate. | |
138 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE { | |
139 ui::Transform transform; | |
140 transform.SetScale(animation->GetCurrentValue(), | |
141 animation->GetCurrentValue()); | |
142 transform.ConcatTranslate(0, animation->CurrentValueBetween( | |
143 static_cast<double>(height()) / 2, 0.)); | |
144 child_->layer()->SetTransform(transform); | |
106 ApplyChange(); | 145 ApplyChange(); |
107 } | 146 } |
108 | 147 |
148 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE { | |
149 processing_ = true; | |
150 if (animation->GetCurrentValue() < 0.1) { | |
151 child_->SetVisible(false); | |
152 SetVisible(false); | |
153 } else { | |
154 child_->SetVisible(true); | |
155 SetVisible(true); | |
156 } | |
157 processing_ = false; | |
158 } | |
159 | |
160 virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE { | |
161 AnimationEnded(animation); | |
162 } | |
163 | |
109 views::View* child_; | 164 views::View* child_; |
165 bool processing_; | |
166 scoped_ptr<ui::SlideAnimation> animation_; | |
110 | 167 |
111 DISALLOW_COPY_AND_ASSIGN(TrayItemContainer); | 168 DISALLOW_COPY_AND_ASSIGN(TrayItemContainer); |
112 }; | 169 }; |
113 | 170 |
114 // A view with some special behaviour for tray items in the popup: | 171 // A view with some special behaviour for tray items in the popup: |
115 // - changes background color on hover. | 172 // - changes background color on hover. |
116 // - TODO: accessibility | 173 // - TODO: accessibility |
117 class TrayPopupItemContainer : public views::View { | 174 class TrayPopupItemContainer : public views::View { |
118 public: | 175 public: |
119 explicit TrayPopupItemContainer(views::View* view) : hover_(false) { | 176 explicit TrayPopupItemContainer(views::View* view) : hover_(false) { |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
660 popup_->Hide(); | 717 popup_->Hide(); |
661 } | 718 } |
662 } | 719 } |
663 return base::EVENT_CONTINUE; | 720 return base::EVENT_CONTINUE; |
664 } | 721 } |
665 | 722 |
666 void SystemTray::DidProcessEvent(const base::NativeEvent& event) { | 723 void SystemTray::DidProcessEvent(const base::NativeEvent& event) { |
667 } | 724 } |
668 | 725 |
669 } // namespace ash | 726 } // namespace ash |
OLD | NEW |