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