Index: chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm |
diff --git a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm |
index 9d7934d3470c8e87e3184b26a5dd0ec18bec1efe..7322a777d4e3e1c1bf4954fbc4868a66f048c0dc 100644 |
--- a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm |
+++ b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm |
@@ -6,30 +6,19 @@ |
#include <algorithm> |
-#import "base/auto_reset.h" |
#include "base/command_line.h" |
#import "base/mac/mac_util.h" |
#include "base/mac/sdk_forward_declarations.h" |
#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h" |
+#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_animation_controller.h" |
#include "chrome/common/chrome_switches.h" |
-#import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSAnimation+Duration.h" |
#include "ui/base/cocoa/appkit_utils.h" |
#import "ui/base/cocoa/nsview_additions.h" |
#import "ui/base/cocoa/tracking_area.h" |
namespace { |
-// The duration of the toolbar show/hide animation. |
-const NSTimeInterval kDropdownAnimationDuration = 0.20; |
- |
-// If the fullscreen toolbar is hidden, it is difficult for the user to see |
-// changes in the tabstrip. As a result, if a tab is inserted or the current |
-// tab switched to a new one, the toolbar must animate in and out to display |
-// the tabstrip changes to the user. The animation drops down the toolbar and |
-// then wait for 0.75 seconds before it hides the toolbar. |
-const NSTimeInterval kTabStripChangesDelay = 0.75; |
- |
// Additional height threshold added at the toolbar's bottom. This is to mimic |
// threshold the mouse position needs to be at before the menubar automatically |
// hides. |
@@ -46,64 +35,6 @@ const CGFloat kToolbarVerticalOffset = 22; |
} // end namespace |
-// Helper class to manage animations for the dropdown bar. Calls |
-// [FullscreenToolbarController changeToolbarFraction] once per |
-// animation step. |
-@interface DropdownAnimation : NSAnimation { |
- @private |
- FullscreenToolbarController* controller_; |
- CGFloat startFraction_; |
- CGFloat endFraction_; |
- CGFloat toolbarFraction_; |
-} |
- |
-@property(readonly, nonatomic) CGFloat endFraction; |
-@property(readonly, nonatomic) CGFloat toolbarFraction; |
- |
-// Designated initializer. Asks |controller| for the current shown fraction, so |
-// if the bar is already partially shown or partially hidden, the animation |
-// duration may be less than |fullDuration|. |
-- (id)initWithFraction:(CGFloat)fromFraction |
- fullDuration:(CGFloat)fullDuration |
- animationCurve:(NSAnimationCurve)animationCurve |
- controller:(FullscreenToolbarController*)controller; |
- |
-@end |
- |
-@implementation DropdownAnimation |
- |
-@synthesize endFraction = endFraction_; |
-@synthesize toolbarFraction = toolbarFraction_; |
- |
-- (id)initWithFraction:(CGFloat)toFraction |
- fullDuration:(CGFloat)fullDuration |
- animationCurve:(NSAnimationCurve)animationCurve |
- controller:(FullscreenToolbarController*)controller { |
- // Calculate the effective duration, based on the current shown fraction. |
- DCHECK(controller); |
- CGFloat fromFraction = [controller toolbarFraction]; |
- CGFloat effectiveDuration = fabs(fullDuration * (fromFraction - toFraction)); |
- |
- if ((self = [super gtm_initWithDuration:effectiveDuration |
- eventMask:NSLeftMouseDownMask |
- animationCurve:animationCurve])) { |
- startFraction_ = fromFraction; |
- endFraction_ = toFraction; |
- controller_ = controller; |
- } |
- return self; |
-} |
- |
-// Called once per animation step. Overridden to change the floating bar's |
-// position based on the animation's progress. |
-- (void)setCurrentProgress:(NSAnimationProgress)progress { |
- toolbarFraction_ = |
- startFraction_ + (progress * (endFraction_ - startFraction_)); |
- [controller_ updateToolbar]; |
-} |
- |
-@end |
- |
@interface FullscreenToolbarController (PrivateMethods) |
// Updates the visibility of the menu bar and the dock. |
@@ -127,16 +58,6 @@ const CGFloat kToolbarVerticalOffset = 22; |
// |kFullScreenModeHideDock| when the overlay is shown. |
- (base::mac::FullScreenMode)desiredSystemFullscreenMode; |
-// Animate the overlay to the given visibility with animation. If |visible| |
-// is true, animate the toolbar to a fraction of 1.0. Otherwise it's 0.0. |
-- (void)animateToolbarVisibility:(BOOL)visible; |
- |
-// Cancels the timer for hiding the floating bar. |
-- (void)cancelHideTimer; |
- |
-// Methods called when the hide timers fire. Do not call directly. |
-- (void)hideTimerFire:(NSTimer*)timer; |
- |
// Stops any running animations, etc. |
- (void)cleanup; |
@@ -156,6 +77,7 @@ const CGFloat kToolbarVerticalOffset = 22; |
browserController_ = controller; |
systemFullscreenMode_ = base::mac::kFullScreenModeNormal; |
slidingStyle_ = style; |
+ animationController_.reset(new FullscreenToolbarAnimationController(self)); |
} |
return self; |
@@ -214,53 +136,17 @@ const CGFloat kToolbarVerticalOffset = 22; |
[self updateMenuBarAndDockVisibility]; |
} |
-- (void)lockBarVisibilityWithAnimation:(BOOL)animate { |
- base::AutoReset<BOOL> autoReset(&isLockingBarVisibility_, YES); |
- [self ensureOverlayShownWithAnimation:animate]; |
-} |
- |
-- (void)releaseBarVisibilityWithAnimation:(BOOL)animate { |
- base::AutoReset<BOOL> autoReset(&isReleasingBarVisibility_, YES); |
- [self ensureOverlayHiddenWithAnimation:animate]; |
-} |
- |
- (void)ensureOverlayShownWithAnimation:(BOOL)animate { |
- if (!inFullscreenMode_) |
- return; |
- |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode)) |
- return; |
- |
- if (self.slidingStyle != FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN) |
- return; |
- |
- [self cancelHideTimer]; |
- [self animateToolbarVisibility:YES]; |
+ animationController_->AnimateToolbarIn(); |
} |
- (void)ensureOverlayHiddenWithAnimation:(BOOL)animate { |
- if (!inFullscreenMode_) |
- return; |
- |
- if (self.slidingStyle != FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN) |
- return; |
- |
- if ([browserController_ isBarVisibilityLockedForOwner:nil]) |
- return; |
- |
- if ([self mouseInsideTrackingArea] || |
- [menubarTracker_ state] == FullscreenMenubarState::SHOWN) { |
- return; |
- } |
- |
- [self cancelHideTimer]; |
- [self animateToolbarVisibility:NO]; |
+ animationController_->AnimateToolbarOutIfPossible(); |
} |
+// Cancels any running animation and timers. |
- (void)cancelAnimationAndTimer { |
- [self cancelHideTimer]; |
- [currentAnimation_ stopAnimation]; |
- currentAnimation_.reset(); |
+ animationController_->StopAnimationAndTimer(); |
} |
- (void)revealToolbarForTabStripChanges { |
@@ -269,11 +155,7 @@ const CGFloat kToolbarVerticalOffset = 22; |
return; |
} |
- // Reveal the toolbar for tabstrip changes if the toolbar is hidden. |
- if (ui::IsCGFloatEqual([self toolbarFraction], kHideFraction)) { |
- isRevealingToolbarForTabStripChanges_ = YES; |
- [self ensureOverlayShownWithAnimation:YES]; |
- } |
+ animationController_->AnimateToolbarForTabstripChanges(); |
} |
- (void)setSystemFullscreenModeTo:(base::mac::FullScreenMode)mode { |
@@ -300,10 +182,8 @@ const CGFloat kToolbarVerticalOffset = 22; |
return; |
// If the menubar is gone, animate the toolbar out. |
- if ([menubarTracker_ state] == FullscreenMenubarState::HIDDEN) { |
- base::AutoReset<BOOL> autoReset(&shouldAnimateToolbarOut_, YES); |
+ if ([menubarTracker_ state] == FullscreenMenubarState::HIDDEN) |
[self ensureOverlayHiddenWithAnimation:YES]; |
- } |
[self removeTrackingAreaIfNecessary]; |
} |
@@ -311,6 +191,7 @@ const CGFloat kToolbarVerticalOffset = 22; |
- (void)updateToolbar { |
[browserController_ layoutSubviews]; |
[self updateTrackingArea]; |
+ animationController_->ToolbarDidUpdate(); |
// In AppKit fullscreen, moving the mouse to the top of the screen toggles |
// menu visibility. Replicate the same effect for immersive fullscreen. |
@@ -353,28 +234,30 @@ const CGFloat kToolbarVerticalOffset = 22; |
case FullscreenSlidingStyle::OMNIBOX_TABS_NONE: |
return kHideFraction; |
case FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN: |
- FullscreenMenubarState menubarState = [menubarTracker_ state]; |
- if (menubarState == FullscreenMenubarState::SHOWN) |
+ if ([self mustShowFullscreenToolbar]) |
return kShowFraction; |
- if ([self mouseInsideTrackingArea]) |
- return kShowFraction; |
+ if (animationController_->IsAnimationRunning()) |
+ return animationController_->GetToolbarFractionFromProgress(); |
- if (currentAnimation_.get()) |
- return [currentAnimation_ toolbarFraction]; |
+ return [menubarTracker_ menubarFraction]; |
+ } |
+} |
- if (isLockingBarVisibility_) |
- return kHideFraction; |
- else if (isReleasingBarVisibility_) |
- return kShowFraction; |
- else if ([browserController_ isBarVisibilityLockedForOwner:nil]) |
- return kShowFraction; |
+- (BOOL)mustShowFullscreenToolbar { |
+ if (!inFullscreenMode_) |
+ return NO; |
- if (hideTimer_.get() || shouldAnimateToolbarOut_) |
- return kShowFraction; |
+ if (slidingStyle_ == FullscreenSlidingStyle::OMNIBOX_TABS_PRESENT) |
+ return YES; |
- return [menubarTracker_ menubarFraction]; |
- } |
+ if (slidingStyle_ == FullscreenSlidingStyle::OMNIBOX_TABS_NONE) |
+ return NO; |
+ |
+ FullscreenMenubarState menubarState = [menubarTracker_ state]; |
+ return menubarState == FullscreenMenubarState::SHOWN || |
+ [self mouseInsideTrackingArea] || |
+ [browserController_ isBarVisibilityLockedForOwner:nil]; |
} |
- (BOOL)isFullscreenTransitionInProgress { |
@@ -398,31 +281,6 @@ const CGFloat kToolbarVerticalOffset = 22; |
NSMaxY(contentBounds) - trackingAreaFrame_.origin.y; |
} |
-- (void)animationDidStop:(NSAnimation*)animation { |
- if (isRevealingToolbarForTabStripChanges_) { |
- if ([self toolbarFraction] > 0.0) { |
- // Set the timer to hide the toolbar. |
- [hideTimer_ invalidate]; |
- hideTimer_.reset( |
- [[NSTimer scheduledTimerWithTimeInterval:kTabStripChangesDelay |
- target:self |
- selector:@selector(hideTimerFire:) |
- userInfo:nil |
- repeats:NO] retain]); |
- } else { |
- isRevealingToolbarForTabStripChanges_ = NO; |
- } |
- } |
- |
- // Reset the |currentAnimation_| pointer now that the animation is over. |
- currentAnimation_.reset(); |
-} |
- |
-- (void)animationDidEnd:(NSAnimation*)animation { |
- [self animationDidStop:animation]; |
- [self updateTrackingArea]; |
-} |
- |
@end |
@implementation FullscreenToolbarController (PrivateMethods) |
@@ -509,50 +367,8 @@ const CGFloat kToolbarVerticalOffset = 22; |
return base::mac::kFullScreenModeHideAll; |
} |
-- (void)animateToolbarVisibility:(BOOL)visible { |
- CGFloat fraction = visible ? kShowFraction : kHideFraction; |
- |
- // If we're already animating to the given fraction, then there's nothing |
- // more to do. |
- if (currentAnimation_ && [currentAnimation_ endFraction] == fraction) |
- return; |
- |
- // In all other cases, we want to cancel any running animation (which may be |
- // to show or to hide). |
- [currentAnimation_ stopAnimation]; |
- |
- // Create the animation and set it up. |
- currentAnimation_.reset([[DropdownAnimation alloc] |
- initWithFraction:fraction |
- fullDuration:kDropdownAnimationDuration |
- animationCurve:NSAnimationEaseOut |
- controller:self]); |
- DCHECK(currentAnimation_); |
- [currentAnimation_ setAnimationBlockingMode:NSAnimationNonblocking]; |
- [currentAnimation_ setDelegate:self]; |
- |
- // If there is an existing tracking area, remove it. We do not track mouse |
- // movements during animations (see class comment in the header file). |
- [self removeTrackingAreaIfNecessary]; |
- |
- [currentAnimation_ startAnimation]; |
-} |
- |
-- (void)cancelHideTimer { |
- [hideTimer_ invalidate]; |
- hideTimer_.reset(); |
-} |
- |
-- (void)hideTimerFire:(NSTimer*)timer { |
- DCHECK_EQ(hideTimer_, timer); // This better be our hide timer. |
- [hideTimer_ invalidate]; // Make sure it doesn't repeat. |
- hideTimer_.reset(); // And get rid of it. |
- base::AutoReset<BOOL> autoReset(&shouldAnimateToolbarOut_, YES); |
- [self animateToolbarVisibility:NO]; |
-} |
- |
- (void)cleanup { |
- [self cancelAnimationAndTimer]; |
+ animationController_->StopAnimationAndTimer(); |
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
[self removeTrackingAreaIfNecessary]; |