VoiceMac/Classes/VoiceMob/Views/MGMMiddleView.m

291 lines
9.3 KiB
Objective-C

//
// MGMMiddleView.m
// VoiceMob
//
// Created by Mr. Gecko on 10/11/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
#import "MGMMiddleView.h"
#import <MGMUsers/MGMUsers.h>
NSString * const MGMMFontName = @"Helvetica";
@implementation MGMMiddleViewButton
+ (id)buttonWithTitle:(NSString *)theTitle image:(NSString *)theImage target:(id)theTarget action:(SEL)theAction {
return [[[self alloc] initWithTitle:theTitle image:theImage target:theTarget action:theAction] autorelease];
}
- (id)initWithTitle:(NSString *)theTitle image:(NSString *)theImage target:(id)theTarget action:(SEL)theAction {
if ((self = [super init])) {
title = [theTitle copy];
image = [theImage copy];
target = theTarget;
action = theAction;
}
return self;
}
- (void)dealloc {
[title release];
[image release];
[super dealloc];
}
- (void)setTitle:(NSString *)theTitle {
[title release];
title = [theTitle copy];
}
- (NSString *)title {
return title;
}
- (void)setImage:(NSString *)theImage {
[image release];
image = [theImage copy];
}
- (NSString *)image {
return image;
}
- (void)setTarget:(id)theTarget {
target = theTarget;
}
- (id)target {
return target;
}
- (void)setAction:(SEL)theAction {
action = theAction;
}
- (SEL)action {
return action;
}
- (void)setHighlighted:(BOOL)isHighlighted {
highlighted = isHighlighted;
}
- (BOOL)highlighted {
return highlighted;
}
- (void)setRect:(CGRect)theRect {
rect = theRect;
}
- (CGRect)rect {
return rect;
}
@end
@implementation MGMMiddleView
- (void)dealloc {
#if releaseDebug
NSLog(@"%s Releasing", __PRETTY_FUNCTION__);
#endif
[buttons release];
[super dealloc];
}
- (void)setDelegate:(id)theDelegate {
delegate = theDelegate;
}
- (id<MGMMiddleViewDelegate>)delegate {
return delegate;
}
- (void)addButtonWithTitle:(NSString *)theTitle imageName:(NSString *)theImage target:(id)theTarget action:(SEL)theAction {
if (buttons==nil) buttons = [NSMutableArray new];
[buttons addObject:[MGMMiddleViewButton buttonWithTitle:theTitle image:theImage target:theTarget action:theAction]];
[self updateButtonRects];
[self setNeedsDisplay];
}
- (void)setButtons:(NSArray *)theButtons {
[buttons release];
buttons = [theButtons mutableCopy];
[self updateButtonRects];
}
- (NSArray *)buttons {
return buttons;
}
- (void)updateButtonRects {
CGRect bounds = [self bounds];
int count = [buttons count];
int row = 3;
int numRow = count/row;
if (numRow<=1) {
row = 2;
numRow = count/row;
}
int width = bounds.size.width/row;
int height = bounds.size.height/numRow;
int index = 0;
for (int r=0; r<numRow; r++) {
int y = (r*height) + bounds.origin.y;
for (int i=0; i<row; i++) {
int x = (i*width) + bounds.origin.x;
CGRect buttonRect = CGRectMake(x, y, width, height);
[[buttons objectAtIndex:index] setRect:buttonRect];
index++;
}
}
}
- (void)setHighlighted:(BOOL)isHighlighted forButtonAtIndex:(int)theIndex {
[[buttons objectAtIndex:theIndex] setHighlighted:isHighlighted];
[self setNeedsDisplay];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
touchStartPoint = [touch locationInView:self];
for (int i=0; i<[buttons count]; i++) {
if (CGRectContainsPoint([[buttons objectAtIndex:i] rect], touchStartPoint)) {
touchStartIndex = i;
[self setHighlighted:YES forButtonAtIndex:i];
break;
}
}
[super touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self setHighlighted:NO forButtonAtIndex:touchStartIndex];
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
BOOL cancel = YES;
for (int i=0; i<[buttons count]; i++) {
if (CGRectContainsPoint([[buttons objectAtIndex:i] rect], point)) {
if (touchStartIndex==i) {
cancel = NO;
MGMMiddleViewButton *button = [buttons objectAtIndex:i];
NSMethodSignature *signature = [[button target] methodSignatureForSelector:[button action]];
if (signature!=nil) {
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:[button action]];
[invocation setArgument:&self atIndex:2];
[invocation setArgument:&i atIndex:3];
[invocation invokeWithTarget:[button target]];
}
if (delegate!=nil && [delegate respondsToSelector:@selector(middleViewDidSelect:atIndex:)]) [delegate middleViewDidSelect:self atIndex:touchStartIndex];
}
break;
}
}
if (cancel && delegate!=nil && [delegate respondsToSelector:@selector(middleViewDidCancel:atIndex:)]) [delegate middleViewDidCancel:self atIndex:touchStartIndex];
[super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
if (delegate!=nil && [delegate respondsToSelector:@selector(middleViewDidCancel:atIndex:)]) [delegate middleViewDidCancel:self atIndex:touchStartIndex];
[self setHighlighted:NO forButtonAtIndex:touchStartIndex];
[super touchesCancelled:touches withEvent:event];
}
- (void)drawRect:(CGRect)frameRect {
UIColor *blackColor = [UIColor colorWithWhite:0.0 alpha:0.6];
UIColor *whiteColor = [UIColor colorWithWhite:1.0 alpha:0.1];
UIColor *highlightStartColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.6];
UIColor *highlightEndColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.5 alpha:0.6];
CGFloat radius = 20.0;
CGRect bounds = [self bounds];
MGMPath *path = [MGMPath pathWithRoundedRect:bounds cornerRadius:radius];
[path fillGradientFrom:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.6] to:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.6]];
CGRect innerBounds = bounds;
innerBounds.size.width -= 1;
innerBounds.origin.x += 0.5;
innerBounds.size.height -= 1;
innerBounds.origin.y += 0.5;
MGMPath *innerPath = [MGMPath pathWithRoundedRect:innerBounds cornerRadius:radius];
[blackColor setStroke];
[innerPath stroke];
CGRect innerWhiteBounds = innerBounds;
innerWhiteBounds.size.width -= 2;
innerWhiteBounds.origin.x += 1;
innerWhiteBounds.size.height -= 2;
innerWhiteBounds.origin.y += 1;
MGMPath *innerWhitePath = [MGMPath pathWithRoundedRect:innerWhiteBounds cornerRadius:radius];
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
[innerWhitePath addClip];
int count = [buttons count];
int row = 3;
int numRow = count/row;
if (numRow<=1) {
row = 2;
numRow = count/row;
}
int width = bounds.size.width/row;
int height = bounds.size.height/numRow;
int index = 0;
for (int r=0; r<numRow; r++) {
int y = (r*height) + bounds.origin.y;
for (int i=0; i<row; i++) {
int x = (i*width) + bounds.origin.x;
MGMMiddleViewButton *button = [buttons objectAtIndex:index];
if ([button highlighted]) {
CGRect highlightRect = CGRectMake(x, y, width, height);
MGMPath *highlightPath = [MGMPath pathWithRect:highlightRect];
[highlightPath fillGradientFrom:highlightStartColor to:highlightEndColor];
}
if ([button image]!=nil) {
CGRect imageRect = CGRectMake(x+5, y+10, width-10, height-30);
UIImage *image = [UIImage imageNamed:[button image]];
CGSize size = [image size];
float scaleFactor = 0.0;
float scaledWidth = imageRect.size.width;
float scaledHeight = imageRect.size.height;
if (!CGSizeEqualToSize(size, imageRect.size)) {
float widthFactor = imageRect.size.width / size.width;
float heightFactor = imageRect.size.height / size.height;
if (widthFactor < heightFactor)
scaleFactor = widthFactor;
else
scaleFactor = heightFactor;
scaledWidth = size.width * scaleFactor;
scaledHeight = size.height * scaleFactor;
}
[image drawInRect:CGRectMake(imageRect.origin.x+((imageRect.size.width-scaledWidth)/2), imageRect.origin.y+((imageRect.size.height-scaledHeight)/2), scaledWidth, scaledHeight)];
}
if ([button title]!=nil) {
[[UIColor whiteColor] set];
UIFont *font = [UIFont fontWithName:MGMMFontName size:12.0];
CGFloat actualSize;
CGSize titleSize = [[button title] sizeWithFont:font minFontSize:0.5 actualFontSize:&actualSize forWidth:width-15 lineBreakMode:UILineBreakModeClip];
font = [UIFont fontWithName:MGMMFontName size:actualSize];
titleSize = [[button title] sizeWithFont:font forWidth:width-15 lineBreakMode:UILineBreakModeClip];
CGPoint titlePoint = CGPointMake(x+((width-titleSize.width)/2), (y+height)-20);
[[button title] drawAtPoint:titlePoint withFont:font];
}
if (x!=bounds.origin.x) {
CGRect lineRect = CGRectMake(x, bounds.origin.y, 1, bounds.size.height);
MGMPath *linePath = [MGMPath pathWithRect:lineRect];
[blackColor setFill];
[linePath fill];
CGRect lineWhiteRect = CGRectMake(x+1, bounds.origin.y, 1, bounds.size.height);
MGMPath *lineWhitePath = [MGMPath pathWithRect:lineWhiteRect];
[whiteColor setFill];
[lineWhitePath fill];
}
index++;
}
if (y!=bounds.origin.y) {
CGRect lineRect = CGRectMake(bounds.origin.x, y, bounds.size.width, 1);
MGMPath *linePath = [MGMPath pathWithRect:lineRect];
[blackColor setFill];
[linePath fill];
CGRect lineWhiteRect = CGRectMake(bounds.origin.x, y-1, bounds.size.width, 1);
MGMPath *lineWhitePath = [MGMPath pathWithRect:lineWhiteRect];
[whiteColor setFill];
[lineWhitePath fill];
}
}
CGContextRestoreGState(currentContext);
[whiteColor setStroke];
[innerWhitePath stroke];
}
@end