Performance improvements to pop up menus.

Reviewed by me.
This commit is contained in:
Francisco Ryan Tolmasky I
2009-01-27 16:57:46 -08:00
parent 10b34965bd
commit f28f2c6e8c
3 changed files with 32 additions and 13 deletions
+4
View File
@@ -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],
+26 -11
View File
@@ -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];
+2 -2
View File
@@ -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;