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

Side by Side Diff: chrome/browser/ui/search/toolbar_search_animator.cc

Issue 10662032: alternate ntp (cros/partial-win): add tab-related stuff and toolbar/tab background change (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed images from cl Created 8 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/search/toolbar_search_animator.h"
6
7 #include "chrome/browser/ui/search/search_model.h"
8 #include "chrome/browser/ui/search/search_types.h"
9 #include "chrome/browser/ui/search/toolbar_search_animator_observer.h"
10 #include "chrome/browser/ui/tab_contents/tab_contents.h"
11 #include "ui/base/animation/slide_animation.h"
12
13 namespace {
14
15 const int kBackgroundChangeDelayMs = 100;
16 const int kBackgroundChangeDurationMs = 200;
17
18 const int kMinOpacity = 0;
dhollowa 2012/06/26 18:16:27 As per sky's comment, these should be floats from
kuan 2012/06/26 23:25:49 Done.
19 const int kMaxOpacity = 0xFF;
20
21 } // namespace
22
23 namespace chrome {
24 namespace search {
25
26 ToolbarSearchAnimator::ToolbarSearchAnimator(SearchModel* search_model)
27 : search_model_(search_model),
28 animate_state_(ANIMATE_STATE_NONE) {
29 search_model_->AddObserver(this);
30 }
31
32 ToolbarSearchAnimator::~ToolbarSearchAnimator() {
33 Reset(false /* don't notify observers */, NULL);
sky 2012/06/26 17:11:27 Why do you need to reset in the destructor?
kuan 2012/06/26 23:25:49 i did it to stop timer and animation, but i guess
sky 2012/06/27 00:06:17 That's right.
34 search_model_->RemoveObserver(this);
35 }
36
37 void ToolbarSearchAnimator::GetCurrentBackgroundState(
38 BackgroundState* background_state,
39 int* new_background_opacity) const {
40 // Should only be called for SEARCH mode.
41 DCHECK(search_model_->mode().is_search());
42 *background_state = BACKGROUND_STATE_SHOW_NON_APPLICABLE;
43 *new_background_opacity = -1;
44 switch (animate_state_) {
45 case ANIMATE_STATE_WAITING:
46 *background_state = BACKGROUND_STATE_SHOW_NTP;
47 break;
48 case ANIMATE_STATE_RUNNING:
49 *background_state = BACKGROUND_STATE_SHOW_NTP_SEARCH;
50 *new_background_opacity = background_animation_->CurrentValueBetween(
51 kMinOpacity, kMaxOpacity);
52 break;
53 case ANIMATE_STATE_NONE:
54 break;
55 }
56 }
57
58 void ToolbarSearchAnimator::FinishAnimation(TabContents* tab_contents) {
59 Reset(true /* notify observers */, tab_contents);
60 }
61
62 void ToolbarSearchAnimator::AddObserver(
63 ToolbarSearchAnimatorObserver* observer) {
64 observers_.AddObserver(observer);
65 }
66
67 void ToolbarSearchAnimator::RemoveObserver(
68 ToolbarSearchAnimatorObserver* observer) {
69 observers_.RemoveObserver(observer);
70 }
71
72 void ToolbarSearchAnimator::ModeChanged(const Mode& mode) {
73 if (mode.is_search() && mode.animate &&
74 animate_state_ == ANIMATE_STATE_NONE) {
75 background_change_timer_.Start(
76 FROM_HERE,
77 base::TimeDelta::FromMilliseconds(kBackgroundChangeDelayMs),
78 this,
79 &ToolbarSearchAnimator::StartBackgroundChange);
80 animate_state_ = ANIMATE_STATE_WAITING;
81 return;
82 }
83 // For all other cases, reset |animate_state_| and stop timer or animation.
84 // Stopping animation will jump to the end of it.
85 Reset(true /* notify observers */, NULL);
86 }
87
88 void ToolbarSearchAnimator::AnimationProgressed(
89 const ui::Animation* animation) {
90 DCHECK(animation == background_animation_.get());
sky 2012/06/26 17:11:27 DCHECK_EQ
kuan 2012/06/26 23:25:49 Done.
91 animate_state_ = ANIMATE_STATE_RUNNING;
92 FOR_EACH_OBSERVER(ToolbarSearchAnimatorObserver, observers_,
93 BackgroundChanging());
94 }
95
96 void ToolbarSearchAnimator::AnimationEnded(const ui::Animation* animation) {
97 DCHECK(animation == background_animation_.get());
sky 2012/06/26 17:11:27 DCHECK_EG
kuan 2012/06/26 23:25:49 Done.
98 // Only notify observers via BackgroundChange if the animation has runs its
99 // full course i.e |animate_state_| is still ANIMATE_STATE_RUNNING.
100 // Animation that is canceled, i.e. |animate_state_| has been set to
101 // ANIMATE_STATE_NONE in Reset, should notify observers via
102 // BackgroundChangeCanceled.
103 if (animate_state_ == ANIMATE_STATE_RUNNING) {
104 animate_state_ = ANIMATE_STATE_NONE;
105 FOR_EACH_OBSERVER(ToolbarSearchAnimatorObserver, observers_,
106 BackgroundChanged());
107 }
108 }
109
110 void ToolbarSearchAnimator::StartBackgroundChange() {
111 if (!background_animation_.get()) {
112 background_animation_.reset(new ui::SlideAnimation(this));
113 background_animation_->SetTweenType(ui::Tween::LINEAR);
114 background_animation_->SetSlideDuration(kBackgroundChangeDurationMs);
115 }
116 background_animation_->Reset(0.0);
117 background_animation_->Show();
118 }
119
120 void ToolbarSearchAnimator::Reset(bool notify_observers,
121 TabContents* tab_contents) {
122 animate_state_ = ANIMATE_STATE_NONE;
123 background_change_timer_.Stop();
124 // If animation is still running, stopping it will trigger AnimationEnded
125 // where we've prevented from notifying observers via BackgroundChanged;
126 // see comments in AnimationEnded.
127 if (background_animation_.get())
128 background_animation_->Stop();
129 if (notify_observers) {
130 FOR_EACH_OBSERVER(ToolbarSearchAnimatorObserver, observers_,
131 BackgroundChangeCanceled(tab_contents));
132 }
133 }
134
135 } // namespace search
136 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698