1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_BASE_COCOA_ANIMATION_UTILS_H 6 #define UI_BASE_COCOA_ANIMATION_UTILS_H 7 8 #import <Cocoa/Cocoa.h> 9 #import <QuartzCore/QuartzCore.h> 10 11 // This class is a stack-based helper useful for unit testing of Cocoa UI, 12 // and any other situation where you want to temporarily turn off Cocoa 13 // animation for the life of a function call or other limited scope. 14 // Just declare one of these, and all animations will complete instantly until 15 // this goes out of scope and pops our state off the Core Animation stack. 16 // 17 // Example: 18 // MyUnitTest() { 19 // WithNoAnimation at_all; // Turn off Cocoa auto animation in this scope. 20 21 22 class WithNoAnimation { 23 public: 24 WithNoAnimation() { 25 [NSAnimationContext beginGrouping]; 26 [[NSAnimationContext currentContext] setDuration:0.0]; 27 } 28 29 ~WithNoAnimation() { 30 [NSAnimationContext endGrouping]; 31 } 32 }; 33 34 // Disables actions within a scope. 35 class ScopedCAActionDisabler { 36 public: 37 ScopedCAActionDisabler() { 38 [CATransaction begin]; 39 [CATransaction setValue:[NSNumber numberWithBool:YES] 40 forKey:kCATransactionDisableActions]; 41 } 42 43 ~ScopedCAActionDisabler() { 44 [CATransaction commit]; 45 } 46 }; 47 48 // Sets a duration on actions within a scope. 49 class ScopedCAActionSetDuration { 50 public: 51 explicit ScopedCAActionSetDuration(NSTimeInterval duration) { 52 [CATransaction begin]; 53 [CATransaction setValue:[NSNumber numberWithFloat:duration] 54 forKey:kCATransactionAnimationDuration]; 55 } 56 57 ~ScopedCAActionSetDuration() { 58 [CATransaction commit]; 59 } 60 }; 61 62 #endif // UI_BASE_COCOA_ANIMATION_UTILS_H 63