mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-22 18:30:43 +00:00
Performance improvements to pop up menus.
Reviewed by me.
This commit is contained in:
@@ -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
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user