| 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];
|
|
|