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(); |
+} |