Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7203)

Unified Diff: chrome/browser/ui/views/toolbar/app_menu_button.cc

Issue 2860163002: WIP - allow vector icons to specify motion.
Patch Set: checkpoint Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/toolbar/app_menu_button.h ('k') | testing/gmock/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/toolbar/app_menu_button.cc
diff --git a/chrome/browser/ui/views/toolbar/app_menu_button.cc b/chrome/browser/ui/views/toolbar/app_menu_button.cc
index 272cc0d040ab95740e921be83559b1e7ada2e5b5..fc154b97f089d88c468e3cdc3b8b251c10f4dc71 100644
--- a/chrome/browser/ui/views/toolbar/app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu_button.cc
@@ -21,15 +21,16 @@
#include "chrome/browser/ui/toolbar/app_menu_model.h"
#include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
#include "chrome/browser/ui/views/toolbar/app_menu.h"
-#include "chrome/browser/ui/views/toolbar/app_menu_animation.h"
#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/theme_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/theme_provider.h"
+#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/paint_vector_icon.h"
+#include "ui/gfx/scoped_canvas.h"
#include "ui/keyboard/keyboard_controller.h"
#include "ui/views/controls/button/label_button_border.h"
#include "ui/views/controls/menu/menu_listener.h"
@@ -39,6 +40,57 @@ namespace {
const float kIconSize = 16;
} // namespace
+namespace internal {
+
+class VectorIconAnimator {
+ public:
+ explicit VectorIconAnimator(const gfx::VectorIcon& icon)
+ : icon_(icon), duration_(gfx::GetDurationOfAnimation(icon)) {}
+ ~VectorIconAnimator() {}
+
+ void Start(const base::Closure& animation_callback) {
+ start_time_ = base::TimeTicks::Now();
+ timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(17), this,
+ &VectorIconAnimator::TimerFired);
+ callback_ = animation_callback;
+ }
+
+ base::TimeDelta GetElapsedTime() {
+ return base::TimeTicks::Now() - start_time_;
+ }
+
+ void PaintIcon(gfx::Canvas* canvas,
+ SkColor color,
+ const gfx::Point& position) {
+ if (timer_.IsRunning()) {
+ gfx::ScopedCanvas scoped(canvas);
+ canvas->Translate(position.OffsetFromOrigin());
+ base::TimeDelta elapsed = base::TimeTicks::Now() - start_time_;
+ gfx::PaintVectorIcon(canvas, icon_, color, &elapsed);
+ } else {
+ canvas->DrawImageInt(gfx::CreateVectorIcon(icon_, color), position.x(),
+ position.y());
+ }
+ }
+
+ private:
+ void TimerFired() {
+ if (duration_ > base::TimeTicks::Now() - start_time_)
+ timer_.Stop();
+
+ callback_.Run();
+ }
+
+ const gfx::VectorIcon& icon_;
+ base::Closure callback_;
+ base::TimeTicks start_time_;
+ base::RepeatingTimer timer_;
+ const base::TimeDelta duration_;
+
+ DISALLOW_COPY_AND_ASSIGN(VectorIconAnimator);
+};
+}
+
// static
bool AppMenuButton::g_open_app_immediately_for_testing = false;
@@ -131,7 +183,7 @@ gfx::Size AppMenuButton::GetPreferredSize() const {
}
void AppMenuButton::Layout() {
- if (animation_) {
+ if (animator_) {
ink_drop_container()->SetBoundsRect(GetLocalBounds());
image()->SetBoundsRect(GetLocalBounds());
return;
@@ -141,14 +193,14 @@ void AppMenuButton::Layout() {
}
void AppMenuButton::OnPaint(gfx::Canvas* canvas) {
- if (!animation_) {
+ if (!animator_) {
views::MenuButton::OnPaint(canvas);
return;
}
- gfx::Rect bounds = GetLocalBounds();
- bounds.Inset(gfx::Insets(ToolbarButton::kInteriorPadding));
- animation_->PaintAppMenu(canvas, bounds);
+ animator_->PaintIcon(canvas, SK_ColorRED,
+ gfx::Point(ToolbarButton::kInteriorPadding,
+ ToolbarButton::kInteriorPadding));
}
void AppMenuButton::TabInsertedAt(TabStripModel* tab_strip_model,
@@ -182,13 +234,12 @@ void AppMenuButton::UpdateIcon(bool should_animate) {
}
if (should_use_new_icon_) {
- if (!animation_)
- animation_ = base::MakeUnique<AppMenuAnimation>(this, toolbar_icon_color);
+ if (!animator_)
+ animator_.reset(
+ new internal::VectorIconAnimator(kBrowserToolsAnimatedIcon));
- animation_->set_target_color(severity_color);
if (should_animate)
AnimateIconIfPossible();
-
return;
}
@@ -218,21 +269,13 @@ void AppMenuButton::SetTrailingMargin(int margin) {
}
void AppMenuButton::AnimateIconIfPossible() {
- if (!animation_ || !should_use_new_icon_ ||
+ if (!animator_ || !should_use_new_icon_ ||
severity_ == AppMenuIconController::Severity::NONE) {
return;
}
- animation_->StartAnimation();
-}
-
-void AppMenuButton::AppMenuAnimationStarted() {
- SetPaintToLayer();
- layer()->SetFillsBoundsOpaquely(false);
-}
-
-void AppMenuButton::AppMenuAnimationEnded() {
- DestroyLayer();
+ animator_->Start(
+ base::Bind(&AppMenuButton::SchedulePaint, base::Unretained(this)));
}
const char* AppMenuButton::GetClassName() const {
« no previous file with comments | « chrome/browser/ui/views/toolbar/app_menu_button.h ('k') | testing/gmock/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698