Chromium Code Reviews| Index: chrome/browser/ui/cocoa/tabpose_window.mm | 
| diff --git a/chrome/browser/ui/cocoa/tabpose_window.mm b/chrome/browser/ui/cocoa/tabpose_window.mm | 
| index eb649725d075c3e2958afbf91c557b951b1ec83e..74d340c16200306a7518ec4cab327e520e09d64e 100644 | 
| --- a/chrome/browser/ui/cocoa/tabpose_window.mm | 
| +++ b/chrome/browser/ui/cocoa/tabpose_window.mm | 
| @@ -375,6 +375,7 @@ class Tile { | 
| NSRect GetStartRectRelativeTo(const Tile& tile) const; | 
| NSRect thumb_rect() const { return thumb_rect_; } | 
| + NSRect GetFaviconStartRectRelativeTo(const Tile& tile) const; | 
| NSRect favicon_rect() const { return favicon_rect_; } | 
| SkBitmap favicon() const; | 
| @@ -389,6 +390,7 @@ class Tile { | 
| void set_font_metrics(CGFloat ascender, CGFloat descender); | 
| CGFloat title_font_size() const { return title_font_size_; } | 
| + NSRect GetTitleStartRectRelativeTo(const Tile& tile) const; | 
| NSRect title_rect() const { return title_rect_; } | 
| // Returns an unelided title. The view logic is responsible for eliding. | 
| @@ -422,6 +424,14 @@ NSRect Tile::GetStartRectRelativeTo(const Tile& tile) const { | 
| return rect; | 
| } | 
| +NSRect Tile::GetFaviconStartRectRelativeTo(const Tile& tile) const { | 
| + NSRect thumb_start = GetStartRectRelativeTo(tile); | 
| + NSRect rect = favicon_rect_; | 
| + rect.origin.x += NSMinX(thumb_start) - NSMinX(thumb_rect_); | 
| + rect.origin.y += NSMinY(thumb_start) - NSMinY(thumb_rect_); | 
| + return rect; | 
| +} | 
| + | 
| SkBitmap Tile::favicon() const { | 
| if (contents_->is_app()) { | 
| SkBitmap* icon = contents_->GetExtensionAppIcon(); | 
| @@ -431,6 +441,14 @@ SkBitmap Tile::favicon() const { | 
| return contents_->GetFavIcon(); | 
| } | 
| +NSRect Tile::GetTitleStartRectRelativeTo(const Tile& tile) const { | 
| + NSRect thumb_start = GetStartRectRelativeTo(tile); | 
| + NSRect rect = title_rect_; | 
| + rect.origin.x += NSMinX(thumb_start) - NSMinX(thumb_rect_); | 
| + rect.origin.y += NSMinY(thumb_start) - NSMinY(thumb_rect_); | 
| + return rect; | 
| +} | 
| + | 
| // Changes |title_rect| and |favicon_rect| such that the favicon is on the | 
| // font's baseline and that the minimum distance between thumb rect and | 
| // favicon and title rects doesn't change. | 
| @@ -844,6 +862,19 @@ void AnimateCALayerFrameFromTo( | 
| [layer addAnimation:animation forKey:@"position"]; | 
| } | 
| +void AnimateCALayerOpacityFromTo( | 
| + CALayer* layer, double from, double to, NSTimeInterval duration) { | 
| + CABasicAnimation* animation; | 
| + animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; | 
| + animation.fromValue = [NSNumber numberWithFloat:from]; | 
| + animation.toValue = [NSNumber numberWithFloat:to]; | 
| + animation.duration = duration; | 
| + | 
| + layer.opacity = to; | 
| + // Add the animation, overriding the implicit animation. | 
| + [layer addAnimation:animation forKey:@"opacity"]; | 
| +} | 
| + | 
| @interface TabposeWindow (Private) | 
| - (id)initForWindow:(NSWindow*)parent | 
| rect:(NSRect)rect | 
| @@ -917,6 +948,9 @@ void AnimateCALayerFrameFromTo( | 
| tileSet_->selected_tile()).size]); | 
| [layer setNeedsDisplay]; | 
| + NSTimeInterval interval = | 
| + kDefaultAnimationDuration * (slomo ? kSlomoFactor : 1); | 
| + | 
| // Background color as placeholder for now. | 
| layer.get().backgroundColor = CGColorGetConstantColor(kCGColorWhite); | 
| if (showZoom) { | 
| 
 
viettrungluu
2010/12/09 19:09:30
Can you make the three cases of |if (showZoom) { .
 
Nico
2010/12/09 19:12:03
I did, I extracted the common code to a function!
 
viettrungluu
2010/12/09 20:15:42
I'd like an "AnimateOrSetFrame()" (or whatever) fu
 
 | 
| @@ -924,7 +958,7 @@ void AnimateCALayerFrameFromTo( | 
| layer, | 
| tile.GetStartRectRelativeTo(tileSet_->selected_tile()), | 
| tile.thumb_rect(), | 
| - kDefaultAnimationDuration * (slomo ? kSlomoFactor : 1), | 
| + interval, | 
| animationDelegate); | 
| } else { | 
| layer.get().frame = NSRectToCGRect(tile.thumb_rect()); | 
| @@ -955,23 +989,39 @@ void AnimateCALayerFrameFromTo( | 
| mac_util::CopyNSImageToCGImage(nsFavicon)); | 
| CALayer* faviconLayer = [CALayer layer]; | 
| - faviconLayer.frame = NSRectToCGRect(tile.favicon_rect()); | 
| + if (showZoom) { | 
| + AnimateCALayerFrameFromTo( | 
| + faviconLayer, | 
| + tile.GetFaviconStartRectRelativeTo(tileSet_->selected_tile()), | 
| + tile.favicon_rect(), | 
| + interval, | 
| + nil); | 
| + AnimateCALayerOpacityFromTo(faviconLayer, 0.0, 1.0, interval); | 
| + } else { | 
| + faviconLayer.frame = NSRectToCGRect(tile.favicon_rect()); | 
| + } | 
| faviconLayer.contents = (id)favicon.get(); | 
| faviconLayer.zPosition = 1; // On top of the thumb shadow. | 
| - if (state_ == tabpose::kFadingIn) | 
| - faviconLayer.hidden = YES; | 
| [bgLayer_ addSublayer:faviconLayer]; | 
| [allFaviconLayers_ addObject:faviconLayer]; | 
| CATextLayer* titleLayer = [CATextLayer layer]; | 
| - titleLayer.frame = NSRectToCGRect(tile.title_rect()); | 
| + if (showZoom) { | 
| + AnimateCALayerFrameFromTo( | 
| + titleLayer, | 
| + tile.GetTitleStartRectRelativeTo(tileSet_->selected_tile()), | 
| + tile.title_rect(), | 
| + interval, | 
| + nil); | 
| + AnimateCALayerOpacityFromTo(titleLayer, 0.0, 1.0, interval); | 
| + } else { | 
| + titleLayer.frame = NSRectToCGRect(tile.title_rect()); | 
| + } | 
| titleLayer.string = base::SysUTF16ToNSString(tile.title()); | 
| titleLayer.fontSize = [font pointSize]; | 
| titleLayer.truncationMode = kCATruncationEnd; | 
| titleLayer.font = font; | 
| titleLayer.zPosition = 1; // On top of the thumb shadow. | 
| - if (state_ == tabpose::kFadingIn) | 
| - titleLayer.hidden = YES; | 
| [bgLayer_ addSublayer:titleLayer]; | 
| [allTitleLayers_ addObject:titleLayer]; | 
| } | 
| @@ -1201,11 +1251,6 @@ void AnimateCALayerFrameFromTo( | 
| [self selectedLayer].zPosition = 1; | 
| selectionHighlight_.hidden = YES; | 
| - for (CALayer* layer in allFaviconLayers_.get()) | 
| - layer.hidden = YES; | 
| - for (CALayer* layer in allTitleLayers_.get()) | 
| - layer.hidden = YES; | 
| - | 
| // Running animations with shadows is slow, so turn shadows off before | 
| // running the exit animation. | 
| for (CALayer* layer in allThumbnailLayers_.get()) | 
| @@ -1216,14 +1261,9 @@ void AnimateCALayerFrameFromTo( | 
| CGFloat duration = | 
| 1.3 * kDefaultAnimationDuration * (slomo ? kSlomoFactor : 1); | 
| ScopedCAActionSetDuration durationSetter(duration); | 
| - for (NSUInteger i = 0; i < [allThumbnailLayers_ count]; ++i) { | 
| + for (int i = 0; i < tabStripModel_->count(); ++i) { | 
| + const tabpose::Tile& tile = tileSet_->tile_at(i); | 
| CALayer* layer = [allThumbnailLayers_ objectAtIndex:i]; | 
| - // |start_thumb_rect_| was relative to the initial index, now this needs to | 
| - // be relative to |selectedIndex_| (whose start rect was relative to | 
| - // the initial index, too). | 
| - CGRect newFrame = NSRectToCGRect( | 
| - tileSet_->tile_at(i).GetStartRectRelativeTo(tileSet_->selected_tile())); | 
| - | 
| // Add a delegate to one of the implicit animations to get a notification | 
| // once the animations are done. | 
| if (static_cast<int>(i) == tileSet_->selected_index()) { | 
| @@ -1233,12 +1273,22 @@ void AnimateCALayerFrameFromTo( | 
| [layer addAnimation:animation forKey:@"frame"]; | 
| } | 
| - layer.frame = newFrame; | 
| + layer.frame = NSRectToCGRect( | 
| + tile.GetStartRectRelativeTo(tileSet_->selected_tile())); | 
| if (static_cast<int>(i) == tileSet_->selected_index()) { | 
| // Redraw layer at big resolution, so that zoom-in isn't blocky. | 
| [layer setNeedsDisplay]; | 
| } | 
| + | 
| + CALayer* faviconLayer = [allFaviconLayers_ objectAtIndex:i]; | 
| + faviconLayer.frame = NSRectToCGRect( | 
| + tile.GetFaviconStartRectRelativeTo(tileSet_->selected_tile())); | 
| + faviconLayer.opacity = 0; | 
| + CALayer* titleLayer = [allTitleLayers_ objectAtIndex:i]; | 
| + titleLayer.frame = NSRectToCGRect( | 
| + tile.GetTitleStartRectRelativeTo(tileSet_->selected_tile())); | 
| + titleLayer.opacity = 0; | 
| } | 
| } | 
| @@ -1251,10 +1301,6 @@ void AnimateCALayerFrameFromTo( | 
| state_ = tabpose::kFadedIn; | 
| selectionHighlight_.hidden = NO; | 
| - for (CALayer* layer in allFaviconLayers_.get()) | 
| - layer.hidden = NO; | 
| - for (CALayer* layer in allTitleLayers_.get()) | 
| - layer.hidden = NO; | 
| // Running animations with shadows is slow, so turn shadows on only after | 
| // the animation is done. |