diff --git a/AppKit/CPToolbar.j b/AppKit/CPToolbar.j index 0b1afce9b..8c2a717e2 100644 --- a/AppKit/CPToolbar.j +++ b/AppKit/CPToolbar.j @@ -1174,6 +1174,10 @@ var LABEL_MARGIN = 2.0; - (void)setEnabled:(BOOL)shouldBeEnabled { + // Tiling is very expensive so try to avoid it. The CPToolbarItem should already be careful to not notifying about its enabled state needlessly. + if ([self isEnabled] === shouldBeEnabled) + return; + [super setEnabled:shouldBeEnabled]; if (shouldBeEnabled) diff --git a/AppKit/CPToolbarItem.j b/AppKit/CPToolbarItem.j index 47be03820..6c6478a0f 100644 --- a/AppKit/CPToolbarItem.j +++ b/AppKit/CPToolbarItem.j @@ -275,6 +275,9 @@ CPToolbarPrintItemIdentifier = @"CPToolbarPrintItem"; */ - (void)setEnabled:(BOOL)shouldBeEnabled { + if (_isEnabled === shouldBeEnabled) + return; + if ([_view respondsToSelector:@selector(setEnabled:)]) [_view setEnabled:shouldBeEnabled]; @@ -457,26 +460,49 @@ CPToolbarItemVisibilityPriorityUser if (_view) { if ([target respondsToSelector:@selector(validateToolbarItem:)]) - [self setEnabled:[target validateToolbarItem:self]]; + { + var shouldBeEnabled = [target validateToolbarItem:self]; + if (_isEnabled !== shouldBeEnabled) + [self setEnabled:shouldBeEnabled]; + } return; } if (!action) - return [self setEnabled:NO]; + { + if (_isEnabled) + return [self setEnabled:NO]; + return; + } if (target && ![target respondsToSelector:action]) - return [self setEnabled:NO]; + { + if (_isEnabled) + return [self setEnabled:NO]; + return; + } target = [CPApp targetForAction:action to:target from:self]; if (!target) - return [self setEnabled:NO]; + { + if (_isEnabled) + return [self setEnabled:NO]; + return; + } if ([target respondsToSelector:@selector(validateToolbarItem:)]) - [self setEnabled:[target validateToolbarItem:self]]; + { + var shouldBeEnabled = [target validateToolbarItem:self]; + if (_isEnabled !== shouldBeEnabled) + [self setEnabled:shouldBeEnabled]; + } else - [self setEnabled:YES]; + { + if (!_isEnabled) + [self setEnabled:YES]; + } } - (BOOL)autovalidates