Index: ash/system/tray/tray_item_view.cc |
diff --git a/ash/system/tray/tray_item_view.cc b/ash/system/tray/tray_item_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..22a605b68048c119d635d9657d11b901df27acf4 |
--- /dev/null |
+++ b/ash/system/tray/tray_item_view.cc |
@@ -0,0 +1,114 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ash/system/tray/tray_item_view.h" |
+ |
+#include "ui/base/animation/slide_animation.h" |
+#include "ui/gfx/compositor/layer.h" |
+#include "ui/views/controls/image_view.h" |
+#include "ui/views/controls/label.h" |
+#include "ui/views/layout/fill_layout.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace { |
+const int kTrayIconHeight = 29; |
+const int kTrayItemAnimationDurationMS = 200; |
+} |
+ |
+namespace ash { |
+namespace internal { |
+ |
+TrayItemView::TrayItemView() |
+ : label_(NULL), |
+ image_view_(NULL) { |
+ SetPaintToLayer(true); |
+ SetFillsBoundsOpaquely(false); |
+ SetLayoutManager(new views::FillLayout); |
+} |
+ |
+TrayItemView::~TrayItemView() {} |
+ |
+void TrayItemView::CreateLabel() { |
+ label_ = new views::Label; |
+ AddChildView(label_); |
+} |
+ |
+void TrayItemView::CreateImageView() { |
+ image_view_ = new views::ImageView; |
+ AddChildView(image_view_); |
+} |
+ |
+void TrayItemView::SetVisible(bool set_visible) { |
+ if (!GetWidget()) { |
+ views::View::SetVisible(set_visible); |
+ return; |
+ } |
+ |
+ if (!animation_.get()) { |
+ animation_.reset(new ui::SlideAnimation(this)); |
+ animation_->SetSlideDuration(GetAnimationDurationMS()); |
+ animation_->SetTweenType(ui::Tween::LINEAR); |
+ animation_->Reset(visible() ? 1.0 : 0.0); |
+ } |
+ |
+ if (!set_visible) { |
+ animation_->Hide(); |
+ AnimationProgressed(animation_.get()); |
+ } else { |
+ animation_->Show(); |
+ AnimationProgressed(animation_.get()); |
+ views::View::SetVisible(true); |
+ } |
+} |
+ |
+void TrayItemView::ApplyChange() { |
+ // Forcing the widget to the new size is sufficient. The positioning is |
+ // taken care of by the layout manager (ShelfLayoutManager). |
+ GetWidget()->SetSize(GetWidget()->GetContentsView()->GetPreferredSize()); |
+} |
+ |
+gfx::Size TrayItemView::DesiredSize() { |
+ return views::View::GetPreferredSize(); |
+} |
+ |
+int TrayItemView::GetAnimationDurationMS() { |
+ return kTrayItemAnimationDurationMS; |
+} |
+ |
+void TrayItemView::PreferredSizeChanged() { |
+ views::View::PreferredSizeChanged(); |
+ ApplyChange(); |
+} |
+ |
+gfx::Size TrayItemView::GetPreferredSize() { |
+ gfx::Size size = DesiredSize(); |
+ size.set_height(kTrayIconHeight); |
+ if (!animation_.get() || !animation_->is_animating()) |
+ return size; |
+ size.set_width(std::max(1, |
+ static_cast<int>(size.width() * animation_->GetCurrentValue()))); |
+ return size; |
+} |
+ |
+void TrayItemView::AnimationProgressed(const ui::Animation* animation) { |
+ ui::Transform transform; |
+ transform.SetScale(animation->GetCurrentValue(), |
+ animation->GetCurrentValue()); |
+ transform.ConcatTranslate(0, animation->CurrentValueBetween( |
+ static_cast<double>(height()) / 2, 0.)); |
+ layer()->SetTransform(transform); |
+ ApplyChange(); |
+} |
+ |
+void TrayItemView::AnimationEnded(const ui::Animation* animation) { |
+ if (animation->GetCurrentValue() < 0.1) |
+ views::View::SetVisible(false); |
+} |
+ |
+void TrayItemView::AnimationCanceled(const ui::Animation* animation) { |
+ AnimationEnded(animation); |
+} |
+ |
+} // namespace internal |
+} // namespace ash |