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

Unified Diff: chrome/browser/cocoa/find_bar_cocoa_controller.mm

Issue 195105: [Mac] Adds animations to the findbar.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/cocoa/find_bar_cocoa_controller.mm
===================================================================
--- chrome/browser/cocoa/find_bar_cocoa_controller.mm (revision 26362)
+++ chrome/browser/cocoa/find_bar_cocoa_controller.mm (working copy)
@@ -16,6 +16,21 @@
#import "chrome/browser/cocoa/tab_strip_controller.h"
#include "chrome/browser/tab_contents/tab_contents.h"
+namespace {
+static float kFindBarOpenDuration = 0.2;
+static float kFindBarCloseDuration = 0.15;
+}
+
+@interface FindBarCocoaController (PrivateMethods)
+// Returns the appropriate frame for a hidden find bar.
+- (NSRect)hiddenFindBarFrame;
+
+// Sets the frame of |findBarView_|. |duration| is ignored if |animate| is NO.
+- (void)setFindBarFrame:(NSRect)endFrame
+ animate:(BOOL)animate
+ duration:(float)duration;
+@end
+
@implementation FindBarCocoaController
- (id)init {
@@ -25,13 +40,20 @@
return self;
}
+- (void)dealloc {
+ // All animations should be explicitly stopped by the TabContents before a tab
+ // is closed.
+ DCHECK(!currentAnimation_.get());
+ [super dealloc];
+}
+
- (void)setFindBarBridge:(FindBarBridge*)findBarBridge {
DCHECK(!findBarBridge_); // should only be called once.
findBarBridge_ = findBarBridge;
}
- (void)awakeFromNib {
- [[self view] setHidden:YES];
+ [findBarView_ setFrame:[self hiddenFindBarFrame]];
}
- (IBAction)close:(id)sender {
@@ -53,17 +75,17 @@
true, false);
}
-// Positions the find bar view in the correct location based on the current
-// state of the window. The findbar is always positioned one pixel above the
-// infobar container. Note that we are using the infobar container location as
-// a proxy for the toolbar location, but we cannot position based on the toolbar
-// because the toolbar is not always present (for example in fullscreen
-// windows).
+// Positions the find bar container view in the correct location based on the
+// current state of the window. The find bar container is always positioned one
+// pixel above the infobar container. Note that we are using the infobar
+// container location as a proxy for the toolbar location, but we cannot
+// position based on the toolbar because the toolbar is not always present (for
+// example in fullscreen windows).
- (void)positionFindBarView:(NSView*)infoBarContainerView {
static const int kRightEdgeOffset = 25;
- NSView* findBarView = [self view];
- int findBarHeight = NSHeight([findBarView frame]);
- int findBarWidth = NSWidth([findBarView frame]);
+ NSView* containerView = [self view];
+ int containerHeight = NSHeight([containerView frame]);
+ int containerWidth = NSWidth([containerView frame]);
// Start by computing the upper right corner of the infobar container, then
// move left by a constant offset and up one pixel. This gives us the upper
@@ -73,9 +95,9 @@
int max_x = NSMaxX(windowRect) - kRightEdgeOffset;
int max_y = NSMaxY(windowRect) + 1;
- NSRect findRect = NSMakeRect(max_x - findBarWidth, max_y - findBarHeight,
- findBarWidth, findBarHeight);
- [findBarView setFrame:findRect];
+ NSRect newFrame = NSMakeRect(max_x - containerWidth, max_y - containerHeight,
+ containerWidth, containerHeight);
+ [containerView setFrame:newFrame];
}
// NSControl delegate method.
@@ -141,22 +163,33 @@
}
// Methods from FindBar
-- (void)showFindBar {
- [[self view] setHidden:NO];
-
- // Save the currently-focused view. |[self view]| is in the view
+- (void)showFindBar:(BOOL)animate {
+ // Save the currently-focused view. |findBarView_| is in the view
// hierarchy by now. showFindBar can be called even when the
// findbar is already open, so do not overwrite an already saved
// view.
if (!focusTracker_.get())
focusTracker_.reset(
- [[FocusTracker alloc] initWithWindow:[[self view] window]]);
+ [[FocusTracker alloc] initWithWindow:[findBarView_ window]]);
+
+ // Animate the view into place.
+ NSRect frame = [findBarView_ frame];
+ frame.origin = NSMakePoint(0, 0);
+ [self setFindBarFrame:frame animate:animate duration:kFindBarOpenDuration];
}
-- (void)hideFindBar {
- [[self view] setHidden:YES];
+- (void)hideFindBar:(BOOL)animate {
+ NSRect frame = [self hiddenFindBarFrame];
+ [self setFindBarFrame:frame animate:animate duration:kFindBarCloseDuration];
}
+- (void)stopAnimation {
+ if (currentAnimation_.get()) {
+ [currentAnimation_ stopAnimation];
+ currentAnimation_.reset(nil);
+ }
+}
+
- (void)setFocusAndSelection {
[[findText_ window] makeFirstResponder:findText_];
@@ -164,12 +197,11 @@
BOOL buttonsEnabled = ([[findText_ stringValue] length] > 0) ? YES : NO;
[previousButton_ setEnabled:buttonsEnabled];
[nextButton_ setEnabled:buttonsEnabled];
-
}
- (void)restoreSavedFocus {
if (!(focusTracker_.get() &&
- [focusTracker_ restoreFocusInWindow:[[self view] window]])) {
+ [focusTracker_ restoreFocusInWindow:[findBarView_ window]])) {
// Fall back to giving focus to the tab contents.
findBarBridge_->GetFindBarController()->tab_contents()->Focus();
}
@@ -236,7 +268,55 @@
}
- (BOOL)isFindBarVisible {
- return [[self view] isHidden] ? NO : YES;
+ // Find bar is visible if any part of it is on the screen.
+ return NSIntersectsRect([[self view] bounds], [findBarView_ frame]);
}
+// NSAnimation delegate methods.
+- (void)animationDidEnd:(NSAnimation*)animation {
+ // Autorelease the animation (cannot use release because the animation object
+ // is still on the stack.
+ DCHECK(animation == currentAnimation_.get());
+ [currentAnimation_.release() autorelease];
pink (ping after 24hrs) 2009/09/18 13:40:12 i assume release() here doesn't actually call rele
rohitrao (ping after 24h) 2009/09/18 15:17:58 I'll file a bug against Mark =)
Mark Mentovai 2009/09/18 15:35:13 This is not what you want. Use current_animation_
+}
+
@end
+
+@implementation FindBarCocoaController (PrivateMethods)
+- (NSRect)hiddenFindBarFrame {
pink (ping after 24hrs) 2009/09/18 13:40:12 blank line between these, maybe?
rohitrao (ping after 24h) 2009/09/18 15:17:58 Done.
+ NSRect frame = [findBarView_ frame];
+ NSRect containerBounds = [[self view] bounds];
+ frame.origin = NSMakePoint(NSMinX(containerBounds), NSMaxY(containerBounds));
+ return frame;
+}
+
+- (void)setFindBarFrame:(NSRect)endFrame
+ animate:(BOOL)animate
+ duration:(float)duration {
+ // Save the current frame.
+ NSRect startFrame = [findBarView_ frame];
+
+ // Stop any existing animations.
+ [currentAnimation_ stopAnimation];
+
+ if (!animate) {
+ [findBarView_ setFrame:endFrame];
+ currentAnimation_.reset(nil);
+ return;
+ }
+
+ // Reset the frame to what was saved above.
+ [findBarView_ setFrame:startFrame];
+ NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
+ findBarView_, NSViewAnimationTargetKey,
+ [NSValue valueWithRect:endFrame], NSViewAnimationEndFrameKey, nil];
+
+ currentAnimation_.reset(
+ [[NSViewAnimation alloc]
+ initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]);
+ [currentAnimation_ setDuration:duration];
+ [currentAnimation_ setDelegate:self];
+ [currentAnimation_ startAnimation];
+}
+
+@end
« no previous file with comments | « chrome/browser/cocoa/find_bar_cocoa_controller.h ('k') | chrome/browser/cocoa/find_bar_cocoa_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698