project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m
author unc0rr
Thu, 23 Jul 2015 19:51:14 +0300
changeset 11027 ba585693e19d
parent 8441 a00b0fa0dbd7
child 11115 3729ac42189b
permissions -rwxr-xr-x
Don't allow too big messages from clients

//
//  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