Add Root Function and Product Function
This commit is contained in:
137
MathKit/MPRootFunctionLayout.m
Executable file
137
MathKit/MPRootFunctionLayout.m
Executable file
@@ -0,0 +1,137 @@
|
||||
//
|
||||
// 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
|
||||
Reference in New Issue
Block a user