Index: chrome/browser/cocoa/extensions/browser_actions_controller.mm |
=================================================================== |
--- chrome/browser/cocoa/extensions/browser_actions_controller.mm (revision 43254) |
+++ chrome/browser/cocoa/extensions/browser_actions_controller.mm (working copy) |
@@ -63,8 +63,10 @@ |
// Useful in the case of a Browser Action being added/removed from the middle of |
// the container, this method repositions each button according to the current |
-// toolbar model. |
-- (void)repositionActionButtonsAndAnimate:(BOOL)animate; |
+// toolbar model. Since during an insert or remove, the icons to the right will |
+// be the only ones needing a position change, a starting point is provided. |
+- (void)repositionActionButtonsStartingAtIndex:(NSUInteger)index |
+ animate:(BOOL)animate; |
// During container resizing, buttons become more transparent as they are pushed |
// off the screen. This method updates each button's opacity determined by the |
@@ -188,12 +190,10 @@ |
// ExtensionToolbarModel::Observer implementation. |
void BrowserActionAdded(Extension* extension, int index) { |
[owner_ createActionButtonForExtension:extension withIndex:index]; |
- [owner_ resizeContainerAndAnimate:NO]; |
} |
void BrowserActionRemoved(Extension* extension) { |
[owner_ removeActionButtonForExtension:extension]; |
- [owner_ resizeContainerAndAnimate:NO]; |
} |
private: |
@@ -273,6 +273,7 @@ |
[self createButtons]; |
[self showChevronIfNecessaryInFrame:[containerView_ frame] animate:NO]; |
[self updateGrippyCursors]; |
+ isInitialized_ = YES; |
} |
return self; |
@@ -317,11 +318,9 @@ |
[self showChevronIfNecessaryInFrame:frame animate:animate]; |
- if (!animate) { |
- [[NSNotificationCenter defaultCenter] |
- postNotificationName:kBrowserActionVisibilityChangedNotification |
- object:self]; |
- } |
+ [[NSNotificationCenter defaultCenter] |
+ postNotificationName:kBrowserActionVisibilityChangedNotification |
+ object:self]; |
} |
- (NSView*)browserActionViewForExtension:(Extension*)extension { |
@@ -461,6 +460,8 @@ |
[buttons_ setObject:newButton forKey:buttonKey]; |
if (index < [self containerButtonCapacity]) { |
[containerView_ addSubview:newButton]; |
+ if (!profile_->IsOffTheRecord() && isInitialized_) |
+ toolbarModel_->SetVisibleIconCount([self visibleButtonCount]); |
} else { |
[hiddenButtons_ addObject:newButton]; |
[newButton setAlphaValue:0.0]; |
@@ -473,10 +474,12 @@ |
name:kBrowserActionButtonDraggingNotification |
object:newButton]; |
- [self repositionActionButtonsAndAnimate:NO]; |
[containerView_ setMaxWidth: |
[self containerWidthWithButtonCount:[self buttonCount]]]; |
- [containerView_ setNeedsDisplay:YES]; |
+ [self resizeContainerAndAnimate:isInitialized_]; |
+ |
+ // TODO(andybons): Use isInitialized_ to animate this. |
+ [self repositionActionButtonsStartingAtIndex:0 animate:NO]; |
} |
- (void)removeActionButtonForExtension:(Extension*)extension { |
@@ -488,35 +491,45 @@ |
return; |
BrowserActionButton* button = [buttons_ objectForKey:buttonKey]; |
+ [buttons_ removeObjectForKey:buttonKey]; |
// This could be the case in incognito, where only a subset of extensions are |
// shown. |
if (!button) |
return; |
[button removeFromSuperview]; |
- // It may or may not be hidden, but it won't matter to NSMutableArray either |
- // way. |
- [hiddenButtons_ removeObject:button]; |
- [self updateOverflowMenu]; |
- [buttons_ removeObjectForKey:buttonKey]; |
+ if ([hiddenButtons_ containsObject:button]) { |
+ [hiddenButtons_ removeObject:button]; |
+ [self updateOverflowMenu]; |
+ } else { |
+ if (!profile_->IsOffTheRecord() && isInitialized_) |
+ toolbarModel_->SetVisibleIconCount([self visibleButtonCount]); |
+ } |
+ |
if ([self buttonCount] == 0) { |
// No more buttons? Hide the container. |
[containerView_ setHidden:YES]; |
} else { |
- [self repositionActionButtonsAndAnimate:NO]; |
+ [self repositionActionButtonsStartingAtIndex:0 animate:NO]; |
} |
[containerView_ setMaxWidth: |
[self containerWidthWithButtonCount:[self buttonCount]]]; |
- [containerView_ setNeedsDisplay:YES]; |
+ [self resizeContainerAndAnimate:isInitialized_]; |
} |
-- (void)repositionActionButtonsAndAnimate:(BOOL)animate { |
+- (void)repositionActionButtonsStartingAtIndex:(NSUInteger)index |
+ animate:(BOOL)animate { |
NSUInteger i = 0; |
for (ExtensionList::iterator iter = toolbarModel_->begin(); |
iter != toolbarModel_->end(); ++iter) { |
if (![self shouldDisplayBrowserAction:*iter]) |
continue; |
+ |
+ if (i < index) { |
+ ++i; |
+ continue; |
+ } |
BrowserActionButton* button = [self buttonForExtension:(*iter)]; |
if (!button) |
continue; |
@@ -657,7 +670,7 @@ |
if (intersectionWidth > dragThreshold && button != draggedButton && |
![button isAnimating] && index < [self visibleButtonCount]) { |
toolbarModel_->MoveBrowserAction([draggedButton extension], index); |
- [self repositionActionButtonsAndAnimate:YES]; |
+ [self repositionActionButtonsStartingAtIndex:0 animate:YES]; |
return; |
} |
++index; |
@@ -666,7 +679,7 @@ |
- (void)actionButtonDragFinished:(NSNotification*)notification { |
[self showChevronIfNecessaryInFrame:[containerView_ frame] animate:YES]; |
- [self repositionActionButtonsAndAnimate:YES]; |
+ [self repositionActionButtonsStartingAtIndex:0 animate:YES]; |
} |
- (void)moveButton:(BrowserActionButton*)button |