project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m
author Wuzzy <Wuzzy2@mail.ru>
Thu, 15 Mar 2018 21:15:16 +0100
changeset 13221 02bf6902eeb0
parent 11217 e68b3e392091
permissions -rwxr-xr-x
Remove Qt SVG and Qt OpenGL as hard dependencies Qt SVG is not used in the frontend (no SVGs are rendered). Neither is Qt OpenGL used. Qt OpenGL is discouraged anyway.

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

#import "MGSplitCornersView.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;
}


#pragma mark -
#pragma mark Geometry helpers


static double deg2Rad(double degrees)
{
    // Converts degrees to radians.
    return degrees * (M_PI / 180.0);
}


#pragma mark -
#pragma mark Drawing


- (void)drawRect:(CGRect)rect
{
	// Draw two appropriate corners, with cornerBackgroundColor behind them.
	if (cornerRadius > 0) {
		
		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:(float)deg2Rad(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:(float)deg2Rad(180) endAngle:(float)deg2Rad(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:(float)deg2Rad(270) endAngle:(float)deg2Rad(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:(float)deg2Rad(180) endAngle:(float)deg2Rad(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:(float)deg2Rad(180) endAngle:(float)deg2Rad(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:(float)deg2Rad(180) endAngle:(float)deg2Rad(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:(float)deg2Rad(270) endAngle:(float)deg2Rad(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:(float)deg2Rad(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 = color;
		[self setNeedsDisplay];
	}
}


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


@end