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.
5 #include "chrome/browser/ui/tabs/hover_tab_selector.h"
8 #include "base/compiler_specific.h"
9 #include "base/message_loop/message_loop.h"
10 #include "chrome/browser/ui/tabs/tab_strip_model.h"
12 HoverTabSelector::HoverTabSelector(
13 TabStripModel
* tab_strip_model
)
14 : tab_strip_model_(tab_strip_model
),
15 tab_transition_tab_index_(-1),
17 DCHECK(tab_strip_model_
);
20 HoverTabSelector::~HoverTabSelector() {
23 void HoverTabSelector::StartTabTransition(int index
) {
24 // If there is a transition underway already, only start a new
25 // transition (canceling the old one) if the target tab differs.
26 if (weak_factory_
.HasWeakPtrs()) {
27 if (index
== tab_transition_tab_index_
)
29 CancelTabTransition();
31 // Start a new transition if the target isn't active already.
32 if (index
!= tab_strip_model_
->active_index()) {
33 // The delay between beginning to hover over a tab and the transition
34 // to that tab taking place.
35 const base::TimeDelta kHoverTransitionDelay
=
36 base::TimeDelta::FromMilliseconds(500);
37 tab_transition_tab_index_
= index
;
38 base::MessageLoop::current()->PostDelayedTask(
40 base::Bind(&HoverTabSelector::PerformTabTransition
,
41 weak_factory_
.GetWeakPtr()),
42 kHoverTransitionDelay
);
46 void HoverTabSelector::CancelTabTransition() {
47 weak_factory_
.InvalidateWeakPtrs();
50 void HoverTabSelector::PerformTabTransition() {
51 DCHECK(tab_transition_tab_index_
>= 0 &&
52 tab_transition_tab_index_
< tab_strip_model_
->count());
53 tab_strip_model_
->ActivateTabAt(tab_transition_tab_index_
, true);