// // MPRootFunctionLayout.m // MathPad // // Created by Kim Wittenburg on 11.01.15. // Copyright (c) 2015 Kim Wittenburg. All rights reserved. // #import "MPRootFunctionLayout.h" #import "MPRootFunction.h" #define kRootFunctionTrailingOffset 3 #define kRootFunctionLineWidth 1 #define kRootFunctionLineFragmentLength (self.usesSmallSize ? 3 : 4) #define kRootFunctionVWidth 5 #define kRootFunctionExpressionXOffset 2 #define kRootFunctionExponentXInset kRootFunctionLineFragmentLength @implementation MPRootFunctionLayout - (MPRootFunction *)rootFunction { return (MPRootFunction *)self.function; } - (NSUInteger)indexOfLeadingChild { return 1; } - (NSUInteger)indexOfTrailingChild { return 1; } - (NSUInteger)indexOfChildBelowChildAtIndex:(NSUInteger)index { return 1; } - (NSUInteger)indexOfChildAboveChildAtIndex:(NSUInteger)index { return 0; } - (NSUInteger)indexOfChildAfterChildAtIndex:(NSUInteger)index { return index == 0 ? 1 : NSNotFound; } - (NSIndexSet *)indexesOfRemainingChildren { return [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]; } - (BOOL)childAtIndexUsesSmallSize:(NSUInteger)index { return index == 0; } - (NSPoint)offsetOfChildLayoutAtIndex:(NSUInteger)index { NSRect exponentBounds = [self childLayoutAtIndex:0].bounds; NSRect rootBounds = [self childLayoutAtIndex:1].bounds; if (index == 0) { CGFloat x; if (exponentBounds.size.width > kRootFunctionExponentXInset) { x = 0; } else { x = kRootFunctionExponentXInset - exponentBounds.size.width; } return NSMakePoint(x, rootBounds.size.height / 2.0 + rootBounds.origin.y - exponentBounds.origin.y); } else { CGFloat rootSymbolXOffset = exponentBounds.size.width > kRootFunctionExponentXInset ? exponentBounds.size.width - kRootFunctionExponentXInset : 0; CGFloat x = rootSymbolXOffset + kRootFunctionLineFragmentLength + kRootFunctionVWidth + kRootFunctionExpressionXOffset; return NSMakePoint(x, 0); } } - (NSIndexPath *)indexPathForLocalMousePoint:(NSPoint)point { return [[NSIndexPath indexPathWithIndex:1] indexPathByAddingIndex:0]; } - (NSRect)generateBounds { CGFloat x, y, width, height; NSRect exponentBounds = [self childLayoutAtIndex:0].bounds; NSRect rootBounds = [self childLayoutAtIndex:1].bounds; x = 0; y = rootBounds.origin.y; CGFloat rootSymbolXOffset = exponentBounds.size.width > kRootFunctionLineFragmentLength ? exponentBounds.size.width : kRootFunctionLineFragmentLength; width = rootSymbolXOffset + kRootFunctionVWidth + kRootFunctionExpressionXOffset + rootBounds.size.width + kRootFunctionTrailingOffset; CGFloat heightToExponent = rootBounds.size.height / 2.0 + exponentBounds.size.height; height = MAX(heightToExponent, rootBounds.size.height + kRootFunctionLineWidth); return NSMakeRect(x, y, width, height); } - (void)draw { NSRect exponentBounds = [self childLayoutAtIndex:0].bounds; NSRect rootBounds = [self childLayoutAtIndex:1].bounds; CGFloat rootSymbolXOffset = exponentBounds.size.width > kRootFunctionExponentXInset ? exponentBounds.size.width - kRootFunctionExponentXInset : 0; NSBezierPath *rootPath = [NSBezierPath bezierPath]; NSPoint currentPoint = NSMakePoint(rootSymbolXOffset, rootBounds.size.height / 2.0 + rootBounds.origin.y); [rootPath moveToPoint:currentPoint]; currentPoint.x += kRootFunctionLineFragmentLength; [rootPath lineToPoint:currentPoint]; currentPoint.x += kRootFunctionVWidth / 2.0; currentPoint.y = rootBounds.origin.y; [rootPath lineToPoint:currentPoint]; currentPoint.x += kRootFunctionVWidth / 2.0; currentPoint.y = rootBounds.size.height + rootBounds.origin.y; [rootPath lineToPoint:currentPoint]; currentPoint.x += rootBounds.size.width; [rootPath lineToPoint:currentPoint]; [rootPath stroke]; } @end