Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Unified Diff: chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.mm

Issue 2355413007: [Mac] Refactor the Fullscreen Toolbar (Closed)
Patch Set: Nits and grits Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+}

Powered by Google App Engine
This is Rietveld 408576698