| Index: ui/views/animation/ink_drop_host_view.cc
|
| diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc
|
| index ed5569c38f9707a308adbda0c07c114ee17657fe..49d59d64fd70f9971711f9a5fede98a095f02172 100644
|
| --- a/ui/views/animation/ink_drop_host_view.cc
|
| +++ b/ui/views/animation/ink_drop_host_view.cc
|
| @@ -4,10 +4,14 @@
|
|
|
| #include "ui/views/animation/ink_drop_host_view.h"
|
|
|
| +#include "ui/events/event.h"
|
| +#include "ui/events/scoped_target_handler.h"
|
| #include "ui/gfx/color_palette.h"
|
| #include "ui/gfx/geometry/size_conversions.h"
|
| #include "ui/views/animation/ink_drop.h"
|
| +#include "ui/views/animation/ink_drop_factory.h"
|
| #include "ui/views/animation/ink_drop_highlight.h"
|
| +#include "ui/views/animation/ink_drop_stub.h"
|
| #include "ui/views/animation/square_ink_drop_ripple.h"
|
|
|
| namespace views {
|
| @@ -30,8 +34,74 @@ gfx::Size CalculateLargeInkDropSize(const gfx::Size small_size) {
|
| // static
|
| const int InkDropHostView::kInkDropSmallCornerRadius = 2;
|
|
|
| +// An EventHandler that is guaranteed to be invoked and is not prone to
|
| +// InkDropHostView descendents who do not call
|
| +// InkDropHostView::OnGestureEvent().
|
| +//
|
| +// TODO(bruthig): Consider getting rid of this class.
|
| +class InkDropHostView::InkDropGestureHandler : public ui::EventHandler {
|
| + public:
|
| + InkDropGestureHandler(View* view, InkDrop* ink_drop)
|
| + : ink_drop_(ink_drop), target_handler_(view, this) {}
|
| +
|
| + ~InkDropGestureHandler() override {}
|
| +
|
| + // ui::EventHandler:
|
| + void OnGestureEvent(ui::GestureEvent* event) override {
|
| + InkDropState current_ink_drop_state = ink_drop_->GetTargetInkDropState();
|
| +
|
| + InkDropState ink_drop_state = InkDropState::HIDDEN;
|
| + switch (event->type()) {
|
| + case ui::ET_GESTURE_TAP_DOWN:
|
| + ink_drop_state = InkDropState::ACTION_PENDING;
|
| + // The ui::ET_GESTURE_TAP_DOWN event needs to be marked as handled so
|
| + // that
|
| + // subsequent events for the gesture are sent to |this|.
|
| + event->SetHandled();
|
| + break;
|
| + case ui::ET_GESTURE_LONG_PRESS:
|
| + ink_drop_state = InkDropState::ALTERNATE_ACTION_PENDING;
|
| + break;
|
| + case ui::ET_GESTURE_LONG_TAP:
|
| + ink_drop_state = InkDropState::ALTERNATE_ACTION_TRIGGERED;
|
| + break;
|
| + case ui::ET_GESTURE_END:
|
| + if (current_ink_drop_state == InkDropState::ACTIVATED)
|
| + return;
|
| + // Fall through to ui::ET_GESTURE_SCROLL_BEGIN case.
|
| + case ui::ET_GESTURE_SCROLL_BEGIN:
|
| + ink_drop_state = InkDropState::HIDDEN;
|
| + break;
|
| + default:
|
| + return;
|
| + }
|
| +
|
| + if (ink_drop_state == InkDropState::HIDDEN &&
|
| + (current_ink_drop_state == InkDropState::ACTION_TRIGGERED ||
|
| + current_ink_drop_state == InkDropState::ALTERNATE_ACTION_TRIGGERED ||
|
| + current_ink_drop_state == InkDropState::DEACTIVATED)) {
|
| + // These InkDropStates automatically transition to the HIDDEN state so we
|
| + // don't make an explicit call. Explicitly animating to HIDDEN in this
|
| + // case would prematurely pre-empt these animations.
|
| + return;
|
| + }
|
| + ink_drop_->AnimateToState(ink_drop_state);
|
| + }
|
| +
|
| + private:
|
| + // Animation controller for the ink drop ripple effect.
|
| + InkDrop* ink_drop_;
|
| +
|
| + // An instance of ScopedTargetHandler allowing |this| to handle events.
|
| + ui::ScopedTargetHandler target_handler_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(InkDropGestureHandler);
|
| +};
|
| +
|
| InkDropHostView::InkDropHostView()
|
| - : ink_drop_size_(kInkDropSize, kInkDropSize), destroying_(false) {}
|
| + : ink_drop_(new InkDropStub()),
|
| + ink_drop_size_(kInkDropSize, kInkDropSize),
|
| + destroying_(false) {}
|
|
|
| InkDropHostView::~InkDropHostView() {
|
| // TODO(bruthig): Improve InkDropImpl to be safer about calling back to
|
| @@ -75,14 +145,28 @@ std::unique_ptr<InkDropHighlight> InkDropHostView::CreateInkDropHighlight()
|
|
|
| void InkDropHostView::OnFocus() {
|
| views::View::OnFocus();
|
| - if (ink_drop_delegate() && ShouldShowInkDropForFocus())
|
| - ink_drop_delegate()->GetInkDrop()->SetFocused(true);
|
| + if (ShouldShowInkDropForFocus())
|
| + ink_drop()->SetFocused(true);
|
| }
|
|
|
| void InkDropHostView::OnBlur() {
|
| views::View::OnBlur();
|
| - if (ink_drop_delegate() && ShouldShowInkDropForFocus())
|
| - ink_drop_delegate()->GetInkDrop()->SetFocused(false);
|
| + if (ShouldShowInkDropForFocus())
|
| + ink_drop()->SetFocused(false);
|
| +}
|
| +
|
| +void InkDropHostView::OnMouseEvent(ui::MouseEvent* event) {
|
| + switch (event->type()) {
|
| + case ui::ET_MOUSE_ENTERED:
|
| + ink_drop_->SetHovered(true);
|
| + break;
|
| + case ui::ET_MOUSE_EXITED:
|
| + ink_drop_->SetHovered(false);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + View::OnMouseEvent(event);
|
| }
|
|
|
| gfx::Point InkDropHostView::GetInkDropCenter() const {
|
| @@ -98,4 +182,18 @@ bool InkDropHostView::ShouldShowInkDropForFocus() const {
|
| return false;
|
| }
|
|
|
| +void InkDropHostView::SetHasInkDrop(bool has_an_ink_drop) {
|
| + if (has_an_ink_drop) {
|
| + ink_drop_ = InkDropFactory::CreateInkDrop(this);
|
| + gesture_handler_.reset(new InkDropGestureHandler(this, ink_drop_.get()));
|
| + } else {
|
| + gesture_handler_.reset();
|
| + ink_drop_.reset(new InkDropStub());
|
| + }
|
| +}
|
| +
|
| +void InkDropHostView::AnimateInkDrop(InkDropState ink_drop_state) {
|
| + ink_drop_->AnimateToState(ink_drop_state);
|
| +}
|
| +
|
| } // namespace views
|
|
|