| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar.h" | 5 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar.h" |
| 6 | 6 |
| 7 #import <QuartzCore/QuartzCore.h> | 7 #import <QuartzCore/QuartzCore.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/mac/objc_property_releaser.h" | 11 |
| 12 #include "base/mac/scoped_nsobject.h" | |
| 13 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" | 12 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" |
| 14 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar_button.h" | 13 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar_button.h" |
| 15 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar_item.h" | 14 #import "ios/chrome/browser/ui/ntp/new_tab_page_bar_item.h" |
| 16 #import "ios/chrome/browser/ui/rtl_geometry.h" | 15 #import "ios/chrome/browser/ui/rtl_geometry.h" |
| 17 #include "ios/chrome/browser/ui/ui_util.h" | 16 #include "ios/chrome/browser/ui/ui_util.h" |
| 18 #import "ios/chrome/browser/ui/uikit_ui_util.h" | 17 #import "ios/chrome/browser/ui/uikit_ui_util.h" |
| 19 #import "ui/gfx/ios/NSString+CrStringDrawing.h" | 18 #import "ui/gfx/ios/NSString+CrStringDrawing.h" |
| 20 #include "ui/gfx/scoped_ui_graphics_push_context_ios.h" | 19 #include "ui/gfx/scoped_ui_graphics_push_context_ios.h" |
| 21 | 20 |
| 21 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 22 #error "This file requires ARC support." |
| 23 #endif |
| 24 |
| 22 namespace { | 25 namespace { |
| 23 | 26 |
| 24 const CGFloat kBarHeight = 48.0f; | 27 const CGFloat kBarHeight = 48.0f; |
| 25 | 28 |
| 26 const CGFloat kRegularLayoutButtonWidth = 168; | 29 const CGFloat kRegularLayoutButtonWidth = 168; |
| 27 | 30 |
| 28 const int kOverlayViewColor = 0x5A7EF5; | 31 const int kOverlayViewColor = 0x5A7EF5; |
| 29 const int kOverlayColorWidth = 98; | 32 const int kOverlayColorWidth = 98; |
| 30 const int kNumberOfTabsIncognito = 2; | 33 const int kNumberOfTabsIncognito = 2; |
| 31 | 34 |
| 32 } // anonymous namespace | 35 } // anonymous namespace |
| 33 | 36 |
| 34 @interface NewTabPageBar () { | 37 @interface NewTabPageBar () { |
| 35 base::scoped_nsobject<UIImageView> shadow_; | 38 UIImageView* shadow_; |
| 36 } | 39 } |
| 37 | 40 |
| 38 @property(nonatomic, readwrite, retain) NSArray* buttons; | 41 @property(nonatomic, readwrite, strong) NSArray* buttons; |
| 39 @property(nonatomic, readwrite, retain) UIButton* popupButton; | 42 @property(nonatomic, readwrite, strong) UIButton* popupButton; |
| 40 | 43 |
| 41 - (void)setup; | 44 - (void)setup; |
| 42 - (void)calculateButtonWidth; | 45 - (void)calculateButtonWidth; |
| 43 - (void)setupButton:(UIButton*)button; | 46 - (void)setupButton:(UIButton*)button; |
| 44 - (BOOL)useIconsInButtons; | 47 - (BOOL)useIconsInButtons; |
| 45 - (BOOL)showOverlay; | 48 - (BOOL)showOverlay; |
| 46 @end | 49 @end |
| 47 | 50 |
| 48 @implementation NewTabPageBar { | 51 @implementation NewTabPageBar { |
| 49 // Tabbar buttons. | |
| 50 NSArray* buttons_; // UIButton | |
| 51 NSArray* items_; // NewTabPageBarItem | |
| 52 // Which button is currently selected. | 52 // Which button is currently selected. |
| 53 NSUInteger selectedIndex_; | 53 NSUInteger selectedIndex_; |
| 54 // Popup button helper, for iPhone labels. | |
| 55 UIButton* popupButton_; | |
| 56 // Don't allow tabbar animations on startup, only after first tap. | 54 // Don't allow tabbar animations on startup, only after first tap. |
| 57 BOOL canAnimate_; | 55 BOOL canAnimate_; |
| 58 id<NewTabPageBarDelegate> delegate_; // weak | 56 __weak id<NewTabPageBarDelegate> delegate_; |
| 59 // Logo view, used to center the tab buttons. | 57 // Logo view, used to center the tab buttons. |
| 60 base::scoped_nsobject<UIImageView> logoView_; | 58 UIImageView* logoView_; |
| 61 // Overlay view, used to highlight the selected button. | 59 // Overlay view, used to highlight the selected button. |
| 62 base::scoped_nsobject<UIImageView> overlayView_; | 60 UIImageView* overlayView_; |
| 63 // Overlay view, used to highlight the selected button. | 61 // Overlay view, used to highlight the selected button. |
| 64 base::scoped_nsobject<UIView> overlayColorView_; | 62 UIView* overlayColorView_; |
| 65 // Width of a button. | 63 // Width of a button. |
| 66 CGFloat buttonWidth_; | 64 CGFloat buttonWidth_; |
| 67 // Percentage overlay sits over tab bar buttons. | 65 // Percentage overlay sits over tab bar buttons. |
| 68 CGFloat overlayPercentage_; | 66 CGFloat overlayPercentage_; |
| 69 | |
| 70 base::mac::ObjCPropertyReleaser propertyReleaser_NewTabPageBar_; | |
| 71 } | 67 } |
| 72 | 68 |
| 73 @synthesize items = items_; | 69 @synthesize items = items_; |
| 74 @synthesize selectedIndex = selectedIndex_; | 70 @synthesize selectedIndex = selectedIndex_; |
| 75 @synthesize popupButton = popupButton_; | 71 @synthesize popupButton = popupButton_; |
| 76 @synthesize buttons = buttons_; | 72 @synthesize buttons = buttons_; |
| 77 @synthesize delegate = delegate_; | 73 @synthesize delegate = delegate_; |
| 78 @synthesize overlayPercentage = overlayPercentage_; | 74 @synthesize overlayPercentage = overlayPercentage_; |
| 79 | 75 |
| 80 - (id)initWithFrame:(CGRect)frame { | 76 - (id)initWithFrame:(CGRect)frame { |
| 81 self = [super initWithFrame:frame]; | 77 self = [super initWithFrame:frame]; |
| 82 if (self) { | 78 if (self) { |
| 83 [self setup]; | 79 [self setup]; |
| 84 } | 80 } |
| 85 return self; | 81 return self; |
| 86 } | 82 } |
| 87 | 83 |
| 88 - (id)initWithCoder:(NSCoder*)aDecoder { | 84 - (id)initWithCoder:(NSCoder*)aDecoder { |
| 89 self = [super initWithCoder:aDecoder]; | 85 self = [super initWithCoder:aDecoder]; |
| 90 if (self) { | 86 if (self) { |
| 91 [self setup]; | 87 [self setup]; |
| 92 } | 88 } |
| 93 return self; | 89 return self; |
| 94 } | 90 } |
| 95 | 91 |
| 96 - (void)setup { | 92 - (void)setup { |
| 97 propertyReleaser_NewTabPageBar_.Init(self, [NewTabPageBar class]); | |
| 98 self.selectedIndex = NSNotFound; | 93 self.selectedIndex = NSNotFound; |
| 99 canAnimate_ = NO; | 94 canAnimate_ = NO; |
| 100 self.autoresizingMask = | 95 self.autoresizingMask = |
| 101 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; | 96 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; |
| 102 self.autoresizesSubviews = YES; | 97 self.autoresizesSubviews = YES; |
| 103 self.backgroundColor = [UIColor clearColor]; | 98 self.backgroundColor = [UIColor clearColor]; |
| 104 | 99 |
| 105 if ([self showOverlay]) { | 100 if ([self showOverlay]) { |
| 106 overlayView_.reset( | 101 overlayView_ = |
| 107 [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, buttonWidth_, 2)]); | 102 [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, buttonWidth_, 2)]; |
| 108 | 103 |
| 109 // Center |overlayColorView_| inside |overlayView_|. | 104 // Center |overlayColorView_| inside |overlayView_|. |
| 110 CGFloat colorX = AlignValueToPixel((buttonWidth_ - kOverlayColorWidth) / 2); | 105 CGFloat colorX = AlignValueToPixel((buttonWidth_ - kOverlayColorWidth) / 2); |
| 111 overlayColorView_.reset([[UIView alloc] | 106 overlayColorView_ = [[UIView alloc] |
| 112 initWithFrame:CGRectMake(colorX, 0, kOverlayColorWidth, 2)]); | 107 initWithFrame:CGRectMake(colorX, 0, kOverlayColorWidth, 2)]; |
| 113 [overlayColorView_ | 108 [overlayColorView_ |
| 114 setBackgroundColor:UIColorFromRGB(kOverlayViewColor, 1.0)]; | 109 setBackgroundColor:UIColorFromRGB(kOverlayViewColor, 1.0)]; |
| 115 [overlayColorView_ layer].cornerRadius = 1.0; | 110 [overlayColorView_ layer].cornerRadius = 1.0; |
| 116 [overlayColorView_ | 111 [overlayColorView_ |
| 117 setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | | 112 setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | |
| 118 UIViewAutoresizingFlexibleRightMargin]; | 113 UIViewAutoresizingFlexibleRightMargin]; |
| 119 [overlayView_ addSubview:overlayColorView_]; | 114 [overlayView_ addSubview:overlayColorView_]; |
| 120 [self addSubview:overlayView_]; | 115 [self addSubview:overlayView_]; |
| 121 } | 116 } |
| 122 | 117 |
| 123 // Make the drop shadow. | 118 // Make the drop shadow. |
| 124 UIImage* shadowImage = [UIImage imageNamed:@"ntp_bottom_bar_shadow"]; | 119 UIImage* shadowImage = [UIImage imageNamed:@"ntp_bottom_bar_shadow"]; |
| 125 shadow_.reset([[UIImageView alloc] initWithImage:shadowImage]); | 120 shadow_ = [[UIImageView alloc] initWithImage:shadowImage]; |
| 126 // Shadow is positioned directly above the new tab page bar. | 121 // Shadow is positioned directly above the new tab page bar. |
| 127 [shadow_ | 122 [shadow_ |
| 128 setFrame:CGRectMake(0, -shadowImage.size.height, self.bounds.size.width, | 123 setFrame:CGRectMake(0, -shadowImage.size.height, self.bounds.size.width, |
| 129 shadowImage.size.height)]; | 124 shadowImage.size.height)]; |
| 130 [shadow_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; | 125 [shadow_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
| 131 [self addSubview:shadow_]; | 126 [self addSubview:shadow_]; |
| 132 | 127 |
| 133 self.contentMode = UIViewContentModeRedraw; | 128 self.contentMode = UIViewContentModeRedraw; |
| 134 } | 129 } |
| 135 | 130 |
| 136 - (void)layoutSubviews { | 131 - (void)layoutSubviews { |
| 137 [super layoutSubviews]; | 132 [super layoutSubviews]; |
| 138 | 133 |
| 139 // |buttonWidth_| changes with the screen orientation when the NTP button bar | 134 // |buttonWidth_| changes with the screen orientation when the NTP button bar |
| 140 // is enabled. | 135 // is enabled. |
| 141 [self calculateButtonWidth]; | 136 [self calculateButtonWidth]; |
| 142 | 137 |
| 143 CGFloat logoWidth = logoView_.get().image.size.width; | 138 CGFloat logoWidth = logoView_.image.size.width; |
| 144 CGFloat padding = [self useIconsInButtons] ? logoWidth : 0; | 139 CGFloat padding = [self useIconsInButtons] ? logoWidth : 0; |
| 145 CGFloat buttonPadding = floor((CGRectGetWidth(self.bounds) - padding - | 140 CGFloat buttonPadding = floor((CGRectGetWidth(self.bounds) - padding - |
| 146 buttonWidth_ * self.buttons.count) / | 141 buttonWidth_ * self.buttons.count) / |
| 147 2 + | 142 2 + |
| 148 padding); | 143 padding); |
| 149 | 144 |
| 150 for (NSUInteger i = 0; i < self.buttons.count; ++i) { | 145 for (NSUInteger i = 0; i < self.buttons.count; ++i) { |
| 151 NewTabPageBarButton* button = [self.buttons objectAtIndex:i]; | 146 NewTabPageBarButton* button = [self.buttons objectAtIndex:i]; |
| 152 LayoutRect layout = LayoutRectMake( | 147 LayoutRect layout = LayoutRectMake( |
| 153 buttonPadding + (i * buttonWidth_), CGRectGetWidth(self.bounds), 0, | 148 buttonPadding + (i * buttonWidth_), CGRectGetWidth(self.bounds), 0, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 181 |
| 187 buttonWidth_ = kRegularLayoutButtonWidth; | 182 buttonWidth_ = kRegularLayoutButtonWidth; |
| 188 } | 183 } |
| 189 | 184 |
| 190 // When setting a new set of items on the tab bar, the buttons need to be | 185 // When setting a new set of items on the tab bar, the buttons need to be |
| 191 // regenerated and the old buttons need to be removed. | 186 // regenerated and the old buttons need to be removed. |
| 192 - (void)setItems:(NSArray*)newItems { | 187 - (void)setItems:(NSArray*)newItems { |
| 193 if (newItems == items_) | 188 if (newItems == items_) |
| 194 return; | 189 return; |
| 195 | 190 |
| 196 [items_ autorelease]; | 191 items_ = newItems; |
| 197 items_ = [newItems retain]; | |
| 198 // Remove all the existing buttons from the view. | 192 // Remove all the existing buttons from the view. |
| 199 for (UIButton* button in self.buttons) { | 193 for (UIButton* button in self.buttons) { |
| 200 [button removeFromSuperview]; | 194 [button removeFromSuperview]; |
| 201 } | 195 } |
| 202 | 196 |
| 203 // Create a set of new buttons. | 197 // Create a set of new buttons. |
| 204 [self calculateButtonWidth]; | 198 [self calculateButtonWidth]; |
| 205 if (newItems.count) { | 199 if (newItems.count) { |
| 206 NSMutableArray* newButtons = [NSMutableArray array]; | 200 NSMutableArray* newButtons = [NSMutableArray array]; |
| 207 for (NSUInteger i = 0; i < newItems.count; ++i) { | 201 for (NSUInteger i = 0; i < newItems.count; ++i) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 return !IsIPadIdiom() || IsCompactTablet(); | 316 return !IsIPadIdiom() || IsCompactTablet(); |
| 323 } | 317 } |
| 324 | 318 |
| 325 - (BOOL)showOverlay { | 319 - (BOOL)showOverlay { |
| 326 // The bar buttons launch modal dialogs on tap on iPhone. Don't show overlay | 320 // The bar buttons launch modal dialogs on tap on iPhone. Don't show overlay |
| 327 // in this case. | 321 // in this case. |
| 328 return IsIPadIdiom(); | 322 return IsIPadIdiom(); |
| 329 } | 323 } |
| 330 | 324 |
| 331 @end | 325 @end |
| OLD | NEW |