| // Copyright 2019 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 "ash/autoclick/autoclick_scroll_position_handler.h" |
| |
| #include "ash/resources/vector_icons/vector_icons.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/gfx/animation/tween.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/color_palette.h" |
| #include "ui/gfx/geometry/point.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/gfx/image/image_skia.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| #include "ui/views/controls/image_view.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace ash { |
| |
| class AutoclickScrollPositionView : public views::View { |
| public: |
| AutoclickScrollPositionView(); |
| AutoclickScrollPositionView(const AutoclickScrollPositionView&) = delete; |
| AutoclickScrollPositionView& operator=(const AutoclickScrollPositionView&) = |
| delete; |
| ~AutoclickScrollPositionView() override = default; |
| |
| protected: |
| // views::View: |
| void OnPaintBackground(gfx::Canvas* canvas) override; |
| }; |
| |
| AutoclickScrollPositionView::AutoclickScrollPositionView() { |
| SetLayoutManager(std::make_unique<views::FillLayout>()); |
| AddChildView(std::make_unique<views::ImageView>()) |
| ->SetImage( |
| gfx::CreateVectorIcon(kAutoclickScrollIcon, 24, SK_ColorWHITE)); |
| } |
| |
| void AutoclickScrollPositionView::OnPaintBackground(gfx::Canvas* canvas) { |
| cc::PaintFlags flags; |
| flags.setAntiAlias(true); |
| flags.setColor(gfx::kGoogleGrey600); |
| canvas->DrawCircle(GetLocalBounds().CenterPoint(), width() / 2, flags); |
| } |
| |
| // static |
| constexpr base::TimeDelta AutoclickScrollPositionHandler::kOpaqueTime; |
| constexpr base::TimeDelta AutoclickScrollPositionHandler::kFadeTime; |
| |
| AutoclickScrollPositionHandler::AutoclickScrollPositionHandler( |
| std::unique_ptr<views::Widget> widget) |
| : widget_(std::move(widget)), |
| timer_(FROM_HERE, |
| kOpaqueTime, |
| static_cast<gfx::Animation*>(&animation_), |
| &gfx::Animation::Start) { |
| widget_->SetContentsView(std::make_unique<AutoclickScrollPositionView>()); |
| } |
| |
| AutoclickScrollPositionHandler::~AutoclickScrollPositionHandler() = default; |
| |
| gfx::NativeView AutoclickScrollPositionHandler::GetNativeView() { |
| return widget_->GetNativeView(); |
| } |
| |
| void AutoclickScrollPositionHandler::SetScrollPointCenterInScreen( |
| const gfx::Point& scroll_point_center) { |
| constexpr int kBackgroundSizeDips = 32; |
| gfx::Rect bounds(gfx::Size(kBackgroundSizeDips, kBackgroundSizeDips)); |
| bounds.set_origin(scroll_point_center - |
| bounds.CenterPoint().OffsetFromOrigin()); |
| widget_->SetBounds(bounds); |
| widget_->Show(); |
| widget_->SetOpacity(1.0f); |
| |
| timer_.Reset(); |
| } |
| |
| void AutoclickScrollPositionHandler::AnimationProgressed( |
| const gfx::Animation* animation) { |
| constexpr float kSteadyStateOpacity = 0.5f; |
| widget_->SetOpacity(gfx::Tween::FloatValueBetween( |
| animation_.GetCurrentValue(), 1.0f, kSteadyStateOpacity)); |
| } |
| |
| } // namespace ash |