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

Unified Diff: ios/chrome/browser/ui/no_tabs/no_tabs_controller.mm

Issue 2590473002: Upstream Chrome on iOS source code [5/11]. (Closed)
Patch Set: Created 4 years 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: ios/chrome/browser/ui/no_tabs/no_tabs_controller.mm
diff --git a/ios/chrome/browser/ui/no_tabs/no_tabs_controller.mm b/ios/chrome/browser/ui/no_tabs/no_tabs_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..286fdf44db291420c9b97b2017d5f9fcdd6629d4
--- /dev/null
+++ b/ios/chrome/browser/ui/no_tabs/no_tabs_controller.mm
@@ -0,0 +1,213 @@
+// Copyright 2012 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 "ios/chrome/browser/ui/no_tabs/no_tabs_controller.h"
+
+#include "base/logging.h"
+#include "base/mac/objc_property_releaser.h"
+#include "base/mac/scoped_nsobject.h"
+#import "ios/chrome/browser/ui/background_generator.h"
+#import "ios/chrome/browser/ui/no_tabs/no_tabs_controller_testing.h"
+#import "ios/chrome/browser/ui/no_tabs/no_tabs_toolbar_controller.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
+#import "ios/chrome/browser/ui/tools_menu/tools_menu_context.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+
+@interface NoTabsController (PrivateMethods)
+// Creates and installs the toolbar for the No-Tabs UI.
+- (void)installNoTabsToolbarInView:(UIView*)view;
+// Creates and installs the background view for the No-Tabs UI.
+- (void)installNoTabsBackgroundInView:(UIView*)view;
+// Returns the frame of a button's image view.
+- (CGRect)imageFrameForButton:(UIButton*)button inView:(UIView*)view;
+// Creates and installs the UIImageView that is used to animate the mode toggle
+// button.
+- (void)installNoTabsAnimationToggleImageForButton:(UIButton*)button
+ inView:(UIView*)view;
+@end
+
+@implementation NoTabsController {
+ // The No-Tabs toolbar.
+ base::scoped_nsobject<NoTabsToolbarController> toolbarController_;
+
+ // The parent view of the No-Tabs UI. Must outlive this object.
+ UIView* parentView_; // weak
+
+ // The background view behind the No-Tabs UI.
+ base::scoped_nsobject<UIView> backgroundView_;
+
+ // The image view used to animate the mode toggle button when entering or
+ // leaving the No-Tabs UI.
+ base::scoped_nsobject<UIImageView> modeToggleImageView_;
+
+ // The ending frame for the mode toggle button animation. Equal to CGRectZero
+ // if the mode toggle button is not being animated.
+ CGRect toggleImageEndFrame_;
+
+ base::mac::ObjCPropertyReleaser propertyReleaser_NoTabsController_;
+}
+
+// Designated initializer.
+- (id)initWithView:(UIView*)view {
+ self = [super init];
+ if (self) {
+ propertyReleaser_NoTabsController_.Init(self, [NoTabsController class]);
+
+ parentView_ = view;
+ [self installNoTabsToolbarInView:view];
+ [self installNoTabsBackgroundInView:view];
+ }
+ return self;
+}
+
+// Passes the call through to the toolbar controller.
+- (void)setHasModeToggleSwitch:(BOOL)hasModeToggle {
+ [toolbarController_ setHasModeToggleSwitch:hasModeToggle];
+}
+
+// Prepares the given button for animation.
+- (void)installAnimationImageForButton:(UIButton*)button
+ inView:(UIView*)view
+ show:(BOOL)show {
+ UIButton* fromButton = nil;
+ UIButton* toButton = nil;
+
+ if (show) {
+ fromButton = button;
+ toButton = [toolbarController_ modeToggleButton];
+ } else {
+ fromButton = [toolbarController_ modeToggleButton];
+ toButton = button;
+ }
+
+ [self installNoTabsAnimationToggleImageForButton:fromButton inView:view];
+ toggleImageEndFrame_ = [self imageFrameForButton:toButton inView:view];
+}
+
+- (void)showToolsMenuPopup {
+ base::scoped_nsobject<ToolsMenuContext> context(
+ [[ToolsMenuContext alloc] initWithDisplayView:parentView_]);
+ [context setNoOpenedTabs:YES];
+ [toolbarController_ showToolsMenuPopupWithContext:context];
+}
+
+- (void)dismissToolsMenuPopup {
+ [toolbarController_ dismissToolsMenuPopup];
+}
+
+- (void)prepareForShowAnimation {
+ CGFloat toolbarHeight = CGRectGetHeight([[toolbarController_ view] frame]);
+
+ // The toolbar icons start offscreen and animate in.
+ [toolbarController_
+ setControlsTransform:CGAffineTransformMakeTranslation(0, -toolbarHeight)];
+}
+
+- (void)showNoTabsUI {
+ [toolbarController_ setControlsTransform:CGAffineTransformIdentity];
+
+ if (modeToggleImageView_.get()) {
+ DCHECK(!CGRectEqualToRect(toggleImageEndFrame_, CGRectZero));
+ [modeToggleImageView_ setFrame:toggleImageEndFrame_];
+ toggleImageEndFrame_ = CGRectZero;
+ }
+}
+
+- (void)showAnimationDidFinish {
+ // When the animation is finished, remove the temporary toggle switch image.
+ [modeToggleImageView_ removeFromSuperview];
+ modeToggleImageView_.reset();
+}
+
+- (void)prepareForDismissAnimation {
+ // Hide the toolbar mode toggle button so that it does not visibly animate
+ // out.
+ [[toolbarController_ modeToggleButton] setHidden:YES];
+}
+
+- (void)dismissNoTabsUI {
+ CGFloat toolbarHeight = [[toolbarController_ view] frame].size.height;
+ [toolbarController_
+ setControlsTransform:CGAffineTransformMakeTranslation(0, -toolbarHeight)];
+
+ if (modeToggleImageView_.get()) {
+ DCHECK(!CGRectEqualToRect(toggleImageEndFrame_, CGRectZero));
+ [modeToggleImageView_ setFrame:toggleImageEndFrame_];
+ toggleImageEndFrame_ = CGRectZero;
+ }
+}
+
+- (void)dismissAnimationDidFinish {
+ [modeToggleImageView_ removeFromSuperview];
+ modeToggleImageView_.reset();
+ [backgroundView_ removeFromSuperview];
+ backgroundView_.reset();
+ [[toolbarController_ view] removeFromSuperview];
+ toolbarController_.reset();
+}
+
+// Creates and installs the toolbar for the No-Tabs UI.
+- (void)installNoTabsToolbarInView:(UIView*)view {
+ toolbarController_.reset([[NoTabsToolbarController alloc] initWithNoTabs]);
+ UIView* toolbarView = [toolbarController_ view];
+ CGFloat toolbarHeight = CGRectGetHeight(toolbarView.frame);
+
+ CGRect toolbarFrame = [view bounds];
+ toolbarFrame.origin.y = StatusBarHeight();
+ toolbarFrame.size.height = toolbarHeight;
+ toolbarView.frame = toolbarFrame;
+ [view addSubview:toolbarView];
+}
+
+// Creates and installs the background view for the No-Tabs UI.
+- (void)installNoTabsBackgroundInView:(UIView*)view {
+ DCHECK(toolbarController_);
+ UIView* toolbarView = [toolbarController_ view];
+
+ backgroundView_.reset([[UIView alloc] initWithFrame:view.bounds]);
+ [backgroundView_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth |
+ UIViewAutoresizingFlexibleHeight)];
+ InstallBackgroundInView(backgroundView_);
+ [view insertSubview:backgroundView_ belowSubview:toolbarView];
+}
+
+// Returns the frame of a button's image view.
+- (CGRect)imageFrameForButton:(UIButton*)button inView:(UIView*)view {
+ // Convert the existing button's bounds to the coordinate system of |view| and
+ // trim away any padding present in the button.
+ CGRect rect = UIEdgeInsetsInsetRect(button.bounds, button.imageEdgeInsets);
+ return [view convertRect:rect fromView:button];
+}
+
+// Installs the UIImageView that is used to animate the mode toggle switch while
+// the No-Tabs UI is shown or hidden. This image view is initially set up to
+// exactly cover the image of an existing button.
+- (void)installNoTabsAnimationToggleImageForButton:(UIButton*)button
+ inView:(UIView*)view {
+ UIImage* image = [button imageForState:UIControlStateNormal];
+ modeToggleImageView_.reset([[UIImageView alloc] initWithImage:image]);
+ [modeToggleImageView_
+ setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin |
+ UIViewAutoresizingFlexibleTopMargin)];
+ [modeToggleImageView_ setFrame:[self imageFrameForButton:button inView:view]];
+ [view addSubview:modeToggleImageView_];
+}
+
+@end
+
+#pragma mark - TestingAdditions
+
+@implementation NoTabsController (JustForTesting)
+- (UIButton*)modeToggleButton {
+ return [toolbarController_ modeToggleButton];
+}
+
+- (UIView*)toolbarView {
+ return [toolbarController_ view];
+}
+
+- (UIView*)backgroundView {
+ return backgroundView_.get();
+}
+@end
« no previous file with comments | « ios/chrome/browser/ui/no_tabs/no_tabs_controller.h ('k') | ios/chrome/browser/ui/no_tabs/no_tabs_controller_testing.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698