| Index: chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.mm
|
| diff --git a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.mm b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eb857306ee11ac9c0f2162f1972a2e372e959a0d
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.mm
|
| @@ -0,0 +1,185 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#import "base/mac/mac_util.h"
|
| +#include "base/mac/sdk_forward_declarations.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#import "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| +#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_animation_manager.h"
|
| +#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h"
|
| +#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.h"
|
| +#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_visibility_locks_controller.h"
|
| +#import "chrome/browser/ui/cocoa/fullscreen/immersive_fullscreen_controller.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#import "ui/base/cocoa/nsview_additions.h"
|
| +
|
| +namespace {
|
| +
|
| +// The amount by which the toolbar is offset downwards (to avoid the menu)
|
| +// when the toolbar style is TOOLBAR_HIDDEN. (We can't use
|
| +// |-[NSMenu menuBarHeight]| since it returns 0 when the menu bar is hidden.)
|
| +const CGFloat kToolbarVerticalOffset = -22;
|
| +
|
| +} // end namespace
|
| +
|
| +//////////////////////////////////////////////////////////////////
|
| +// FullscreenToolbarLayoutManager, public:
|
| +
|
| +FullscreenToolbarLayoutManager::FullscreenToolbarLayoutManager(
|
| + BrowserWindowController* controller)
|
| + : browser_controller_(controller), in_fullscreen_(false) {
|
| + animation_manager_.reset(new FullscreenToolbarAnimationManager(this));
|
| + toolbar_visibility_locks_.reset(
|
| + [[FullscreenToolbarVisibilityLocksController alloc]
|
| + initWithFullscreenToolbarLayoutManager:this
|
| + animationManager:animation_manager_.get()]);
|
| +}
|
| +
|
| +FullscreenToolbarLayoutManager::~FullscreenToolbarLayoutManager() {
|
| + DCHECK(!in_fullscreen_);
|
| + browser_controller_ = nil;
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::EnterFullscreenMode() {
|
| + DCHECK(!in_fullscreen_);
|
| + in_fullscreen_ = true;
|
| +
|
| + if ([browser_controller_ isInImmersiveFullscreen]) {
|
| + immersive_fullscreen_controller_.reset(
|
| + [[ImmersiveFullscreenController alloc]
|
| + initWithBrowserController:browser_controller_]);
|
| + [immersive_fullscreen_controller_ updateMenuBarAndDockVisibility];
|
| + } else {
|
| + mouse_tracker_.reset([[FullscreenToolbarMouseTracker alloc]
|
| + initWithFullscreenToolbarLayoutManager:this
|
| + toolbarAnimationManager:animation_manager_.get()]);
|
| +
|
| + menubar_tracker_.reset([[FullscreenMenubarTracker alloc]
|
| + initWithFullscreenToolbarLayoutManager:this]);
|
| + }
|
| +
|
| + UpdateToolbarStyle();
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::ExitFullscreenMode() {
|
| + DCHECK(in_fullscreen_);
|
| + in_fullscreen_ = false;
|
| + CleanUp();
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::RevealToolbarForTabStripChanges() {
|
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableFullscreenToolbarReveal)) {
|
| + return;
|
| + }
|
| +
|
| + animation_manager_->AnimateToolbarForTabstripChanges();
|
| +}
|
| +
|
| +FullscreenToolbarLayout FullscreenToolbarLayoutManager::ComputeToolbarLayout()
|
| + const {
|
| + FullscreenToolbarLayout layout;
|
| +
|
| + layout.toolbarStyle = toolbar_style_;
|
| + layout.toolbarFraction = ComputeToolbarFraction();
|
| +
|
| + CGFloat menubar_fraction;
|
| + if (menubar_tracker_.get()) {
|
| + menubar_fraction = [menubar_tracker_ menubarFraction];
|
| + } else {
|
| + menubar_fraction =
|
| + [immersive_fullscreen_controller_ shouldShowMenubar] ? 1 : 0;
|
| + }
|
| +
|
| + layout.menubarOffset = std::floor(menubar_fraction * kToolbarVerticalOffset);
|
| +
|
| + return layout;
|
| +}
|
| +
|
| +bool FullscreenToolbarLayoutManager::MustShowFullscreenToolbar() const {
|
| + if (!in_fullscreen_)
|
| + return NO;
|
| +
|
| + if (toolbar_style_ == FullscreenToolbarStyle::TOOLBAR_PRESENT)
|
| + return YES;
|
| +
|
| + if (toolbar_style_ == FullscreenToolbarStyle::TOOLBAR_NONE)
|
| + return NO;
|
| +
|
| + FullscreenMenubarState menubarState = [menubar_tracker_ state];
|
| + return menubarState == FullscreenMenubarState::SHOWN ||
|
| + [mouse_tracker_ mouseInsideTrackingArea] ||
|
| + [toolbar_visibility_locks_ isToolbarVisibilityLocked];
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::UpdateFullscreenToolbarFrame(
|
| + NSRect frame) {
|
| + if (mouse_tracker_.get())
|
| + [mouse_tracker_ updateToolbarFrame:frame];
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::Layout() {
|
| + if (!in_fullscreen_)
|
| + return;
|
| +
|
| + [browser_controller_ layoutSubviews];
|
| + [mouse_tracker_ updateTrackingArea];
|
| + animation_manager_->UpdateToolbarFraction(ComputeToolbarFraction());
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::UpdateToolbarStyle() {
|
| + FullscreenToolbarStyle old_style = toolbar_style_;
|
| +
|
| + PrefService* prefs = [browser_controller_ profile]->GetPrefs();
|
| + shouldShowFullscreenToolbar_ =
|
| + prefs->GetBoolean(prefs::kShowFullscreenToolbar);
|
| +
|
| + if ([browser_controller_ isFullscreenForTabContentOrExtension]) {
|
| + toolbar_style_ = FullscreenToolbarStyle::TOOLBAR_NONE;
|
| + } else {
|
| + toolbar_style_ = shouldShowFullscreenToolbar_
|
| + ? FullscreenToolbarStyle::TOOLBAR_PRESENT
|
| + : FullscreenToolbarStyle::TOOLBAR_HIDDEN;
|
| + }
|
| +
|
| + if (old_style != toolbar_style_)
|
| + Layout();
|
| +}
|
| +
|
| +//////////////////////////////////////////////////////////////////
|
| +// FullscreenToolbarLayoutManager, private:
|
| +
|
| +CGFloat FullscreenToolbarLayoutManager::ComputeToolbarFraction() const {
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode))
|
| + return 0.0;
|
| +
|
| + if (!in_fullscreen_)
|
| + return 0.0;
|
| +
|
| + switch (toolbar_style_) {
|
| + case FullscreenToolbarStyle::TOOLBAR_PRESENT:
|
| + return 1.0;
|
| + case FullscreenToolbarStyle::TOOLBAR_NONE:
|
| + return 0.0;
|
| + case FullscreenToolbarStyle::TOOLBAR_HIDDEN:
|
| + if (MustShowFullscreenToolbar())
|
| + return 1.0;
|
| +
|
| + if (animation_manager_->IsAnimationRunning())
|
| + return animation_manager_->GetToolbarFraction();
|
| +
|
| + return [menubar_tracker_ menubarFraction];
|
| + }
|
| +}
|
| +
|
| +void FullscreenToolbarLayoutManager::CleanUp() {
|
| + mouse_tracker_.reset();
|
| + menubar_tracker_.reset();
|
| + animation_manager_->StopAnimationAndTimer();
|
| + immersive_fullscreen_controller_.reset();
|
| +}
|
|
|