project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m
author dag10
Mon, 21 Jan 2013 21:52:49 -0500
changeset 8424 225ede46e3dc
parent 6908 896ed2afcfb8
child 8441 a00b0fa0dbd7
permissions -rwxr-xr-x
On pagenetgame, when window is too small the map/game options becomes a tabbed interface to allow for a few lines of chat to always be visible. Restored HWForm's min height to 580. Fixed the 2px alignment issue with the map list and map previews' top edges that unC0Rr was whining about. <3

//
//  MGSplitCornersView.m
//  MGSplitView
//
//  Created by Matt Gemmell on 28/07/2010.
//  Copyright 2010 Instinctive Code.
//

#import "MGSplitCornersView.h"
#import "CGPointUtils.h"

@implementation MGSplitCornersView


#pragma mark -
#pragma mark Setup and teardown


- (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame])) {
		self.contentMode = UIViewContentModeRedraw;
		self.userInteractionEnabled = NO;
		self.opaque = NO;
		self.backgroundColor = [UIColor clearColor];
		cornerRadius = 0.0; // actual value is set by the splitViewController.
		cornersPosition = MGCornersPositionLeadingVertical;
    }
	
    return self;
}


- (void)dealloc
{
	self.cornerBackgroundColor = nil;
	
	[super dealloc];
}


#pragma mark -
#pragma mark Drawing


- (void)drawRect:(CGRect)rect
{
	// Draw two appropriate corners, with cornerBackgroundColor behind them.
	if (cornerRadius > 0) {
		if (NO) { // just for debugging.
			[[UIColor redColor] set];
			UIRectFill(self.bounds);
		}
		
		float maxX = CGRectGetMaxX(self.bounds);
		float maxY = CGRectGetMaxY(self.bounds);
		UIBezierPath *path = [UIBezierPath bezierPath];
		CGPoint pt = CGPointZero;
		switch (cornersPosition) {
			case MGCornersPositionLeadingVertical: // top of screen for a left/right split
				[path moveToPoint:pt];
				pt.y += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
				pt.x += cornerRadius;
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				[path addLineToPoint:CGPointZero];
				[path closePath];
				
				pt.x = maxX - cornerRadius;
				pt.y = 0;
				[path moveToPoint:pt];
				pt.y = maxY;
				[path addLineToPoint:pt];
				pt.x += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				break;
				
			case MGCornersPositionTrailingVertical: // bottom of screen for a left/right split
				pt.y = maxY;
				[path moveToPoint:pt];
				pt.y -= cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
				pt.x += cornerRadius;
				pt.y += cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				pt.x = maxX - cornerRadius;
				pt.y = maxY;
				[path moveToPoint:pt];
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				pt.x += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
				pt.y += cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				break;
				
			case MGCornersPositionLeadingHorizontal: // left of screen for a top/bottom split
				pt.x = 0;
				pt.y = cornerRadius;
				[path moveToPoint:pt];
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				pt.x += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
				pt.y += cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				pt.x = 0;
				pt.y = maxY - cornerRadius;
				[path moveToPoint:pt];
				pt.y = maxY;
				[path addLineToPoint:pt];
				pt.x += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				break;
				
			case MGCornersPositionTrailingHorizontal: // right of screen for a top/bottom split
				pt.y = cornerRadius;
				[path moveToPoint:pt];
				pt.y -= cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
				pt.x += cornerRadius;
				pt.y += cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				pt.y = maxY - cornerRadius;
				[path moveToPoint:pt];
				pt.y += cornerRadius;
				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
				pt.x += cornerRadius;
				pt.y -= cornerRadius;
				[path addLineToPoint:pt];
				pt.x -= cornerRadius;
				[path addLineToPoint:pt];
				[path closePath];
				
				break;
				
			default:
				break;
		}
		
		[self.cornerBackgroundColor set];
		[path fill];
	}
}


#pragma mark -
#pragma mark Accessors and properties


- (void)setCornerRadius:(float)newRadius
{
	if (newRadius != cornerRadius) {
		cornerRadius = newRadius;
		[self setNeedsDisplay];
	}
}


- (void)setSplitViewController:(MGSplitViewController *)theController
{
	if (theController != splitViewController) {
		splitViewController = theController;
		[self setNeedsDisplay];
	}
}


- (void)setCornersPosition:(MGCornersPosition)posn
{
	if (cornersPosition != posn) {
		cornersPosition = posn;
		[self setNeedsDisplay];
	}
}


- (void)setCornerBackgroundColor:(UIColor *)color
{
	if (color != cornerBackgroundColor) {
		[cornerBackgroundColor release];
		cornerBackgroundColor = [color retain];
		[self setNeedsDisplay];
	}
}


@synthesize cornerRadius;
@synthesize splitViewController;
@synthesize cornersPosition;
@synthesize cornerBackgroundColor;


@end