| Index: chrome/browser/chromeos/ui/autoclick_ring_handler.cc
|
| diff --git a/chrome/browser/chromeos/ui/autoclick_ring_handler.cc b/chrome/browser/chromeos/ui/autoclick_ring_handler.cc
|
| deleted file mode 100644
|
| index c0e3fda8471e31e2b30e975033968176995361e8..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/ui/autoclick_ring_handler.cc
|
| +++ /dev/null
|
| @@ -1,331 +0,0 @@
|
| -// Copyright 2016 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.
|
| -
|
| -#include "chrome/browser/chromeos/ui/autoclick_ring_handler.h"
|
| -
|
| -#include <memory>
|
| -
|
| -#include "ash/aura/wm_window_aura.h"
|
| -#include "ash/common/shell_window_ids.h"
|
| -#include "ash/common/wm/root_window_finder.h"
|
| -#include "ash/root_window_controller.h"
|
| -#include "ash/shell.h"
|
| -#include "third_party/skia/include/core/SkColor.h"
|
| -#include "third_party/skia/include/core/SkPaint.h"
|
| -#include "third_party/skia/include/core/SkPath.h"
|
| -#include "third_party/skia/include/core/SkRect.h"
|
| -#include "ui/aura/client/screen_position_client.h"
|
| -#include "ui/aura/env.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/aura/window_event_dispatcher.h"
|
| -#include "ui/compositor/layer.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/transform.h"
|
| -#include "ui/views/view.h"
|
| -#include "ui/views/widget/widget.h"
|
| -#include "ui/wm/core/coordinate_conversion.h"
|
| -
|
| -namespace chromeos {
|
| -namespace {
|
| -
|
| -const int kAutoclickRingOuterRadius = 30;
|
| -const int kAutoclickRingInnerRadius = 20;
|
| -
|
| -// Angles from x-axis at which the outer and inner circles start.
|
| -const int kAutoclickRingInnerStartAngle = -90;
|
| -
|
| -const int kAutoclickRingGlowWidth = 20;
|
| -// The following is half width to avoid division by 2.
|
| -const int kAutoclickRingArcWidth = 2;
|
| -
|
| -// Start and end values for various animations.
|
| -const double kAutoclickRingScaleStartValue = 1.0;
|
| -const double kAutoclickRingScaleEndValue = 1.0;
|
| -const double kAutoclickRingShrinkScaleEndValue = 0.5;
|
| -
|
| -const double kAutoclickRingOpacityStartValue = 0.1;
|
| -const double kAutoclickRingOpacityEndValue = 0.5;
|
| -const int kAutoclickRingAngleStartValue = -90;
|
| -// The sweep angle is a bit greater than 360 to make sure the circle
|
| -// completes at the end of the animation.
|
| -const int kAutoclickRingAngleEndValue = 360;
|
| -
|
| -// Visual constants.
|
| -const SkColor kAutoclickRingArcColor = SkColorSetARGB(255, 0, 255, 0);
|
| -const SkColor kAutoclickRingCircleColor = SkColorSetARGB(255, 0, 0, 255);
|
| -const int kAutoclickRingFrameRateHz = 60;
|
| -
|
| -views::Widget* CreateAutoclickRingWidget(aura::Window* root_window) {
|
| - views::Widget* widget = new views::Widget;
|
| - views::Widget::InitParams params;
|
| - params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
|
| - params.accept_events = false;
|
| - params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
|
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.context = root_window;
|
| - params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
|
| - params.parent = ash::Shell::GetContainer(
|
| - root_window, ash::kShellWindowId_OverlayContainer);
|
| -
|
| - widget->Init(params);
|
| - widget->SetOpacity(1.f);
|
| - return widget;
|
| -}
|
| -
|
| -void PaintAutoclickRingCircle(gfx::Canvas* canvas,
|
| - gfx::Point& center,
|
| - int radius) {
|
| - SkPaint paint;
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setStrokeWidth(2 * kAutoclickRingArcWidth);
|
| - paint.setColor(kAutoclickRingCircleColor);
|
| - paint.setAntiAlias(true);
|
| -
|
| - canvas->DrawCircle(center, radius, paint);
|
| -}
|
| -
|
| -void PaintAutoclickRingArc(gfx::Canvas* canvas,
|
| - const gfx::Point& center,
|
| - int radius,
|
| - int start_angle,
|
| - int end_angle) {
|
| - SkPaint paint;
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - paint.setStrokeWidth(2 * kAutoclickRingArcWidth);
|
| - paint.setColor(kAutoclickRingArcColor);
|
| - paint.setAntiAlias(true);
|
| -
|
| - SkPath arc_path;
|
| - arc_path.addArc(SkRect::MakeXYWH(center.x() - radius, center.y() - radius,
|
| - 2 * radius, 2 * radius),
|
| - start_angle, end_angle - start_angle);
|
| - canvas->DrawPath(arc_path, paint);
|
| -}
|
| -} // namespace
|
| -
|
| -// View of the AutoclickRingHandler. Draws the actual contents and updates as
|
| -// the animation proceeds. It also maintains the views::Widget that the
|
| -// animation is shown in.
|
| -class AutoclickRingHandler::AutoclickRingView : public views::View {
|
| - public:
|
| - AutoclickRingView(const gfx::Point& event_location, aura::Window* root_window)
|
| - : views::View(),
|
| - widget_(CreateAutoclickRingWidget(root_window)),
|
| - current_angle_(kAutoclickRingAngleStartValue),
|
| - current_scale_(kAutoclickRingScaleStartValue) {
|
| - widget_->SetContentsView(this);
|
| -
|
| - // We are owned by the AutoclickRingHandler.
|
| - set_owned_by_client();
|
| - SetNewLocation(event_location, root_window);
|
| - }
|
| -
|
| - ~AutoclickRingView() override {}
|
| -
|
| - void SetNewLocation(const gfx::Point& new_event_location,
|
| - aura::Window* root_window) {
|
| - gfx::Point point = new_event_location;
|
| - widget_->SetBounds(gfx::Rect(
|
| - point.x() - (kAutoclickRingOuterRadius + kAutoclickRingGlowWidth),
|
| - point.y() - (kAutoclickRingOuterRadius + kAutoclickRingGlowWidth),
|
| - GetPreferredSize().width(), GetPreferredSize().height()));
|
| - widget_->Show();
|
| - widget_->GetNativeView()->layer()->SetOpacity(
|
| - kAutoclickRingOpacityStartValue);
|
| - }
|
| -
|
| - void UpdateWithGrowAnimation(gfx::Animation* animation) {
|
| - // Update the portion of the circle filled so far and re-draw.
|
| - current_angle_ = animation->CurrentValueBetween(
|
| - kAutoclickRingInnerStartAngle, kAutoclickRingAngleEndValue);
|
| - current_scale_ = animation->CurrentValueBetween(
|
| - kAutoclickRingScaleStartValue, kAutoclickRingScaleEndValue);
|
| - widget_->GetNativeView()->layer()->SetOpacity(
|
| - animation->CurrentValueBetween(kAutoclickRingOpacityStartValue,
|
| - kAutoclickRingOpacityEndValue));
|
| - SchedulePaint();
|
| - }
|
| -
|
| - void UpdateWithShrinkAnimation(gfx::Animation* animation) {
|
| - current_angle_ = animation->CurrentValueBetween(
|
| - kAutoclickRingInnerStartAngle, kAutoclickRingAngleEndValue);
|
| - current_scale_ = animation->CurrentValueBetween(
|
| - kAutoclickRingScaleEndValue, kAutoclickRingShrinkScaleEndValue);
|
| - widget_->GetNativeView()->layer()->SetOpacity(
|
| - animation->CurrentValueBetween(kAutoclickRingOpacityStartValue,
|
| - kAutoclickRingOpacityEndValue));
|
| - SchedulePaint();
|
| - }
|
| -
|
| - private:
|
| - // Overridden from views::View.
|
| - gfx::Size GetPreferredSize() const override {
|
| - return gfx::Size(2 * (kAutoclickRingOuterRadius + kAutoclickRingGlowWidth),
|
| - 2 * (kAutoclickRingOuterRadius + kAutoclickRingGlowWidth));
|
| - }
|
| -
|
| - void OnPaint(gfx::Canvas* canvas) override {
|
| - gfx::Point center(GetPreferredSize().width() / 2,
|
| - GetPreferredSize().height() / 2);
|
| - canvas->Save();
|
| -
|
| - gfx::Transform scale;
|
| - scale.Scale(current_scale_, current_scale_);
|
| - // We want to scale from the center.
|
| - canvas->Translate(center.OffsetFromOrigin());
|
| - canvas->Transform(scale);
|
| - canvas->Translate(-center.OffsetFromOrigin());
|
| -
|
| - // Paint inner circle.
|
| - PaintAutoclickRingArc(canvas, center, kAutoclickRingInnerRadius,
|
| - kAutoclickRingInnerStartAngle, current_angle_);
|
| - // Paint outer circle.
|
| - PaintAutoclickRingCircle(canvas, center, kAutoclickRingOuterRadius);
|
| -
|
| - canvas->Restore();
|
| - }
|
| -
|
| - std::unique_ptr<views::Widget> widget_;
|
| - int current_angle_;
|
| - double current_scale_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AutoclickRingView);
|
| -};
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -// AutoclickRingHandler, public
|
| -AutoclickRingHandler::AutoclickRingHandler()
|
| - : gfx::LinearAnimation(kAutoclickRingFrameRateHz, nullptr),
|
| - tap_down_target_(nullptr),
|
| - current_animation_type_(AnimationType::NONE) {}
|
| -
|
| -AutoclickRingHandler::~AutoclickRingHandler() {
|
| - StopAutoclickRing();
|
| -}
|
| -
|
| -void AutoclickRingHandler::StartGesture(
|
| - base::TimeDelta duration,
|
| - const gfx::Point& center_point_in_screen) {
|
| - aura::Window* target = GetTargetWindow();
|
| - if (tap_down_target_ && tap_down_target_ != target)
|
| - return;
|
| - StopAutoclickRing();
|
| - SetTapDownTarget();
|
| - tap_down_location_ = center_point_in_screen;
|
| - current_animation_type_ = AnimationType::GROW_ANIMATION;
|
| - animation_duration_ = duration;
|
| - StartAnimation(base::TimeDelta());
|
| -}
|
| -
|
| -void AutoclickRingHandler::StopGesture() {
|
| - aura::Window* target = GetTargetWindow();
|
| - if (tap_down_target_ && tap_down_target_ != target)
|
| - return;
|
| - StopAutoclickRing();
|
| -}
|
| -
|
| -void AutoclickRingHandler::SetGestureCenter(
|
| - const gfx::Point& center_point_in_screen) {
|
| - tap_down_location_ = center_point_in_screen;
|
| -}
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -// AutoclickRingHandler, private
|
| -aura::Window* AutoclickRingHandler::GetTargetWindow() {
|
| - aura::Window* target = ash::WmWindowAura::GetAuraWindow(
|
| - ash::wm::GetRootWindowAt(tap_down_location_));
|
| - DCHECK(target) << "Root window not found while rendering autoclick circle;";
|
| - return target;
|
| -}
|
| -
|
| -void AutoclickRingHandler::SetTapDownTarget() {
|
| - aura::Window* target = GetTargetWindow();
|
| - SetTapDownTarget(target);
|
| -}
|
| -
|
| -void AutoclickRingHandler::StartAnimation(base::TimeDelta delay) {
|
| - int delay_ms = int{delay.InMilliseconds()};
|
| - switch (current_animation_type_) {
|
| - case AnimationType::GROW_ANIMATION: {
|
| - aura::Window* root_window = tap_down_target_->GetRootWindow();
|
| - view_.reset(new AutoclickRingView(tap_down_location_, root_window));
|
| - SetDuration(delay_ms);
|
| - Start();
|
| - break;
|
| - }
|
| - case AnimationType::SHRINK_ANIMATION: {
|
| - aura::Window* root_window = tap_down_target_->GetRootWindow();
|
| - view_.reset(new AutoclickRingView(tap_down_location_, root_window));
|
| - SetDuration(delay_ms);
|
| - Start();
|
| - break;
|
| - }
|
| - case AnimationType::NONE:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void AutoclickRingHandler::StopAutoclickRing() {
|
| - // Since, Animation::Stop() calls AnimationStopped(), we need to reset the
|
| - // |current_animation_type_| before Stop(), otherwise AnimationStopped() may
|
| - // start the timer again.
|
| - current_animation_type_ = AnimationType::NONE;
|
| - Stop();
|
| - view_.reset();
|
| - SetTapDownTarget(nullptr);
|
| -}
|
| -
|
| -void AutoclickRingHandler::SetTapDownTarget(aura::Window* target) {
|
| - if (tap_down_target_ == target)
|
| - return;
|
| -
|
| - if (tap_down_target_)
|
| - tap_down_target_->RemoveObserver(this);
|
| - tap_down_target_ = target;
|
| - if (tap_down_target_)
|
| - tap_down_target_->AddObserver(this);
|
| -}
|
| -
|
| -void AutoclickRingHandler::AnimateToState(double state) {
|
| - DCHECK(view_.get());
|
| - switch (current_animation_type_) {
|
| - case AnimationType::GROW_ANIMATION:
|
| - view_->SetNewLocation(tap_down_location_, GetTargetWindow());
|
| - view_->UpdateWithGrowAnimation(this);
|
| - break;
|
| - case AnimationType::SHRINK_ANIMATION:
|
| - view_->SetNewLocation(tap_down_location_, GetTargetWindow());
|
| - view_->UpdateWithShrinkAnimation(this);
|
| - break;
|
| - case AnimationType::NONE:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void AutoclickRingHandler::AnimationStopped() {
|
| - switch (current_animation_type_) {
|
| - case AnimationType::GROW_ANIMATION:
|
| - current_animation_type_ = AnimationType::SHRINK_ANIMATION;
|
| - StartAnimation(animation_duration_);
|
| - break;
|
| - case AnimationType::SHRINK_ANIMATION:
|
| - current_animation_type_ = AnimationType::NONE;
|
| - break;
|
| - case AnimationType::NONE:
|
| - // fall through to reset the view.
|
| - view_.reset();
|
| - SetTapDownTarget(nullptr);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void AutoclickRingHandler::OnWindowDestroying(aura::Window* window) {
|
| - DCHECK_EQ(tap_down_target_, window);
|
| - StopAutoclickRing();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|