blob: 18a80b4a631e825f3fe28027e8cac1704207e11d [file] [log] [blame]
// Copyright 2015 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.
#ifndef UI_VIEWS_ANIMATION_INK_DROP_HIGHLIGHT_H_
#define UI_VIEWS_ANIMATION_INK_DROP_HIGHLIGHT_H_
#include <iosfwd>
#include <memory>
#include "base/macros.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/transform.h"
#include "ui/views/views_export.h"
namespace gfx {
class Rect;
}
namespace ui {
class Layer;
class CallbackLayerAnimationObserver;
} // namespace ui
namespace views {
namespace test {
class InkDropHighlightTestApi;
} // namespace test
class BasePaintedLayerDelegate;
class InkDropHighlightObserver;
// Manages fade in/out animations for a painted Layer that is used to provide
// visual feedback on ui::Views for highlight states (e.g. mouse hover, keyboard
// focus).
class VIEWS_EXPORT InkDropHighlight {
public:
enum AnimationType { FADE_IN, FADE_OUT };
// Creates a highlight with a specified painter.
InkDropHighlight(const gfx::PointF& center_point,
std::unique_ptr<BasePaintedLayerDelegate> layer_delegate);
// Creates a highlight that paints a partially transparent roundrect with
// color |color|.
InkDropHighlight(const gfx::Size& size,
int corner_radius,
const gfx::PointF& center_point,
SkColor color);
virtual ~InkDropHighlight();
void set_observer(InkDropHighlightObserver* observer) {
observer_ = observer;
}
void set_explode_size(const gfx::Size& size) { explode_size_ = size; }
// Returns true if the highlight animation is either in the process of fading
// in or is fully visible.
bool IsFadingInOrVisible() const;
// Fades in the highlight visual over the given |duration|.
void FadeIn(const base::TimeDelta& duration);
// Fades out the highlight visual over the given |duration|. If |explode| is
// true then the highlight will animate a size increase in addition to the
// fade out.
void FadeOut(const base::TimeDelta& duration, bool explode);
// The root Layer that can be added in to a Layer tree.
ui::Layer* layer() { return layer_.get(); }
// Returns a test api to access internals of this. Default implmentations
// should return nullptr and test specific subclasses can override to return
// an instance.
virtual test::InkDropHighlightTestApi* GetTestApi();
private:
friend class test::InkDropHighlightTestApi;
// Animates a fade in/out as specified by |animation_type| combined with a
// transformation from the |initial_size| to the |target_size| over the given
// |duration|.
void AnimateFade(AnimationType animation_type,
const base::TimeDelta& duration,
const gfx::Size& initial_size,
const gfx::Size& target_size);
// Calculates the Transform to apply to |layer_| for the given |size|.
gfx::Transform CalculateTransform(const gfx::Size& size) const;
// The callback that will be invoked when a fade in/out animation is started.
void AnimationStartedCallback(
AnimationType animation_type,
const ui::CallbackLayerAnimationObserver& observer);
// The callback that will be invoked when a fade in/out animation is complete.
bool AnimationEndedCallback(
AnimationType animation_type,
const ui::CallbackLayerAnimationObserver& observer);
// The size of the highlight shape when fully faded in.
gfx::Size size_;
// The target size of the highlight shape when it expands during a fade out
// animation.
gfx::Size explode_size_;
// The center point of the highlight shape in the parent Layer's coordinate
// space.
gfx::PointF center_point_;
// The opacity for the fully visible state of the highlight.
float visible_opacity_;
// True if the last animation to be initiated was a FADE_IN, and false
// otherwise.
bool last_animation_initiated_was_fade_in_;
// The LayerDelegate that paints the highlight |layer_|.
std::unique_ptr<BasePaintedLayerDelegate> layer_delegate_;
// The visual highlight layer that is painted by |layer_delegate_|.
std::unique_ptr<ui::Layer> layer_;
InkDropHighlightObserver* observer_;
DISALLOW_COPY_AND_ASSIGN(InkDropHighlight);
};
// Returns a human readable string for |animation_type|. Useful for logging.
VIEWS_EXPORT std::string ToString(
InkDropHighlight::AnimationType animation_type);
// This is declared here for use in gtest-based unit tests but is defined in
// the views_test_support target. Depend on that to use this in your unit test.
// This should not be used in production code - call ToString() instead.
void PrintTo(InkDropHighlight::AnimationType animation_type,
::std::ostream* os);
} // namespace views
#endif // UI_VIEWS_ANIMATION_INK_DROP_HIGHLIGHT_H_