item_drag_controller.mm revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#import "ui/app_list/cocoa/item_drag_controller.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#import "ui/app_list/cocoa/apps_grid_view_item.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/cocoa/window_size_constants.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Scale to transform the grid cell when a drag starts. Note that 1.5 ensures
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// that integers are used for the layer bounds when the grid cell dimensions
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are even.
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const CGFloat kDraggingIconScale = 1.5;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const NSTimeInterval kAnimationDuration = 0.2;
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NSString* const kGrowAnimationKey = @"growAnimation";
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@interface ItemDragController ()
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animateTransformFrom:(CATransform3D)fromValue
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 useDelegate:(BOOL)useDelegate;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)clearAnimations;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@end
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@implementation ItemDragController
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (id)initWithGridCellSize:(NSSize)size {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if ((self = [super init])) {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NSRect frameRect = NSMakeRect(0,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  0,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size.width * kDraggingIconScale,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  size.height * kDraggingIconScale);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::scoped_nsobject<NSView> dragView(
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        [[NSView alloc] initWithFrame:frameRect]);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [dragView setWantsLayer:YES];
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [dragView setHidden:YES];
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dragLayer_.reset([[CALayer layer] retain]);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [dragLayer_ setFrame:NSRectToCGRect(frameRect)];
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [[dragView layer] addSublayer:dragLayer_];
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [self setView:dragView];
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return self;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)initiate:(AppsGridViewItem*)item
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mouseDownLocation:(NSPoint)mouseDownLocation
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      currentLocation:(NSPoint)currentLocation
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            timestamp:(NSTimeInterval)eventTimestamp {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [self clearAnimations];
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSView* itemView = [item view];
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSPoint pointInGridCell = [itemView convertPoint:mouseDownLocation
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          fromView:nil];
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mouseOffset_ = NSMakePoint(pointInGridCell.x - NSMidX([itemView bounds]),
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             NSMidY([itemView bounds]) - pointInGridCell.y);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NSBitmapImageRep* imageRep = [item dragRepresentationForRestore:NO];
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ setContents:reinterpret_cast<id>([imageRep CGImage])];
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ setTransform:CATransform3DIdentity];
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add a grow animation to the layer.
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CATransform3D growFrom = CATransform3DScale(CATransform3DIdentity,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0 / kDraggingIconScale,
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0 / kDraggingIconScale,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [self animateTransformFrom:growFrom
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 useDelegate:NO];
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  growStart_ = eventTimestamp;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [[self view] setHidden:NO];
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)update:(NSPoint)currentLocation
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     timestamp:(NSTimeInterval)eventTimestamp {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSPoint pointInSuperview = [[[self view] superview]
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      convertPoint:currentLocation
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          fromView:nil];
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSRect rect = [[self view] bounds];
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSPoint anchor = NSMakePoint(NSMidX(rect), NSMidY(rect));
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the grow animation is still in progress, make the point of the image
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that was clicked appear stuck to the mouse cursor.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CGFloat progress = (eventTimestamp - growStart_) / kAnimationDuration;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CGFloat currentIconScale = progress < 1.0 ?
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      1.0 + (kDraggingIconScale - 1.0) * progress :
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDraggingIconScale;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pointInSuperview.x -= (mouseOffset_.x * currentIconScale + anchor.x);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pointInSuperview.y -= (mouseOffset_.y * currentIconScale + anchor.y);
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [[self view] setFrameOrigin:pointInSuperview];
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)complete:(AppsGridViewItem*)item
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    targetOrigin:(NSPoint)targetOrigin {
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [self clearAnimations];
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSView* itemView = [item view];
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NSBitmapImageRep* imageRep = [item dragRepresentationForRestore:YES];
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ setContents:reinterpret_cast<id>([imageRep CGImage])];
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ setTransform:CATransform3DScale(CATransform3DIdentity,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0 / kDraggingIconScale,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0 / kDraggingIconScale,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              1.0)];
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Retain the button so it can be unhidden when the animation completes. Note
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that the |item| and corresponding button can differ from the |item| passed
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to initiate(), if it moved to a new page during the drag. At this point the
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // destination page is known, so retain the button.
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  buttonToRestore_.reset([[item button] retain]);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add the shrink animation for the layer.
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [self animateTransformFrom:CATransform3DIdentity
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 useDelegate:YES];
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shrinking_ = YES;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Also animate the translation, on the view.
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(tapted): This should be merged into the scale transform, instead of
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // using a separate NSViewAnimation.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSRect startRect = [[self view] frame];
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The final position needs to be adjusted since it shrinks from each side.
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSRect targetRect = NSMakeRect(
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      targetOrigin.x - NSMidX([itemView bounds]) * (kDraggingIconScale - 1),
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      targetOrigin.y - NSMidY([itemView bounds]) * (kDraggingIconScale - 1),
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      startRect.size.width,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      startRect.size.height);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NSDictionary* animationDict = @{
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NSViewAnimationTargetKey:     [self view],
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NSViewAnimationStartFrameKey: [NSValue valueWithRect:startRect],
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NSViewAnimationEndFrameKey:   [NSValue valueWithRect:targetRect]
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::scoped_nsobject<NSViewAnimation> translate([[NSViewAnimation alloc]
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      initWithViewAnimations:[NSArray arrayWithObject:animationDict]]);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [translate setDuration:kAnimationDuration];
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [translate startAnimation];
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animateTransformFrom:(CATransform3D)fromValue
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 useDelegate:(BOOL)useDelegate {
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CABasicAnimation* animation =
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      [CABasicAnimation animationWithKeyPath:@"transform"];
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [animation setFromValue:[NSValue valueWithCATransform3D:fromValue]];
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (useDelegate)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    [animation setDelegate:self];
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [animation setDuration:kAnimationDuration];
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [CATransaction begin];
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [CATransaction setValue:[NSNumber numberWithFloat:kAnimationDuration]
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   forKey:kCATransactionAnimationDuration];
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ addAnimation:animation
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    forKey:@"transform"];
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [CATransaction commit];
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)clearAnimations {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ removeAllAnimations];
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!shrinking_)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(buttonToRestore_);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [buttonToRestore_ setHidden:NO];
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  buttonToRestore_.reset();
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  shrinking_ = NO;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animationDidStop:(CAAnimation*)anim
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                finished:(BOOL)finished {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!finished)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(shrinking_);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [self clearAnimations];
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [dragLayer_ setContents:nil];
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  [[self view] setHidden:YES];
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@end
189