From f28f2c6e8cd1e54a05d0b0ea989e8d4652c94b77 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 27 Jan 2009 16:57:46 -0800 Subject: [PATCH] Performance improvements to pop up menus. Reviewed by me. --- AppKit/CPButton.j | 4 ++++ AppKit/CPMenu.j | 37 +++++++++++++++++++++++++----------- AppKit/_CPImageAndTextView.j | 4 ++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 4c5495d15..8ce0aa4a3 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -567,6 +567,10 @@ var _CPButtonClassName = nil, [self addSubview:_imageAndTextView]; } + + [_imageAndTextView setText:_isHighlighted && _alternateTitle ? _alternateTitle : _title]; + [_imageAndTextView setImage:_isHighlighted && _alternateImage ? _alternateImage : _image]; + [_imageAndTextView sizeToFit]; var frame = [_imageAndTextView frame], diff --git a/AppKit/CPMenu.j b/AppKit/CPMenu.j index f0a1c73d9..c75b0d9e5 100644 --- a/AppKit/CPMenu.j +++ b/AppKit/CPMenu.j @@ -1238,6 +1238,7 @@ var STICKY_TIME_INTERVAL = 500, @implementation _CPMenuView : CPView { CPArray _menuItemViews; + CPArray _visibleMenuItemViews; CPFont _font; } @@ -1264,21 +1265,32 @@ var STICKY_TIME_INTERVAL = 500, - (int)itemIndexAtPoint:(CGPoint)aPoint { - var index = 0, - count = _menuItemViews.length; + var x = aPoint.x, + bounds = [self bounds]; - for (; index < count; ++index) + if (x < CGRectGetMinX(bounds) || x > CGRectGetMaxX(bounds)) + return CPNotFound; + + var y = aPoint.y, + low = 0, + high = _visibleMenuItemViews.length - 1; + + while (low <= high) { - var view = _menuItemViews[index]; + var middle = FLOOR(low + (high - low) / 2), + frame = [_visibleMenuItemViews[middle] frame]; - if ([view isHidden]) - continue; + if (y < CGRectGetMinY(frame)) + high = middle - 1; - if (CGRectContainsPoint([view frame], aPoint)) - return index; - } - - return CPNotFound; + else if (y > CGRectGetMaxY(frame)) + low = middle + 1.; + + else + return middle; + } + + return CPNotFound; } - (void)setMenu:(CPMenu)aMenu @@ -1288,6 +1300,7 @@ var STICKY_TIME_INTERVAL = 500, [_menuItemViews makeObjectsPerformSelector:@selector(removeFromSuperview)]; _menuItemViews = []; + _visibleMenuItemViews = []; var menu = [self menu]; @@ -1311,6 +1324,8 @@ var STICKY_TIME_INTERVAL = 500, if ([item isHidden]) continue; + _visibleMenuItemViews.push(view); + [view setFont:_font]; [view setShowsStateColumn:showsStateColumn]; [view synchronizeWithMenuItem]; diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index c2fc5a5c1..bed94ba91 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -665,12 +665,12 @@ var HORIZONTAL_MARGIN = 3.0, if (!_textSize) _textSize = [_text sizeWithFont:_font ? _font : [CPFont systemFontOfSize:12.0]]; - if (_imagePosition == CPImageLeft || _imagePosition == CPImageRight) + if (_imagePosition === CPImageLeft || _imagePosition === CPImageRight) { size.width += _textSize.width + HORIZONTAL_MARGIN; size.height = MAX(size.height, _textSize.height); } - else if (_imagePosition == CPImageAbove || _imagePosition == CPImageBelow) + else if (_imagePosition === CPImageAbove || _imagePosition === CPImageBelow) { size.width = MAX(size.width, _textSize.width); size.height += _textSize.height + VERTICAL_MARGIN;