Chromium Code Reviews| 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/toolbar/toolbar_controller.h" | 5 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h" |
| 6 | 6 |
| 7 #include <QuartzCore/QuartzCore.h> | 7 #include <QuartzCore/QuartzCore.h> |
| 8 | 8 |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/i18n/rtl.h" | 10 #include "base/i18n/rtl.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 | 69 |
| 70 // Macros for creating CGRects of height H, origin (0,0), with the portrait | 70 // Macros for creating CGRects of height H, origin (0,0), with the portrait |
| 71 // width of phone/pad devices. | 71 // width of phone/pad devices. |
| 72 // clang-format off | 72 // clang-format off |
| 73 #define IPHONE_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPHONE_IDIOM], H } } | 73 #define IPHONE_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPHONE_IDIOM], H } } |
| 74 #define IPAD_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPAD_IDIOM], H } } | 74 #define IPAD_FRAME(H) { { 0, 0 }, { kPortraitWidth[IPAD_IDIOM], H } } |
| 75 | 75 |
| 76 // Makes a two-element C array of CGRects as described above, one for each | 76 // Makes a two-element C array of CGRects as described above, one for each |
| 77 // device idiom. | 77 // device idiom. |
| 78 #define FRAME_PAIR(H) { IPHONE_FRAME(H), IPAD_FRAME(H) } | 78 #define FRAME_PAIR(H) { IPHONE_FRAME(H), IPAD_FRAME(H) } |
| 79 | |
| 80 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
| 81 #error "This file requires ARC support." | |
| 82 #endif | |
| 79 // clang-format on | 83 // clang-format on |
| 80 | 84 |
| 81 const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT] = FRAME_PAIR(56); | 85 const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT] = FRAME_PAIR(56); |
| 82 | 86 |
| 83 namespace { | 87 namespace { |
| 84 | 88 |
| 85 // Color constants for the stack button text, normal and pressed states. These | 89 // Color constants for the stack button text, normal and pressed states. These |
| 86 // arrays are indexed by ToolbarControllerStyle enum values. | 90 // arrays are indexed by ToolbarControllerStyle enum values. |
| 87 const CGFloat kStackButtonNormalColors[] = { | 91 const CGFloat kStackButtonNormalColors[] = { |
| 88 85.0 / 255.0, // ToolbarControllerStyleLightMode | 92 85.0 / 255.0, // ToolbarControllerStyleLightMode |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 // explicit transition animations. | 198 // explicit transition animations. |
| 195 if (self.animatingTransition) | 199 if (self.animatingTransition) |
| 196 return (id<CAAction>)[NSNull null]; | 200 return (id<CAAction>)[NSNull null]; |
| 197 return [super actionForLayer:layer forKey:event]; | 201 return [super actionForLayer:layer forKey:event]; |
| 198 } | 202 } |
| 199 | 203 |
| 200 @end | 204 @end |
| 201 | 205 |
| 202 @interface ToolbarController () { | 206 @interface ToolbarController () { |
| 203 // The top-level toolbar view. | 207 // The top-level toolbar view. |
| 204 base::scoped_nsobject<ToolbarView> view_; | 208 ToolbarView* view_; |
|
stkhapugin
2017/04/10 15:57:51
You should be able to synthesize the first three i
| |
| 205 // The view for the toolbar background image. | 209 // The view for the toolbar background image. |
| 206 base::scoped_nsobject<UIImageView> backgroundView_; | 210 UIImageView* backgroundView_; |
| 207 base::scoped_nsobject<UIImageView> shadowView_; | 211 UIImageView* shadowView_; |
| 208 base::scoped_nsobject<UIImageView> fullBleedShadowView_; | 212 UIImageView* fullBleedShadowView_; |
| 209 | 213 |
| 210 // The backing object for |self.transitionLayers|. | 214 // The backing object for |self.transitionLayers|. |
| 211 base::scoped_nsobject<NSMutableArray> transitionLayers_; | 215 NSMutableArray* transitionLayers_; |
| 212 | 216 |
| 213 base::scoped_nsobject<ToolbarToolsMenuButton> toolsMenuButton_; | 217 ToolbarToolsMenuButton* toolsMenuButton_; |
| 214 base::scoped_nsobject<UIButton> stackButton_; | 218 UIButton* stackButton_; |
| 215 base::scoped_nsobject<UIButton> shareButton_; | 219 UIButton* shareButton_; |
| 216 base::scoped_nsobject<NSArray> standardButtons_; | 220 NSArray* standardButtons_; |
| 217 base::scoped_nsobject<ToolsMenuButtonObserverBridge> | 221 ToolsMenuButtonObserverBridge* toolsMenuButtonObserverBridge_; |
| 218 toolsMenuButtonObserverBridge_; | |
| 219 ToolbarControllerStyle style_; | 222 ToolbarControllerStyle style_; |
| 220 | 223 |
| 221 // The following is nil if not visible. | 224 // The following is nil if not visible. |
| 222 base::scoped_nsobject<ToolsPopupController> toolsPopupController_; | 225 ToolsPopupController* toolsPopupController_; |
| 223 } | 226 } |
| 224 | 227 |
| 225 // Returns the background image that should be used for |style|. | 228 // Returns the background image that should be used for |style|. |
| 226 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style; | 229 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style; |
| 227 | 230 |
| 228 // Whether the share button should be visible in the toolbar. | 231 // Whether the share button should be visible in the toolbar. |
| 229 - (BOOL)shareButtonShouldBeVisible; | 232 - (BOOL)shareButtonShouldBeVisible; |
| 230 | 233 |
| 231 // Update share button visibility and |standardButtons_| array. | 234 // Update share button visibility and |standardButtons_| array. |
| 232 - (void)updateStandardButtons; | 235 - (void)updateStandardButtons; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 244 | 247 |
| 245 @implementation ToolbarController | 248 @implementation ToolbarController |
| 246 | 249 |
| 247 @synthesize readingListModel = readingListModel_; | 250 @synthesize readingListModel = readingListModel_; |
| 248 | 251 |
| 249 @synthesize style = style_; | 252 @synthesize style = style_; |
| 250 | 253 |
| 251 - (void)setReadingListModel:(ReadingListModel*)readingListModel { | 254 - (void)setReadingListModel:(ReadingListModel*)readingListModel { |
| 252 readingListModel_ = readingListModel; | 255 readingListModel_ = readingListModel; |
| 253 if (readingListModel_) { | 256 if (readingListModel_) { |
| 254 toolsMenuButtonObserverBridge_.reset([[ToolsMenuButtonObserverBridge alloc] | 257 toolsMenuButtonObserverBridge_ = |
| 255 initWithModel:readingListModel_ | 258 [[ToolsMenuButtonObserverBridge alloc] initWithModel:readingListModel_ |
| 256 toolbarButton:toolsMenuButton_]); | 259 toolbarButton:toolsMenuButton_]; |
| 257 } | 260 } |
| 258 } | 261 } |
| 259 | 262 |
| 260 - (instancetype)initWithStyle:(ToolbarControllerStyle)style { | 263 - (instancetype)initWithStyle:(ToolbarControllerStyle)style { |
| 261 self = [super init]; | 264 self = [super init]; |
| 262 if (self) { | 265 if (self) { |
| 263 style_ = style; | 266 style_ = style; |
| 264 DCHECK_LT(style_, ToolbarControllerStyleMaxStyles); | 267 DCHECK_LT(style_, ToolbarControllerStyleMaxStyles); |
| 265 | 268 |
| 266 InterfaceIdiom idiom = IsIPadIdiom() ? IPAD_IDIOM : IPHONE_IDIOM; | 269 InterfaceIdiom idiom = IsIPadIdiom() ? IPAD_IDIOM : IPHONE_IDIOM; |
| 267 CGRect viewFrame = kToolbarFrame[idiom]; | 270 CGRect viewFrame = kToolbarFrame[idiom]; |
| 268 CGRect backgroundFrame = kBackgroundViewFrame[idiom]; | 271 CGRect backgroundFrame = kBackgroundViewFrame[idiom]; |
| 269 CGRect stackButtonFrame = LayoutRectGetRect(kStackButtonFrame); | 272 CGRect stackButtonFrame = LayoutRectGetRect(kStackButtonFrame); |
| 270 CGRect toolsMenuButtonFrame = | 273 CGRect toolsMenuButtonFrame = |
| 271 LayoutRectGetRect(kToolsMenuButtonFrame[idiom]); | 274 LayoutRectGetRect(kToolsMenuButtonFrame[idiom]); |
| 272 | 275 |
| 273 if (idiom == IPHONE_IDIOM) { | 276 if (idiom == IPHONE_IDIOM) { |
| 274 CGFloat statusBarOffset = [self statusBarOffset]; | 277 CGFloat statusBarOffset = [self statusBarOffset]; |
| 275 viewFrame.size.height += statusBarOffset; | 278 viewFrame.size.height += statusBarOffset; |
| 276 backgroundFrame.size.height += statusBarOffset; | 279 backgroundFrame.size.height += statusBarOffset; |
| 277 stackButtonFrame.origin.y += statusBarOffset; | 280 stackButtonFrame.origin.y += statusBarOffset; |
| 278 toolsMenuButtonFrame.origin.y += statusBarOffset; | 281 toolsMenuButtonFrame.origin.y += statusBarOffset; |
| 279 } | 282 } |
| 280 | 283 |
| 281 view_.reset([[ToolbarView alloc] initWithFrame:viewFrame]); | 284 view_ = [[ToolbarView alloc] initWithFrame:viewFrame]; |
| 282 backgroundView_.reset([[UIImageView alloc] initWithFrame:backgroundFrame]); | 285 backgroundView_ = [[UIImageView alloc] initWithFrame:backgroundFrame]; |
| 283 toolsMenuButton_.reset([[ToolbarToolsMenuButton alloc] | 286 toolsMenuButton_ = |
| 284 initWithFrame:toolsMenuButtonFrame | 287 [[ToolbarToolsMenuButton alloc] initWithFrame:toolsMenuButtonFrame |
| 285 style:style_]); | 288 style:style_]; |
| 286 [toolsMenuButton_ setTag:IDC_SHOW_TOOLS_MENU]; | 289 [toolsMenuButton_ setTag:IDC_SHOW_TOOLS_MENU]; |
| 287 [toolsMenuButton_ | 290 [toolsMenuButton_ |
| 288 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | | 291 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | |
| 289 UIViewAutoresizingFlexibleBottomMargin]; | 292 UIViewAutoresizingFlexibleBottomMargin]; |
| 290 | 293 |
| 291 [view_ addSubview:backgroundView_]; | 294 [view_ addSubview:backgroundView_]; |
| 292 [view_ addSubview:toolsMenuButton_]; | 295 [view_ addSubview:toolsMenuButton_]; |
| 293 [view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; | 296 [view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
| 294 [backgroundView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | | 297 [backgroundView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | |
| 295 UIViewAutoresizingFlexibleHeight]; | 298 UIViewAutoresizingFlexibleHeight]; |
| 296 | 299 |
| 297 if (idiom == IPAD_IDIOM) { | 300 if (idiom == IPAD_IDIOM) { |
| 298 CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame); | 301 CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame); |
| 299 shareButton_.reset([[UIButton alloc] initWithFrame:shareButtonFrame]); | 302 shareButton_ = [[UIButton alloc] initWithFrame:shareButtonFrame]; |
| 300 [shareButton_ setTag:IDC_SHARE_PAGE]; | 303 [shareButton_ setTag:IDC_SHARE_PAGE]; |
| 301 [shareButton_ | 304 [shareButton_ |
| 302 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | | 305 setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | |
| 303 UIViewAutoresizingFlexibleBottomMargin]; | 306 UIViewAutoresizingFlexibleBottomMargin]; |
| 304 [self setUpButton:shareButton_ | 307 [self setUpButton:shareButton_ |
| 305 withImageEnum:ToolbarButtonNameShare | 308 withImageEnum:ToolbarButtonNameShare |
| 306 forInitialState:UIControlStateNormal | 309 forInitialState:UIControlStateNormal |
| 307 hasDisabledImage:YES | 310 hasDisabledImage:YES |
| 308 synchronously:NO]; | 311 synchronously:NO]; |
| 309 SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE, | 312 SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE, |
| 310 kToolbarShareButtonIdentifier); | 313 kToolbarShareButtonIdentifier); |
| 311 [view_ addSubview:shareButton_]; | 314 [view_ addSubview:shareButton_]; |
| 312 } | 315 } |
| 313 | 316 |
| 314 CGRect shadowFrame = kShadowViewFrame[idiom]; | 317 CGRect shadowFrame = kShadowViewFrame[idiom]; |
| 315 shadowFrame.origin.y = CGRectGetMaxY(backgroundFrame); | 318 shadowFrame.origin.y = CGRectGetMaxY(backgroundFrame); |
| 316 shadowView_.reset([[UIImageView alloc] initWithFrame:shadowFrame]); | 319 shadowView_ = [[UIImageView alloc] initWithFrame:shadowFrame]; |
| 317 [shadowView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; | 320 [shadowView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
| 318 [shadowView_ setUserInteractionEnabled:NO]; | 321 [shadowView_ setUserInteractionEnabled:NO]; |
| 319 [view_ addSubview:shadowView_]; | 322 [view_ addSubview:shadowView_]; |
| 320 [shadowView_ setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)]; | 323 [shadowView_ setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)]; |
| 321 | 324 |
| 322 if (idiom == IPHONE_IDIOM) { | 325 if (idiom == IPHONE_IDIOM) { |
| 323 // iPad omnibox does not expand to full bleed. | 326 // iPad omnibox does not expand to full bleed. |
| 324 CGRect fullBleedShadowFrame = kFullBleedShadowViewFrame; | 327 CGRect fullBleedShadowFrame = kFullBleedShadowViewFrame; |
| 325 fullBleedShadowFrame.origin.y = shadowFrame.origin.y; | 328 fullBleedShadowFrame.origin.y = shadowFrame.origin.y; |
| 326 fullBleedShadowView_.reset( | 329 fullBleedShadowView_ = |
| 327 [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]); | 330 [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]; |
| 328 [fullBleedShadowView_ | 331 [fullBleedShadowView_ |
| 329 setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; | 332 setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
| 330 [fullBleedShadowView_ setUserInteractionEnabled:NO]; | 333 [fullBleedShadowView_ setUserInteractionEnabled:NO]; |
| 331 [fullBleedShadowView_ setAlpha:0]; | 334 [fullBleedShadowView_ setAlpha:0]; |
| 332 [view_ addSubview:fullBleedShadowView_]; | 335 [view_ addSubview:fullBleedShadowView_]; |
| 333 [fullBleedShadowView_ | 336 [fullBleedShadowView_ |
| 334 setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]; | 337 setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]; |
| 335 } | 338 } |
| 336 | 339 |
| 337 transitionLayers_.reset( | 340 transitionLayers_ = |
| 338 [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]); | 341 [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]; |
| 339 | 342 |
| 340 // UIImageViews do not default to userInteractionEnabled:YES. | 343 // UIImageViews do not default to userInteractionEnabled:YES. |
| 341 [view_ setUserInteractionEnabled:YES]; | 344 [view_ setUserInteractionEnabled:YES]; |
| 342 [backgroundView_ setUserInteractionEnabled:YES]; | 345 [backgroundView_ setUserInteractionEnabled:YES]; |
| 343 | 346 |
| 344 UIImage* tile = [self getBackgroundImageForStyle:style]; | 347 UIImage* tile = [self getBackgroundImageForStyle:style]; |
| 345 [[self backgroundView] | 348 [[self backgroundView] |
| 346 setImage:StretchableImageFromUIImage(tile, 0.0, 3.0)]; | 349 setImage:StretchableImageFromUIImage(tile, 0.0, 3.0)]; |
| 347 | 350 |
| 348 if (idiom == IPHONE_IDIOM) { | 351 if (idiom == IPHONE_IDIOM) { |
| 349 stackButton_.reset( | 352 stackButton_ = |
| 350 [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]); | 353 [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]; |
| 351 [stackButton_ setTag:IDC_TOGGLE_TAB_SWITCHER]; | 354 [stackButton_ setTag:IDC_TOGGLE_TAB_SWITCHER]; |
| 352 [[stackButton_ titleLabel] | 355 [[stackButton_ titleLabel] |
| 353 setFont:[self fontForSize:kFontSizeFewerThanTenTabs]]; | 356 setFont:[self fontForSize:kFontSizeFewerThanTenTabs]]; |
| 354 [stackButton_ | 357 [stackButton_ |
| 355 setTitleColor:[UIColor colorWithWhite:kStackButtonNormalColors[style_] | 358 setTitleColor:[UIColor colorWithWhite:kStackButtonNormalColors[style_] |
| 356 alpha:1.0] | 359 alpha:1.0] |
| 357 forState:UIControlStateNormal]; | 360 forState:UIControlStateNormal]; |
| 358 UIColor* highlightColor = | 361 UIColor* highlightColor = |
| 359 UIColorFromRGB(kStackButtonHighlightedColors[style_], 1.0); | 362 UIColorFromRGB(kStackButtonHighlightedColors[style_], 1.0); |
| 360 [stackButton_ setTitleColor:highlightColor | 363 [stackButton_ setTitleColor:highlightColor |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 return nil; | 403 return nil; |
| 401 } | 404 } |
| 402 | 405 |
| 403 - (UIFont*)fontForSize:(NSInteger)size { | 406 - (UIFont*)fontForSize:(NSInteger)size { |
| 404 return [[MDFRobotoFontLoader sharedInstance] boldFontOfSize:size]; | 407 return [[MDFRobotoFontLoader sharedInstance] boldFontOfSize:size]; |
| 405 } | 408 } |
| 406 | 409 |
| 407 - (void)dealloc { | 410 - (void)dealloc { |
| 408 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 411 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 409 [toolsPopupController_ setDelegate:nil]; | 412 [toolsPopupController_ setDelegate:nil]; |
| 410 [super dealloc]; | |
| 411 } | 413 } |
| 412 | 414 |
| 413 - (UIImageView*)view { | 415 - (UIImageView*)view { |
| 414 return view_.get(); | 416 return view_; |
| 415 } | 417 } |
| 416 | 418 |
| 417 - (UIImageView*)backgroundView { | 419 - (UIImageView*)backgroundView { |
| 418 return backgroundView_.get(); | 420 return backgroundView_; |
| 419 } | 421 } |
| 420 | 422 |
| 421 - (CGFloat)statusBarOffset { | 423 - (CGFloat)statusBarOffset { |
| 422 return StatusBarHeight(); | 424 return StatusBarHeight(); |
| 423 } | 425 } |
| 424 | 426 |
| 425 - (UIImageView*)shadowView { | 427 - (UIImageView*)shadowView { |
| 426 return shadowView_.get(); | 428 return shadowView_; |
| 427 } | 429 } |
| 428 | 430 |
| 429 - (NSMutableArray*)transitionLayers { | 431 - (NSMutableArray*)transitionLayers { |
| 430 return transitionLayers_.get(); | 432 return transitionLayers_; |
| 431 } | 433 } |
| 432 | 434 |
| 433 - (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum { | 435 - (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum { |
| 434 // None of the images this class knows about should flip. | 436 // None of the images this class knows about should flip. |
| 435 return NO; | 437 return NO; |
| 436 } | 438 } |
| 437 | 439 |
| 438 - (void)updateStandardButtons { | 440 - (void)updateStandardButtons { |
| 439 BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible]; | 441 BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible]; |
| 440 [shareButton_ setHidden:!shareButtonShouldBeVisible]; | 442 [shareButton_ setHidden:!shareButtonShouldBeVisible]; |
| 441 NSMutableArray* standardButtons = [NSMutableArray array]; | 443 NSMutableArray* standardButtons = [NSMutableArray array]; |
| 442 [standardButtons addObject:toolsMenuButton_]; | 444 [standardButtons addObject:toolsMenuButton_]; |
| 443 if (stackButton_) | 445 if (stackButton_) |
| 444 [standardButtons addObject:stackButton_]; | 446 [standardButtons addObject:stackButton_]; |
| 445 if (shareButtonShouldBeVisible) | 447 if (shareButtonShouldBeVisible) |
| 446 [standardButtons addObject:shareButton_]; | 448 [standardButtons addObject:shareButton_]; |
| 447 standardButtons_.reset([standardButtons retain]); | 449 standardButtons_ = standardButtons; |
| 448 } | 450 } |
| 449 | 451 |
| 450 - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { | 452 - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
| 451 [self updateStandardButtons]; | 453 [self updateStandardButtons]; |
| 452 } | 454 } |
| 453 | 455 |
| 454 - (ToolsPopupController*)toolsPopupController { | 456 - (ToolsPopupController*)toolsPopupController { |
| 455 return toolsPopupController_.get(); | 457 return toolsPopupController_; |
| 456 } | 458 } |
| 457 | 459 |
| 458 - (void)applicationDidEnterBackground:(NSNotification*)notify { | 460 - (void)applicationDidEnterBackground:(NSNotification*)notify { |
| 459 if (toolsPopupController_.get()) { | 461 if (toolsPopupController_) { |
| 460 // Dismiss the tools popup menu without animation. | 462 // Dismiss the tools popup menu without animation. |
| 461 [toolsMenuButton_ setToolsMenuIsVisible:NO]; | 463 [toolsMenuButton_ setToolsMenuIsVisible:NO]; |
| 462 toolsPopupController_.reset(nil); | 464 toolsPopupController_ = nil; |
| 463 [[NSNotificationCenter defaultCenter] | 465 [[NSNotificationCenter defaultCenter] |
| 464 postNotificationName:kMenuWillHideNotification | 466 postNotificationName:kMenuWillHideNotification |
| 465 object:nil]; | 467 object:nil]; |
| 466 } | 468 } |
| 467 } | 469 } |
| 468 | 470 |
| 469 - (BOOL)shareButtonShouldBeVisible { | 471 - (BOOL)shareButtonShouldBeVisible { |
| 470 // The share button only exists on iPad, and when some tabs are visible | 472 // The share button only exists on iPad, and when some tabs are visible |
| 471 // (i.e. when not in DarkMode), and when the width is greater than | 473 // (i.e. when not in DarkMode), and when the width is greater than |
| 472 // the tablet mini view. | 474 // the tablet mini view. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 483 | 485 |
| 484 - (UIImage*)imageForImageEnum:(int)imageEnum | 486 - (UIImage*)imageForImageEnum:(int)imageEnum |
| 485 forState:(ToolbarButtonUIState)state { | 487 forState:(ToolbarButtonUIState)state { |
| 486 int imageID = | 488 int imageID = |
| 487 [self imageIdForImageEnum:imageEnum style:[self style] forState:state]; | 489 [self imageIdForImageEnum:imageEnum style:[self style] forState:state]; |
| 488 return NativeReversableImage( | 490 return NativeReversableImage( |
| 489 imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]); | 491 imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]); |
| 490 } | 492 } |
| 491 | 493 |
| 492 - (int)imageEnumForButton:(UIButton*)button { | 494 - (int)imageEnumForButton:(UIButton*)button { |
| 493 if (button == stackButton_.get()) | 495 if (button == stackButton_) |
| 494 return ToolbarButtonNameStack; | 496 return ToolbarButtonNameStack; |
| 495 return NumberOfToolbarButtonNames; | 497 return NumberOfToolbarButtonNames; |
| 496 } | 498 } |
| 497 | 499 |
| 498 - (int)imageIdForImageEnum:(int)index | 500 - (int)imageIdForImageEnum:(int)index |
| 499 style:(ToolbarControllerStyle)style | 501 style:(ToolbarControllerStyle)style |
| 500 forState:(ToolbarButtonUIState)state { | 502 forState:(ToolbarButtonUIState)state { |
| 501 DCHECK(index < NumberOfToolbarButtonNames); | 503 DCHECK(index < NumberOfToolbarButtonNames); |
| 502 DCHECK(style < ToolbarControllerStyleMaxStyles); | 504 DCHECK(style < ToolbarControllerStyleMaxStyles); |
| 503 DCHECK(state < NumberOfToolbarButtonUIStates); | 505 DCHECK(state < NumberOfToolbarButtonUIStates); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 if (synchronously || initialState == UIControlStateDisabled) { | 558 if (synchronously || initialState == UIControlStateDisabled) { |
| 557 disabledImageBlock(); | 559 disabledImageBlock(); |
| 558 } else { | 560 } else { |
| 559 dispatch_after(addImageDelay, dispatch_get_main_queue(), | 561 dispatch_after(addImageDelay, dispatch_get_main_queue(), |
| 560 disabledImageBlock); | 562 disabledImageBlock); |
| 561 } | 563 } |
| 562 } | 564 } |
| 563 } | 565 } |
| 564 | 566 |
| 565 - (void)registerEventsForButton:(UIButton*)button { | 567 - (void)registerEventsForButton:(UIButton*)button { |
| 566 if (button != toolsMenuButton_.get()) { | 568 if (button != toolsMenuButton_) { |
| 567 // |target| must be |self| (as opposed to |nil|) because |self| isn't in the | 569 // |target| must be |self| (as opposed to |nil|) because |self| isn't in the |
| 568 // responder chain. | 570 // responder chain. |
| 569 [button addTarget:self | 571 [button addTarget:self |
| 570 action:@selector(standardButtonPressed:) | 572 action:@selector(standardButtonPressed:) |
| 571 forControlEvents:UIControlEventTouchUpInside]; | 573 forControlEvents:UIControlEventTouchUpInside]; |
| 572 } | 574 } |
| 573 [button addTarget:self | 575 [button addTarget:self |
| 574 action:@selector(recordUserMetrics:) | 576 action:@selector(recordUserMetrics:) |
| 575 forControlEvents:UIControlEventTouchUpInside]; | 577 forControlEvents:UIControlEventTouchUpInside]; |
| 576 [button addTarget:button | 578 [button addTarget:button |
| 577 action:@selector(chromeExecuteCommand:) | 579 action:@selector(chromeExecuteCommand:) |
| 578 forControlEvents:UIControlEventTouchUpInside]; | 580 forControlEvents:UIControlEventTouchUpInside]; |
| 579 } | 581 } |
| 580 | 582 |
| 581 - (CGRect)shareButtonAnchorRect { | 583 - (CGRect)shareButtonAnchorRect { |
| 582 // Shrink the padding around the shareButton so the popovers are anchored | 584 // Shrink the padding around the shareButton so the popovers are anchored |
| 583 // correctly. | 585 // correctly. |
| 584 return CGRectInset([shareButton_ bounds], 10, 0); | 586 return CGRectInset([shareButton_ bounds], 10, 0); |
| 585 } | 587 } |
| 586 | 588 |
| 587 - (UIView*)shareButtonView { | 589 - (UIView*)shareButtonView { |
| 588 return shareButton_.get(); | 590 return shareButton_; |
| 589 } | 591 } |
| 590 | 592 |
| 591 - (void)showToolsMenuPopupWithConfiguration: | 593 - (void)showToolsMenuPopupWithConfiguration: |
| 592 (ToolsMenuConfiguration*)configuration { | 594 (ToolsMenuConfiguration*)configuration { |
| 593 // Because an animation hides and shows the tools popup menu it is possible to | 595 // Because an animation hides and shows the tools popup menu it is possible to |
| 594 // tap the tools button multiple times before the tools menu is shown. Ignore | 596 // tap the tools button multiple times before the tools menu is shown. Ignore |
| 595 // repeated taps between animations. | 597 // repeated taps between animations. |
| 596 if (toolsPopupController_) | 598 if (toolsPopupController_) |
| 597 return; | 599 return; |
| 598 | 600 |
| 599 base::RecordAction(UserMetricsAction("ShowAppMenu")); | 601 base::RecordAction(UserMetricsAction("ShowAppMenu")); |
| 600 | 602 |
| 601 // Keep the button pressed. | 603 // Keep the button pressed. |
| 602 [toolsMenuButton_ setToolsMenuIsVisible:YES]; | 604 [toolsMenuButton_ setToolsMenuIsVisible:YES]; |
| 603 | 605 |
| 604 [configuration setToolsMenuButton:toolsMenuButton_]; | 606 [configuration setToolsMenuButton:toolsMenuButton_]; |
| 605 toolsPopupController_.reset( | 607 toolsPopupController_ = |
| 606 [[ToolsPopupController alloc] initWithConfiguration:configuration]); | 608 [[ToolsPopupController alloc] initWithConfiguration:configuration]; |
| 607 | 609 |
| 608 [toolsPopupController_ setDelegate:self]; | 610 [toolsPopupController_ setDelegate:self]; |
| 609 | 611 |
| 610 [[NSNotificationCenter defaultCenter] | 612 [[NSNotificationCenter defaultCenter] |
| 611 postNotificationName:kMenuWillShowNotification | 613 postNotificationName:kMenuWillShowNotification |
| 612 object:nil]; | 614 object:nil]; |
| 613 } | 615 } |
| 614 | 616 |
| 615 - (void)dismissToolsMenuPopup { | 617 - (void)dismissToolsMenuPopup { |
| 616 if (!toolsPopupController_.get()) | 618 if (!toolsPopupController_) |
| 617 return; | 619 return; |
| 618 ToolsPopupController* tempTPC = toolsPopupController_.get(); | 620 ToolsPopupController* tempTPC = toolsPopupController_; |
| 619 [tempTPC containerView].userInteractionEnabled = NO; | 621 [tempTPC containerView].userInteractionEnabled = NO; |
| 620 [tempTPC dismissAnimatedWithCompletion:^{ | 622 [tempTPC dismissAnimatedWithCompletion:^{ |
| 621 // Unpress the tools menu button by restoring the normal and | 623 // Unpress the tools menu button by restoring the normal and |
| 622 // highlighted images to their usual state. | 624 // highlighted images to their usual state. |
| 623 [toolsMenuButton_ setToolsMenuIsVisible:NO]; | 625 [toolsMenuButton_ setToolsMenuIsVisible:NO]; |
| 624 // Reference tempTPC so the block retains it. | 626 // Reference tempTPC so the block retains it. |
| 625 [tempTPC self]; | 627 [tempTPC self]; |
| 626 }]; | 628 }]; |
| 627 // reset tabHistoryPopupController_ to prevent -applicationDidEnterBackground | 629 // reset tabHistoryPopupController_ to prevent -applicationDidEnterBackground |
| 628 // from posting another kMenuWillHideNotification. | 630 // from posting another kMenuWillHideNotification. |
| 629 toolsPopupController_.reset(); | 631 toolsPopupController_ = nil; |
| 630 | 632 |
| 631 [[NSNotificationCenter defaultCenter] | 633 [[NSNotificationCenter defaultCenter] |
| 632 postNotificationName:kMenuWillHideNotification | 634 postNotificationName:kMenuWillHideNotification |
| 633 object:nil]; | 635 object:nil]; |
| 634 } | 636 } |
| 635 | 637 |
| 636 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style { | 638 - (UIImage*)getBackgroundImageForStyle:(ToolbarControllerStyle)style { |
| 637 int backgroundImageID; | 639 int backgroundImageID; |
| 638 if (style == ToolbarControllerStyleLightMode) | 640 if (style == ToolbarControllerStyleLightMode) |
| 639 backgroundImageID = IDR_IOS_TOOLBAR_LIGHT_BACKGROUND; | 641 backgroundImageID = IDR_IOS_TOOLBAR_LIGHT_BACKGROUND; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 678 // Animate the opacity of the buttons to 0. | 680 // Animate the opacity of the buttons to 0. |
| 679 [CATransaction begin]; | 681 [CATransaction begin]; |
| 680 [CATransaction setAnimationDuration:ios::material::kDuration2]; | 682 [CATransaction setAnimationDuration:ios::material::kDuration2]; |
| 681 [CATransaction | 683 [CATransaction |
| 682 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; | 684 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; |
| 683 CABasicAnimation* fadeButtons = | 685 CABasicAnimation* fadeButtons = |
| 684 [CABasicAnimation animationWithKeyPath:@"opacity"]; | 686 [CABasicAnimation animationWithKeyPath:@"opacity"]; |
| 685 fadeButtons.fromValue = @1; | 687 fadeButtons.fromValue = @1; |
| 686 fadeButtons.toValue = @0; | 688 fadeButtons.toValue = @0; |
| 687 | 689 |
| 688 for (UIButton* button in standardButtons_.get()) { | 690 for (UIButton* button in standardButtons_) { |
| 689 if (![button isHidden]) { | 691 if (![button isHidden]) { |
| 690 [button layer].opacity = 0; | 692 [button layer].opacity = 0; |
| 691 [[button layer] addAnimation:fadeButtons forKey:@"fade"]; | 693 [[button layer] addAnimation:fadeButtons forKey:@"fade"]; |
| 692 } | 694 } |
| 693 } | 695 } |
| 694 [CATransaction commit]; | 696 [CATransaction commit]; |
| 695 | 697 |
| 696 // Animate the buttons 10 pixels in the leading-to-trailing direction | 698 // Animate the buttons 10 pixels in the leading-to-trailing direction |
| 697 [CATransaction begin]; | 699 [CATransaction begin]; |
| 698 [CATransaction setAnimationDuration:ios::material::kDuration1]; | 700 [CATransaction setAnimationDuration:ios::material::kDuration1]; |
| 699 [CATransaction | 701 [CATransaction |
| 700 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; | 702 setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; |
| 701 | 703 |
| 702 for (UIButton* button in standardButtons_.get()) { | 704 for (UIButton* button in standardButtons_) { |
| 703 CABasicAnimation* shiftButton = | 705 CABasicAnimation* shiftButton = |
| 704 [CABasicAnimation animationWithKeyPath:@"position"]; | 706 [CABasicAnimation animationWithKeyPath:@"position"]; |
| 705 CGPoint startPosition = [button layer].position; | 707 CGPoint startPosition = [button layer].position; |
| 706 CGPoint endPosition = | 708 CGPoint endPosition = |
| 707 CGPointLayoutOffset(startPosition, kButtonFadeOutXOffset); | 709 CGPointLayoutOffset(startPosition, kButtonFadeOutXOffset); |
| 708 shiftButton.fromValue = [NSValue valueWithCGPoint:startPosition]; | 710 shiftButton.fromValue = [NSValue valueWithCGPoint:startPosition]; |
| 709 shiftButton.toValue = [NSValue valueWithCGPoint:endPosition]; | 711 shiftButton.toValue = [NSValue valueWithCGPoint:endPosition]; |
| 710 [[button layer] addAnimation:shiftButton forKey:@"shiftButton"]; | 712 [[button layer] addAnimation:shiftButton forKey:@"shiftButton"]; |
| 711 } | 713 } |
| 712 | 714 |
| 713 [CATransaction commit]; | 715 [CATransaction commit]; |
| 714 | 716 |
| 715 // Fade to the full bleed shadow. | 717 // Fade to the full bleed shadow. |
| 716 [UIView animateWithDuration:ios::material::kDuration1 | 718 [UIView animateWithDuration:ios::material::kDuration1 |
| 717 animations:^{ | 719 animations:^{ |
| 718 [shadowView_ setAlpha:0]; | 720 [shadowView_ setAlpha:0]; |
| 719 [fullBleedShadowView_ setAlpha:1]; | 721 [fullBleedShadowView_ setAlpha:1]; |
| 720 }]; | 722 }]; |
| 721 } | 723 } |
| 722 | 724 |
| 723 - (void)fadeInStandardControls { | 725 - (void)fadeInStandardControls { |
| 724 for (UIButton* button in standardButtons_.get()) { | 726 for (UIButton* button in standardButtons_) { |
| 725 [self fadeInView:button | 727 [self fadeInView:button |
| 726 fromLeadingOffset:10 | 728 fromLeadingOffset:10 |
| 727 withDuration:ios::material::kDuration2 | 729 withDuration:ios::material::kDuration2 |
| 728 afterDelay:ios::material::kDuration1]; | 730 afterDelay:ios::material::kDuration1]; |
| 729 } | 731 } |
| 730 | 732 |
| 731 // Fade to the normal shadow. | 733 // Fade to the normal shadow. |
| 732 [UIView animateWithDuration:ios::material::kDuration1 | 734 [UIView animateWithDuration:ios::material::kDuration1 |
| 733 animations:^{ | 735 animations:^{ |
| 734 [shadowView_ setAlpha:self.backgroundView.alpha]; | 736 [shadowView_ setAlpha:self.backgroundView.alpha]; |
| 735 [fullBleedShadowView_ setAlpha:0]; | 737 [fullBleedShadowView_ setAlpha:0]; |
| 736 }]; | 738 }]; |
| 737 } | 739 } |
| 738 | 740 |
| 739 - (void)animationDidStart:(CAAnimation*)anim { | 741 - (void)animationDidStart:(CAAnimation*)anim { |
| 740 // Once the buttons start fading in, set their opacity to 1 so there's no | 742 // Once the buttons start fading in, set their opacity to 1 so there's no |
| 741 // flicker at the end of the animation. | 743 // flicker at the end of the animation. |
| 742 for (UIButton* button in standardButtons_.get()) { | 744 for (UIButton* button in standardButtons_) { |
| 743 if (anim == [[button layer] animationForKey:@"fadeIn"]) { | 745 if (anim == [[button layer] animationForKey:@"fadeIn"]) { |
| 744 [button layer].opacity = 1; | 746 [button layer].opacity = 1; |
| 745 return; | 747 return; |
| 746 } | 748 } |
| 747 } | 749 } |
| 748 } | 750 } |
| 749 | 751 |
| 750 - (void)fadeInView:(UIView*)view | 752 - (void)fadeInView:(UIView*)view |
| 751 fromLeadingOffset:(LayoutOffset)leadingOffset | 753 fromLeadingOffset:(LayoutOffset)leadingOffset |
| 752 withDuration:(NSTimeInterval)duration | 754 withDuration:(NSTimeInterval)duration |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 926 transitionStyle:style]; | 928 transitionStyle:style]; |
| 927 } | 929 } |
| 928 | 930 |
| 929 - (void)hideViewsForNewTabPage:(BOOL)hide { | 931 - (void)hideViewsForNewTabPage:(BOOL)hide { |
| 930 DCHECK(!IsIPadIdiom()); | 932 DCHECK(!IsIPadIdiom()); |
| 931 [shadowView_ setHidden:hide]; | 933 [shadowView_ setHidden:hide]; |
| 932 } | 934 } |
| 933 | 935 |
| 934 - (void)setStandardControlsVisible:(BOOL)visible { | 936 - (void)setStandardControlsVisible:(BOOL)visible { |
| 935 if (visible) { | 937 if (visible) { |
| 936 for (UIButton* button in standardButtons_.get()) { | 938 for (UIButton* button in standardButtons_) { |
| 937 [button setAlpha:1.0]; | 939 [button setAlpha:1.0]; |
| 938 } | 940 } |
| 939 } else { | 941 } else { |
| 940 for (UIButton* button in standardButtons_.get()) { | 942 for (UIButton* button in standardButtons_) { |
| 941 [button setAlpha:0.0]; | 943 [button setAlpha:0.0]; |
| 942 } | 944 } |
| 943 } | 945 } |
| 944 } | 946 } |
| 945 | 947 |
| 946 - (void)setStandardControlsAlpha:(CGFloat)alpha { | 948 - (void)setStandardControlsAlpha:(CGFloat)alpha { |
| 947 for (UIButton* button in standardButtons_.get()) { | 949 for (UIButton* button in standardButtons_) { |
| 948 if (![button isHidden]) | 950 if (![button isHidden]) |
| 949 [button setAlpha:alpha]; | 951 [button setAlpha:alpha]; |
| 950 } | 952 } |
| 951 } | 953 } |
| 952 | 954 |
| 953 - (void)setBackgroundAlpha:(CGFloat)alpha { | 955 - (void)setBackgroundAlpha:(CGFloat)alpha { |
| 954 [backgroundView_ setAlpha:alpha]; | 956 [backgroundView_ setAlpha:alpha]; |
| 955 [shadowView_ setAlpha:alpha]; | 957 [shadowView_ setAlpha:alpha]; |
| 956 } | 958 } |
| 957 | 959 |
| 958 - (void)setStandardControlsTransform:(CGAffineTransform)transform { | 960 - (void)setStandardControlsTransform:(CGAffineTransform)transform { |
| 959 for (UIButton* button in standardButtons_.get()) { | 961 for (UIButton* button in standardButtons_) { |
| 960 [button setTransform:transform]; | 962 [button setTransform:transform]; |
| 961 } | 963 } |
| 962 } | 964 } |
| 963 | 965 |
| 964 - (void)standardButtonPressed:(UIButton*)sender { | 966 - (void)standardButtonPressed:(UIButton*)sender { |
| 965 // This check for valid button images assumes that the buttons all have a | 967 // This check for valid button images assumes that the buttons all have a |
| 966 // different image for the highlighted state as for the normal state. | 968 // different image for the highlighted state as for the normal state. |
| 967 // Currently, that assumption is true. | 969 // Currently, that assumption is true. |
| 968 if ([sender imageForState:UIControlStateHighlighted] == | 970 if ([sender imageForState:UIControlStateHighlighted] == |
| 969 [sender imageForState:UIControlStateNormal]) { | 971 [sender imageForState:UIControlStateNormal]) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1007 [[stackButton_ titleLabel] | 1009 [[stackButton_ titleLabel] |
| 1008 setFont:[self fontForSize:kFontSizeTenTabsOrMore]]; | 1010 setFont:[self fontForSize:kFontSizeTenTabsOrMore]]; |
| 1009 } | 1011 } |
| 1010 } | 1012 } |
| 1011 | 1013 |
| 1012 [stackButton_ setTitle:stackButtonTitle forState:UIControlStateNormal]; | 1014 [stackButton_ setTitle:stackButtonTitle forState:UIControlStateNormal]; |
| 1013 [stackButton_ setAccessibilityValue:stackButtonValue]; | 1015 [stackButton_ setAccessibilityValue:stackButtonValue]; |
| 1014 } | 1016 } |
| 1015 | 1017 |
| 1016 - (IBAction)recordUserMetrics:(id)sender { | 1018 - (IBAction)recordUserMetrics:(id)sender { |
| 1017 if (sender == toolsMenuButton_.get()) | 1019 if (sender == toolsMenuButton_) |
| 1018 base::RecordAction(UserMetricsAction("MobileToolbarShowMenu")); | 1020 base::RecordAction(UserMetricsAction("MobileToolbarShowMenu")); |
| 1019 else if (sender == stackButton_.get()) | 1021 else if (sender == stackButton_) |
| 1020 base::RecordAction(UserMetricsAction("MobileToolbarShowStackView")); | 1022 base::RecordAction(UserMetricsAction("MobileToolbarShowStackView")); |
| 1021 else if (sender == shareButton_.get()) | 1023 else if (sender == shareButton_) |
| 1022 base::RecordAction(UserMetricsAction("MobileToolbarShareMenu")); | 1024 base::RecordAction(UserMetricsAction("MobileToolbarShareMenu")); |
| 1023 else | 1025 else |
| 1024 NOTREACHED(); | 1026 NOTREACHED(); |
| 1025 } | 1027 } |
| 1026 | 1028 |
| 1027 - (IBAction)stackButtonTouchDown:(id)sender { | 1029 - (IBAction)stackButtonTouchDown:(id)sender { |
| 1028 // Exists only for override by subclasses. | 1030 // Exists only for override by subclasses. |
| 1029 } | 1031 } |
| 1030 | 1032 |
| 1031 + (CGFloat)toolbarDropShadowHeight { | 1033 + (CGFloat)toolbarDropShadowHeight { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1048 #pragma mark - | 1050 #pragma mark - |
| 1049 #pragma mark PopupMenuDelegate methods. | 1051 #pragma mark PopupMenuDelegate methods. |
| 1050 | 1052 |
| 1051 - (void)dismissPopupMenu:(PopupMenuController*)controller { | 1053 - (void)dismissPopupMenu:(PopupMenuController*)controller { |
| 1052 if ([controller isKindOfClass:[ToolsPopupController class]] && | 1054 if ([controller isKindOfClass:[ToolsPopupController class]] && |
| 1053 (ToolsPopupController*)controller == toolsPopupController_) | 1055 (ToolsPopupController*)controller == toolsPopupController_) |
| 1054 [self dismissToolsMenuPopup]; | 1056 [self dismissToolsMenuPopup]; |
| 1055 } | 1057 } |
| 1056 | 1058 |
| 1057 @end | 1059 @end |
| OLD | NEW |