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

Side by Side Diff: chrome/browser/autocomplete/autocomplete_popup_view_mac.mm

Issue 2010002: [Mac] Fixes janky animations in the omnibox popup.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_popup_view_mac.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "chrome/browser/autocomplete/autocomplete_popup_view_mac.h" 5 #include "chrome/browser/autocomplete/autocomplete_popup_view_mac.h"
6 6
7 #include "app/resource_bundle.h" 7 #include "app/resource_bundle.h"
8 #include "app/text_elider.h" 8 #include "app/text_elider.h"
9 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
10 #include "chrome/browser/autocomplete/autocomplete_edit.h" 10 #include "chrome/browser/autocomplete/autocomplete_edit.h"
(...skipping 26 matching lines...) Expand all
37 // autocomplete_popup_contents_view.cc, kGlassPopupTransparency). 37 // autocomplete_popup_contents_view.cc, kGlassPopupTransparency).
38 const CGFloat kPopupAlpha = 240.0 / 255.0; 38 const CGFloat kPopupAlpha = 240.0 / 255.0;
39 39
40 // How much space to leave for the left and right margins. 40 // How much space to leave for the left and right margins.
41 const CGFloat kLeftRightMargin = 5.0; 41 const CGFloat kLeftRightMargin = 5.0;
42 42
43 // How far to offset the text column from the left. 43 // How far to offset the text column from the left.
44 const CGFloat kTextXOffset = 29.0; 44 const CGFloat kTextXOffset = 29.0;
45 45
46 // Animation duration when animating the popup window smaller. 46 // Animation duration when animating the popup window smaller.
47 const CGFloat kShrinkAnimationDuration = 0.1; 47 const NSTimeInterval kShrinkAnimationDuration = 0.1;
48
49 // A very short animation duration used to cancel running animations.
50 const NSTimeInterval kCancelAnimationDuration = 0.00001;
48 51
49 // Maximum fraction of the popup width that can be used to display match 52 // Maximum fraction of the popup width that can be used to display match
50 // contents. 53 // contents.
51 const float kMaxContentsFraction = 0.7; 54 const float kMaxContentsFraction = 0.7;
52 55
53 // NSEvent -buttonNumber for middle mouse button. 56 // NSEvent -buttonNumber for middle mouse button.
54 const static NSInteger kMiddleButtonNumber(2); 57 const static NSInteger kMiddleButtonNumber(2);
55 58
56 // Background colors for different states of the popup elements. 59 // Background colors for different states of the popup elements.
57 NSColor* BackgroundColor() { 60 NSColor* BackgroundColor() {
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 [popup_ setBackgroundColor:[NSColor clearColor]]; 292 [popup_ setBackgroundColor:[NSColor clearColor]];
290 [popup_ setHasShadow:YES]; 293 [popup_ setHasShadow:YES];
291 [popup_ setLevel:NSNormalWindowLevel]; 294 [popup_ setLevel:NSNormalWindowLevel];
292 295
293 scoped_nsobject<AutocompleteMatrix> matrix( 296 scoped_nsobject<AutocompleteMatrix> matrix(
294 [[AutocompleteMatrix alloc] initWithPopupView:this]); 297 [[AutocompleteMatrix alloc] initWithPopupView:this]);
295 [popup_ setContentView:matrix]; 298 [popup_ setContentView:matrix];
296 } 299 }
297 } 300 }
298 301
302 void AutocompletePopupViewMac::SetPopupFrame(const NSRect frame) {
303 // Do nothing if the popup is already animating to the given |frame|.
304 if (NSEqualRects(frame, targetPopupFrame_))
305 return;
306
307 NSRect currentPopupFrame = [popup_ frame];
308 targetPopupFrame_ = frame;
309
310 // Animate the frame change if the only change is that the height got smaller.
311 // Otherwise, resize immediately.
312 bool animate = (NSHeight(frame) < NSHeight(currentPopupFrame) &&
313 NSWidth(frame) == NSWidth(currentPopupFrame));
314 NSTimeInterval duration =
315 (animate ? kShrinkAnimationDuration: kCancelAnimationDuration);
316
317 [NSAnimationContext beginGrouping];
318 // Don't use the GTM additon for the "Steve" slowdown because this can happen
319 // async from user actions and the effects could be a surprise.
320 [[NSAnimationContext currentContext] setDuration:duration];
321 [[popup_ animator] setFrame:frame display:YES];
322 [NSAnimationContext endGrouping];
323 }
324
299 void AutocompletePopupViewMac::UpdatePopupAppearance() { 325 void AutocompletePopupViewMac::UpdatePopupAppearance() {
300 DCHECK([NSThread isMainThread]); 326 DCHECK([NSThread isMainThread]);
301 const AutocompleteResult& result = model_->result(); 327 const AutocompleteResult& result = model_->result();
302 if (result.empty()) { 328 if (result.empty()) {
303 [[popup_ parentWindow] removeChildWindow:popup_]; 329 [[popup_ parentWindow] removeChildWindow:popup_];
304 [popup_ orderOut:nil]; 330 [popup_ orderOut:nil];
305 331
306 // Break references to matrix_target_ before releasing popup_. 332 // Break references to matrix_target_ before releasing popup_.
307 NSMatrix* matrix = [popup_ contentView]; 333 NSMatrix* matrix = [popup_ contentView];
308 [matrix setTarget:nil]; 334 [matrix setTarget:nil];
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 } 373 }
348 374
349 // Set the cell size to fit a line of text in the cell's font. All 375 // Set the cell size to fit a line of text in the cell's font. All
350 // cells should use the same font and each should layout in one 376 // cells should use the same font and each should layout in one
351 // line, so they should all be about the same height. 377 // line, so they should all be about the same height.
352 const NSSize cellSize = [[matrix cellAtRow:0 column:0] cellSize]; 378 const NSSize cellSize = [[matrix cellAtRow:0 column:0] cellSize];
353 DCHECK_GT(cellSize.height, 0.0); 379 DCHECK_GT(cellSize.height, 0.0);
354 [matrix setCellSize:NSMakeSize(r.size.width, 380 [matrix setCellSize:NSMakeSize(r.size.width,
355 cellSize.height + kCellHeightAdjust)]; 381 cellSize.height + kCellHeightAdjust)];
356 382
383 // Save the old matrix frame in order to later restore it.
384 NSRect savedMatrixFrame = [matrix frame];
385
357 // Make the matrix big enough to hold all the cells. 386 // Make the matrix big enough to hold all the cells.
358 [matrix sizeToCells]; 387 [matrix sizeToCells];
359 388
360 // Make the window just as big. 389 // Make the window just as big.
361 r.size.height = [matrix frame].size.height; 390 r.size.height = [matrix frame].size.height;
362 r.origin.y -= r.size.height + kPopupFieldGap; 391 r.origin.y -= r.size.height + kPopupFieldGap;
363 392
393 // Resize the matrix back to its original size, since we aren't resizing the
394 // window immediately.
395 [matrix setFrame:savedMatrixFrame];
396
364 // Update the selection. 397 // Update the selection.
365 PaintUpdatesNow(); 398 PaintUpdatesNow();
366 399
367 // Animate the frame change if the only change is that the height got smaller. 400 SetPopupFrame(r);
368 // Otherwise, resize immediately.
369 NSRect oldFrame = [popup_ frame];
370 if (r.size.height < oldFrame.size.height &&
371 r.origin.x == oldFrame.origin.x &&
372 r.size.width == oldFrame.size.width) {
373 [NSAnimationContext beginGrouping];
374 // Don't use the GTM additon for the "Steve" slowdown because this can
375 // happen async from user actions and the effects could be a surprise.
376 [[NSAnimationContext currentContext] setDuration:kShrinkAnimationDuration];
377 [[popup_ animator] setFrame:r display:YES];
378 [NSAnimationContext endGrouping];
379 } else {
380 [popup_ setFrame:r display:YES];
381 }
382 401
383 if (!IsOpen()) { 402 if (!IsOpen()) {
384 [[field_ window] addChildWindow:popup_ ordered:NSWindowAbove]; 403 [[field_ window] addChildWindow:popup_ ordered:NSWindowAbove];
385 } 404 }
386 } 405 }
387 406
388 // This is only called by model in SetSelectedLine() after updating 407 // This is only called by model in SetSelectedLine() after updating
389 // everything. Popup should already be visible. 408 // everything. Popup should already be visible.
390 void AutocompletePopupViewMac::PaintUpdatesNow() { 409 void AutocompletePopupViewMac::PaintUpdatesNow() {
391 AutocompleteMatrix* matrix = [popup_ contentView]; 410 AutocompleteMatrix* matrix = [popup_ contentView];
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 titleRect.size.width -= (kTextXOffset + kLeftRightMargin); 496 titleRect.size.width -= (kTextXOffset + kLeftRightMargin);
478 titleRect.origin.x += kTextXOffset; 497 titleRect.origin.x += kTextXOffset;
479 [self drawTitle:title withFrame:titleRect inView:controlView]; 498 [self drawTitle:title withFrame:titleRect inView:controlView];
480 } 499 }
481 } 500 }
482 501
483 @end 502 @end
484 503
485 @implementation AutocompleteMatrix 504 @implementation AutocompleteMatrix
486 505
506
507
487 // Remove all tracking areas and initialize the one we want. Removing 508 // Remove all tracking areas and initialize the one we want. Removing
488 // all might be overkill, but it's unclear why there would be others 509 // all might be overkill, but it's unclear why there would be others
489 // for the popup window. 510 // for the popup window.
490 - (void)resetTrackingArea { 511 - (void)resetTrackingArea {
491 for (NSTrackingArea* trackingArea in [self trackingAreas]) { 512 for (NSTrackingArea* trackingArea in [self trackingAreas]) {
492 [self removeTrackingArea:trackingArea]; 513 [self removeTrackingArea:trackingArea];
493 } 514 }
494 515
495 // TODO(shess): Consider overriding -acceptsFirstMouse: and changing 516 // TODO(shess): Consider overriding -acceptsFirstMouse: and changing
496 // NSTrackingActiveInActiveApp to NSTrackingActiveAlways. 517 // NSTrackingActiveInActiveApp to NSTrackingActiveAlways.
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 bottomRightCornerRadius:0.0]; 696 bottomRightCornerRadius:0.0];
676 697
677 // Draw the matrix clipped to our border. 698 // Draw the matrix clipped to our border.
678 [NSGraphicsContext saveGraphicsState]; 699 [NSGraphicsContext saveGraphicsState];
679 [path addClip]; 700 [path addClip];
680 [super drawRect:rect]; 701 [super drawRect:rect];
681 [NSGraphicsContext restoreGraphicsState]; 702 [NSGraphicsContext restoreGraphicsState];
682 } 703 }
683 704
684 @end 705 @end
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_popup_view_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698