15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/linear_animation.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/tween.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Slide Animation
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for reversible animations and as a general helper class. Typical usage:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// #include "ui/gfx/animation/slide_animation.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class MyClass : public AnimationDelegate {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   MyClass() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     animation_.reset(new SlideAnimation(this));
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     animation_->SetSlideDuration(500);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   void OnMouseOver() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     animation_->Show();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   void OnMouseOut() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     animation_->Hide();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   void AnimationProgressed(const Animation* animation) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     if (animation == animation_.get()) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       Layout();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       SchedulePaint();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     } else if (animation == other_animation_.get()) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       ...
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   void Layout() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     if (animation_->is_animating()) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       hover_image_.SetOpacity(animation_->GetCurrentValue());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  private:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   scoped_ptr<SlideAnimation> animation_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class GFX_EXPORT SlideAnimation : public LinearAnimation {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SlideAnimation(AnimationDelegate* target);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SlideAnimation();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the animation back to the 0 state.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset(double value);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begin a showing animation or reverse a hiding animation in progress.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Show();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begin a hiding animation or reverse a showing animation in progress.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Hide();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the time a slide will take. Note that this isn't actually
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the amount of time an animation will take as the current value of
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the slide is considered.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSlideDuration(int duration);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetSlideDuration() const { return slide_duration_; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTweenType(Tween::Type tween_type) { tween_type_ = tween_type; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual double GetCurrentValue() const OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsShowing() const { return showing_; }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsClosing() const { return !showing_ && value_end_ < value_current_; }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class TestApi;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Animation.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimateToState(double state) OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AnimationDelegate* target_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tween::Type tween_type_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to determine which way the animation is going.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool showing_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Animation values. These are a layer on top of Animation::state_ to
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provide the reversability.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double value_start_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double value_end_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double value_current_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // How long a hover in/out animation will last for. This defaults to
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kHoverFadeDurationMS, but can be overridden with SetDuration.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int slide_duration_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SlideAnimation);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace gfx
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif  // UI_GFX_ANIMATION_SLIDE_ANIMATION_H_
102