tray_item_view.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Use of this source code is governed by a BSD-style license that can be
35f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// found in the LICENSE file.
45f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
55f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ash/system/tray/tray_item_view.h"
65f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
75f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ash/shelf/shelf_types.h"
85f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ash/system/tray/system_tray.h"
95f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ash/system/tray/system_tray_item.h"
105f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/base/animation/slide_animation.h"
115f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/compositor/layer.h"
125f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/views/controls/image_view.h"
135f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/views/controls/label.h"
145f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/views/layout/box_layout.h"
155f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "ui/views/widget/widget.h"
165f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
175f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgnamespace {
185f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgconst int kTrayIconHeight = 29;
195f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgconst int kTrayIconWidth = 29;
205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgconst int kTrayItemAnimationDurationMS = 200;
215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
225f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgnamespace ash {
245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgnamespace internal {
255f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgTrayItemView::TrayItemView(SystemTrayItem* owner)
275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    : owner_(owner),
285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      label_(NULL),
295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      image_view_(NULL) {
305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  SetPaintToLayer(true);
315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  SetFillsBoundsOpaquely(false);
325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  SetLayoutManager(
335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgTrayItemView::~TrayItemView() {}
375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid TrayItemView::CreateLabel() {
395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  label_ = new views::Label;
405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  AddChildView(label_);
415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
435f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid TrayItemView::CreateImageView() {
445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  image_view_ = new views::ImageView;
455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  AddChildView(image_view_);
465f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid TrayItemView::SetVisible(bool set_visible) {
495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (!GetWidget()) {
505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    views::View::SetVisible(set_visible);
515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    return;
525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
545f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (!animation_.get()) {
555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_.reset(new ui::SlideAnimation(this));
565f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_->SetSlideDuration(GetAnimationDurationMS());
575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_->SetTweenType(ui::Tween::LINEAR);
585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_->Reset(visible() ? 1.0 : 0.0);
595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
615f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (!set_visible) {
625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_->Hide();
635f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    AnimationProgressed(animation_.get());
645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  } else {
655f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    animation_->Show();
665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    AnimationProgressed(animation_.get());
675f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    views::View::SetVisible(true);
685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
715f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orggfx::Size TrayItemView::DesiredSize() {
725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return views::View::GetPreferredSize();
735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgint TrayItemView::GetAnimationDurationMS() {
765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return kTrayItemAnimationDurationMS;
775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
785f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orggfx::Size TrayItemView::GetPreferredSize() {
805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  gfx::Size size = DesiredSize();
815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (owner()->system_tray()->shelf_alignment() == SHELF_ALIGNMENT_BOTTOM ||
825f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      owner()->system_tray()->shelf_alignment() == SHELF_ALIGNMENT_TOP)
835f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    size.set_height(kTrayIconHeight);
845f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  else
855f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    size.set_width(kTrayIconWidth);
865f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (!animation_.get() || !animation_->is_animating())
875f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    return size;
885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  size.set_width(std::max(1,
895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      static_cast<int>(size.width() * animation_->GetCurrentValue())));
905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return size;
915f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid TrayItemView::ChildPreferredSizeChanged(views::View* child) {
945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  PreferredSizeChanged();
955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid TrayItemView::AnimationProgressed(const ui::Animation* animation) {
985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  gfx::Transform transform;
995f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  transform.Translate(0, animation->CurrentValueBetween(
1005f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      static_cast<double>(height()) / 2, 0.));
1015f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  transform.Scale(animation->GetCurrentValue(),
1025f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                  animation->GetCurrentValue());
1035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  layer()->SetTransform(transform);
1045f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  PreferredSizeChanged();
10531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org}
10631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
107void TrayItemView::AnimationEnded(const ui::Animation* animation) {
108  if (animation->GetCurrentValue() < 0.1)
109    views::View::SetVisible(false);
110}
111
112void TrayItemView::AnimationCanceled(const ui::Animation* animation) {
113  AnimationEnded(animation);
114}
115
116}  // namespace internal
117}  // namespace ash
118