From 2ad026d0196bffe83f8c80681cac51fb76bdb31e Mon Sep 17 00:00:00 2001 From: Christian Beer Date: Mon, 29 Aug 2022 14:27:03 +0200 Subject: [PATCH 1/4] Swift Package Manager --- Package.swift | 49 +++++++++++++++++++++++++++++++++ mathEditor/include/mathEditor.h | 15 ++++++++++ 2 files changed, 64 insertions(+) create mode 100644 Package.swift create mode 100644 mathEditor/include/mathEditor.h diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..d4c5787 --- /dev/null +++ b/Package.swift @@ -0,0 +1,49 @@ +// swift-tools-version: 5.6 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MathEditor", + defaultLocalization: "en", + platforms: [ + .iOS(.v14) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "MathEditor", + targets: ["MathEditor"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + .package(url: "https://github.com/chbeer/iosMath.git", branch: "master"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "MathEditor", + dependencies: [ + "iosMath" + ], + path: "mathEditor", + resources: [ + .process("../MathKeyboardResources/KeyboardAssests.xcassets"), + .process("../MathKeyboardResources/MTKeyboard.xib"), + .process("../MathKeyboardResources/MTKeyboardTab2.xib"), + .process("../MathKeyboardResources/MTKeyboardTab3.xib"), + .process("../MathKeyboardResources/MTKeyboardTab4.xib"), + .process("../MathKeyboardResources/MTMathKeyboardRootView.xib"), + .process("../MathKeyboardResources/NewKeyboardAssets.xcassets"), + .process("../MathKeyboardResources/WhiteBGKeyboardTab.xcassets"), + .process("../MathKeyboardResources/lmroman10-bolditalic.otf"), + ] + ), + .testTarget( + name: "MathEditorTests", + dependencies: ["MathEditor"], + path: "Tests" + ), + ] +) diff --git a/mathEditor/include/mathEditor.h b/mathEditor/include/mathEditor.h new file mode 100644 index 0000000..8b97d88 --- /dev/null +++ b/mathEditor/include/mathEditor.h @@ -0,0 +1,15 @@ +// +// Header.h +// +// +// Created by Christian Beer on 29.08.22. +// + +#ifndef Header_h +#define Header_h + +#include "../editor/MTEditableMathLabel.h" +#include "../keyboard/MTKeyboard.h" +#include "../keyboard/MTMathKeyboardRootView.h" + +#endif /* Header_h */ From d01fb627511355d88b6d2d17b6217a4918fc2e7c Mon Sep 17 00:00:00 2001 From: Christian Beer Date: Mon, 29 Aug 2022 17:36:24 +0200 Subject: [PATCH 2/4] Moved to tag for iosMath --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d4c5787..d2b1b01 100644 --- a/Package.swift +++ b/Package.swift @@ -17,7 +17,7 @@ let package = Package( ], dependencies: [ // Dependencies declare other packages that this package depends on. - .package(url: "https://github.com/chbeer/iosMath.git", branch: "master"), + .package(url: "https://github.com/chbeer/iosMath.git", from: "0.9.5"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. From 6f571b00c18f59203703898e29ff9f356eadd053 Mon Sep 17 00:00:00 2001 From: Christian Beer Date: Wed, 31 Aug 2022 09:34:33 +0200 Subject: [PATCH 3/4] Cleanup --- Package.swift | 5 +++++ mathEditor/editor/MTEditableMathLabel.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d2b1b01..f898d48 100644 --- a/Package.swift +++ b/Package.swift @@ -38,6 +38,11 @@ let package = Package( .process("../MathKeyboardResources/NewKeyboardAssets.xcassets"), .process("../MathKeyboardResources/WhiteBGKeyboardTab.xcassets"), .process("../MathKeyboardResources/lmroman10-bolditalic.otf"), + ], + cSettings: [ + .headerSearchPath("editor"), + .headerSearchPath("internal"), + .headerSearchPath("keyboard"), ] ), .testTarget( diff --git a/mathEditor/editor/MTEditableMathLabel.h b/mathEditor/editor/MTEditableMathLabel.h index 318a7fb..1485006 100644 --- a/mathEditor/editor/MTEditableMathLabel.h +++ b/mathEditor/editor/MTEditableMathLabel.h @@ -9,7 +9,7 @@ // #import -#import +@import iosMath; @class MTEditableMathLabel; @class MTMathListIndex; From b60deda49ad7673151774bfb09f601b34093b0cd Mon Sep 17 00:00:00 2001 From: Christian Beer Date: Mon, 17 Jul 2023 11:57:25 +0200 Subject: [PATCH 4/4] visionOS support --- Tests/MTDisplayEditingTest.m | 436 ++++++++++++------------ mathEditor/editor/MTEditableMathLabel.m | 4 + mathEditor/keyboard/MTKeyboard.m | 2 + 3 files changed, 226 insertions(+), 216 deletions(-) diff --git a/Tests/MTDisplayEditingTest.m b/Tests/MTDisplayEditingTest.m index 23adc74..aab0480 100644 --- a/Tests/MTDisplayEditingTest.m +++ b/Tests/MTDisplayEditingTest.m @@ -12,219 +12,223 @@ @import CoreText; -#import "MTMathListDisplay.h" -#import "MTDisplay+Editing.h" -#import "MTMathListBuilder.h" -#import "MTFontManager.h" -#import "MTTypesetter.h" - -@interface MTDisplayEditingTest : XCTestCase - -@property (nonatomic) MTFont* font; -@end - - -@implementation MTDisplayEditingTest - -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. - CGFloat fontSize = 20; - _font = [[MTFontManager fontManager] latinModernFontWithSize:fontSize]; -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -static NSValue* point(CGFloat x, CGFloat y) { - return [NSValue valueWithCGPoint:CGPointMake(x, y)]; -} - -- (void)testClosestPointForExpression:(NSString*) expr data:(NSDictionary*) testData -{ - MTMathList* ml = [MTMathListBuilder buildFromString:expr]; - MTDisplay* displayList = [MTTypesetter createLineForMathList:ml font:_font style:kMTLineStyleDisplay]; - - for (NSValue* point in testData) { - CGPoint cgPoint = [point CGPointValue]; - MTMathListIndex* expectedIndex = testData[point]; - MTMathListIndex* index = [displayList closestIndexToPoint:cgPoint]; - XCTAssertEqualObjects(index, expectedIndex, @"Index %@ does not match %@ for point (%f, %f)", index, expectedIndex, cgPoint.x, cgPoint.y); - } -} - -static NSDictionary* getFractionTestData() { - return @{ point(-10, 8) : [MTMathListIndex level0Index:0], - point(-10, 0) : [MTMathListIndex level0Index:0], - point(-10, 40) : [MTMathListIndex level0Index:0], - point(-10, -20) : [MTMathListIndex level0Index:0], - point(-2.5, 8) : [MTMathListIndex level0Index:0], - point(-2.5, 0) : [MTMathListIndex level0Index:0], - point(-2.5, 40) : [MTMathListIndex level0Index:0], - point(-2.5, -20) : [MTMathListIndex level0Index:0], - point(-1, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(-1, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(-1, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(-1, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(3, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(3, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(3, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(3, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(7, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(7, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(7, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(7, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(11, -20) : [MTMathListIndex level0Index:1], // because it is below the height of the fraction - point(12.5, 8) : [MTMathListIndex level0Index:1], - point(12.5, 0) : [MTMathListIndex level0Index:1], - point(12.5, 40) : [MTMathListIndex level0Index:1], - point(12.5, -20) : [MTMathListIndex level0Index:1], - point(20, 8) : [MTMathListIndex level0Index:1], - point(20, 0) : [MTMathListIndex level0Index:1], - point(20, 40) : [MTMathListIndex level0Index:1], - point(20, -20) : [MTMathListIndex level0Index:1] }; -} - -- (void)testClosestPointFraction -{ - [self testClosestPointForExpression:@"\\frac{3}{2}" data:getFractionTestData()]; -} - -static NSDictionary* getRegularTestData() { - return @{ point(-10, 8) : [MTMathListIndex level0Index:0], - point(-10, 0) : [MTMathListIndex level0Index:0], - point(-10, 40) : [MTMathListIndex level0Index:0], - point(-10, -20) : [MTMathListIndex level0Index:0], - point(0, 0) : [MTMathListIndex level0Index:0], - point(0, 8) : [MTMathListIndex level0Index:0], - point(0, 40) : [MTMathListIndex level0Index:0], - point(0, -20) : [MTMathListIndex level0Index:0], - point(10, 0) : [MTMathListIndex level0Index:1], - point(10, 8) : [MTMathListIndex level0Index:1], - point(10, 40) : [MTMathListIndex level0Index:1], - point(10, -20) : [MTMathListIndex level0Index:1], - point(15, 0) : [MTMathListIndex level0Index:1], - point(15, 8) : [MTMathListIndex level0Index:1], - point(15, 40) : [MTMathListIndex level0Index:1], - point(15, -20) : [MTMathListIndex level0Index:1], - point(25, 0) : [MTMathListIndex level0Index:2], - point(25, 8) : [MTMathListIndex level0Index:2], - point(25, 40) : [MTMathListIndex level0Index:2], - point(25, -20) : [MTMathListIndex level0Index:2], - point(35, 0) : [MTMathListIndex level0Index:2], - point(35, 8) : [MTMathListIndex level0Index:2], - point(35, 40) : [MTMathListIndex level0Index:2], - point(35, -20) : [MTMathListIndex level0Index:2], - point(45, 0) : [MTMathListIndex level0Index:3], - point(45, 8) : [MTMathListIndex level0Index:3], - point(45, 40) : [MTMathListIndex level0Index:3], - point(45, -20) : [MTMathListIndex level0Index:3], - point(55, 0) : [MTMathListIndex level0Index:3], - point(55, 8) : [MTMathListIndex level0Index:3], - point(55, 40) : [MTMathListIndex level0Index:3], - point(55, -20) : [MTMathListIndex level0Index:3], }; -} - -- (void) testClosestPointRegular -{ - [self testClosestPointForExpression:@"4+2" data:getRegularTestData()]; -} - -static NSDictionary* getRegularPlusFractionTestData() { - return @{ point(30, 0) : [MTMathListIndex level0Index:2], - point(30, 8) : [MTMathListIndex level0Index:2], - point(30, 40) : [MTMathListIndex level0Index:2], - point(30, -20) : [MTMathListIndex level0Index:2], - point(32, 0) : [MTMathListIndex level0Index:2], - point(32, 8) : [MTMathListIndex level0Index:2], - point(32, 40) : [MTMathListIndex level0Index:2], - point(32, -20) : [MTMathListIndex level0Index:2], - point(33, 0) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(33, 8) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(33, 40) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(33, -20) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(35, 0) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], - point(35, 8) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(35, 40) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], - point(35, -20) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator]}; - -} - -- (void)testClosestPointRegularPlusFraction -{ - [self testClosestPointForExpression:@"1+\\frac{3}{2}" data:getRegularPlusFractionTestData()]; -} - -static NSDictionary* getFractionPlusRegularTestData() { - return @{ point(15, 0) : [MTMathListIndex level0Index:1], - point(15, 8) : [MTMathListIndex level0Index:1], - point(15, 40) : [MTMathListIndex level0Index:1], - point(15, -20) : [MTMathListIndex level0Index:1], - point(13, 0) : [MTMathListIndex level0Index:1], - point(13, 8) : [MTMathListIndex level0Index:1], - point(13, 40) : [MTMathListIndex level0Index:1], - point(13, -20) : [MTMathListIndex level0Index:1], - point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(11, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(9, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], - point(9, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(9, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], - point(9, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator]}; - -} - -- (void)testClosestPointFractionPlusRegular -{ - [self testClosestPointForExpression:@"\\frac{3}{2}+1" data:getFractionPlusRegularTestData()]; -} - -static NSDictionary* getExponentTestData() { - return @{ point(-10, 8) : [MTMathListIndex level0Index:0], - point(-10, 0) : [MTMathListIndex level0Index:0], - point(-10, 40) : [MTMathListIndex level0Index:0], - point(-10, -20) : [MTMathListIndex level0Index:0], - point(0, 0) : [MTMathListIndex level0Index:0], - point(0, 8) : [MTMathListIndex level0Index:0], - point(0, 40) : [MTMathListIndex level0Index:0], - point(0, -20) : [MTMathListIndex level0Index:0], - point(9, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(9, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - // The superscript is closer than the nucleus (and the touch boundaries overlap) - point(9, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], - point(9, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(10, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - // The nucleus is closer and the touch boundaries overlap - point(10, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(10, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], - point(10, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], - point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], - point(11, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], - point(17, 0) : [MTMathListIndex level0Index:1], - point(17, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeSuperscript], - point(17, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeSuperscript], - point(17, -20) : [MTMathListIndex level0Index:1], - point(30, 0) : [MTMathListIndex level0Index:1], - point(30, 8) : [MTMathListIndex level0Index:1], - point(30, 40) : [MTMathListIndex level0Index:1], - point(30, -20) : [MTMathListIndex level0Index:1], - }; - -} - - -- (void) testClosestPointExponent -{ - [self testClosestPointForExpression:@"2^3" data:getExponentTestData()]; -} -@end +/* + + #import "MTMathListDisplay.h" + #import "MTDisplay+Editing.h" + #import "MTMathListBuilder.h" + #import "MTFontManager.h" + #import "MTTypesetter.h" + + @interface MTDisplayEditingTest : XCTestCase + + @property (nonatomic) MTFont* font; + @end + + + @implementation MTDisplayEditingTest + + - (void)setUp + { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. + CGFloat fontSize = 20; + _font = [[MTFontManager fontManager] latinModernFontWithSize:fontSize]; + } + + - (void)tearDown + { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; + } + + static NSValue* point(CGFloat x, CGFloat y) { + return [NSValue valueWithCGPoint:CGPointMake(x, y)]; + } + + - (void)testClosestPointForExpression:(NSString*) expr data:(NSDictionary*) testData + { + MTMathList* ml = [MTMathListBuilder buildFromString:expr]; + MTDisplay* displayList = [MTTypesetter createLineForMathList:ml font:_font style:kMTLineStyleDisplay]; + + for (NSValue* point in testData) { + CGPoint cgPoint = [point CGPointValue]; + MTMathListIndex* expectedIndex = testData[point]; + MTMathListIndex* index = [displayList closestIndexToPoint:cgPoint]; + XCTAssertEqualObjects(index, expectedIndex, @"Index %@ does not match %@ for point (%f, %f)", index, expectedIndex, cgPoint.x, cgPoint.y); + } + } + + static NSDictionary* getFractionTestData() { + return @{ point(-10, 8) : [MTMathListIndex level0Index:0], + point(-10, 0) : [MTMathListIndex level0Index:0], + point(-10, 40) : [MTMathListIndex level0Index:0], + point(-10, -20) : [MTMathListIndex level0Index:0], + point(-2.5, 8) : [MTMathListIndex level0Index:0], + point(-2.5, 0) : [MTMathListIndex level0Index:0], + point(-2.5, 40) : [MTMathListIndex level0Index:0], + point(-2.5, -20) : [MTMathListIndex level0Index:0], + point(-1, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(-1, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(-1, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(-1, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(3, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(3, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(3, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(3, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(7, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(7, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(7, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(7, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(11, -20) : [MTMathListIndex level0Index:1], // because it is below the height of the fraction + point(12.5, 8) : [MTMathListIndex level0Index:1], + point(12.5, 0) : [MTMathListIndex level0Index:1], + point(12.5, 40) : [MTMathListIndex level0Index:1], + point(12.5, -20) : [MTMathListIndex level0Index:1], + point(20, 8) : [MTMathListIndex level0Index:1], + point(20, 0) : [MTMathListIndex level0Index:1], + point(20, 40) : [MTMathListIndex level0Index:1], + point(20, -20) : [MTMathListIndex level0Index:1] }; + } + + - (void)testClosestPointFraction + { + [self testClosestPointForExpression:@"\\frac{3}{2}" data:getFractionTestData()]; + } + + static NSDictionary* getRegularTestData() { + return @{ point(-10, 8) : [MTMathListIndex level0Index:0], + point(-10, 0) : [MTMathListIndex level0Index:0], + point(-10, 40) : [MTMathListIndex level0Index:0], + point(-10, -20) : [MTMathListIndex level0Index:0], + point(0, 0) : [MTMathListIndex level0Index:0], + point(0, 8) : [MTMathListIndex level0Index:0], + point(0, 40) : [MTMathListIndex level0Index:0], + point(0, -20) : [MTMathListIndex level0Index:0], + point(10, 0) : [MTMathListIndex level0Index:1], + point(10, 8) : [MTMathListIndex level0Index:1], + point(10, 40) : [MTMathListIndex level0Index:1], + point(10, -20) : [MTMathListIndex level0Index:1], + point(15, 0) : [MTMathListIndex level0Index:1], + point(15, 8) : [MTMathListIndex level0Index:1], + point(15, 40) : [MTMathListIndex level0Index:1], + point(15, -20) : [MTMathListIndex level0Index:1], + point(25, 0) : [MTMathListIndex level0Index:2], + point(25, 8) : [MTMathListIndex level0Index:2], + point(25, 40) : [MTMathListIndex level0Index:2], + point(25, -20) : [MTMathListIndex level0Index:2], + point(35, 0) : [MTMathListIndex level0Index:2], + point(35, 8) : [MTMathListIndex level0Index:2], + point(35, 40) : [MTMathListIndex level0Index:2], + point(35, -20) : [MTMathListIndex level0Index:2], + point(45, 0) : [MTMathListIndex level0Index:3], + point(45, 8) : [MTMathListIndex level0Index:3], + point(45, 40) : [MTMathListIndex level0Index:3], + point(45, -20) : [MTMathListIndex level0Index:3], + point(55, 0) : [MTMathListIndex level0Index:3], + point(55, 8) : [MTMathListIndex level0Index:3], + point(55, 40) : [MTMathListIndex level0Index:3], + point(55, -20) : [MTMathListIndex level0Index:3], }; + } + + - (void) testClosestPointRegular + { + [self testClosestPointForExpression:@"4+2" data:getRegularTestData()]; + } + + static NSDictionary* getRegularPlusFractionTestData() { + return @{ point(30, 0) : [MTMathListIndex level0Index:2], + point(30, 8) : [MTMathListIndex level0Index:2], + point(30, 40) : [MTMathListIndex level0Index:2], + point(30, -20) : [MTMathListIndex level0Index:2], + point(32, 0) : [MTMathListIndex level0Index:2], + point(32, 8) : [MTMathListIndex level0Index:2], + point(32, 40) : [MTMathListIndex level0Index:2], + point(32, -20) : [MTMathListIndex level0Index:2], + point(33, 0) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(33, 8) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(33, 40) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(33, -20) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(35, 0) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator], + point(35, 8) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(35, 40) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeNumerator], + point(35, -20) : [MTMathListIndex indexAtLocation:2 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeDenominator]}; + + } + + - (void)testClosestPointRegularPlusFraction + { + [self testClosestPointForExpression:@"1+\\frac{3}{2}" data:getRegularPlusFractionTestData()]; + } + + static NSDictionary* getFractionPlusRegularTestData() { + return @{ point(15, 0) : [MTMathListIndex level0Index:1], + point(15, 8) : [MTMathListIndex level0Index:1], + point(15, 40) : [MTMathListIndex level0Index:1], + point(15, -20) : [MTMathListIndex level0Index:1], + point(13, 0) : [MTMathListIndex level0Index:1], + point(13, 8) : [MTMathListIndex level0Index:1], + point(13, 40) : [MTMathListIndex level0Index:1], + point(13, -20) : [MTMathListIndex level0Index:1], + point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(11, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(9, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator], + point(9, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(9, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNumerator], + point(9, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeDenominator]}; + + } + + - (void)testClosestPointFractionPlusRegular + { + [self testClosestPointForExpression:@"\\frac{3}{2}+1" data:getFractionPlusRegularTestData()]; + } + + static NSDictionary* getExponentTestData() { + return @{ point(-10, 8) : [MTMathListIndex level0Index:0], + point(-10, 0) : [MTMathListIndex level0Index:0], + point(-10, 40) : [MTMathListIndex level0Index:0], + point(-10, -20) : [MTMathListIndex level0Index:0], + point(0, 0) : [MTMathListIndex level0Index:0], + point(0, 8) : [MTMathListIndex level0Index:0], + point(0, 40) : [MTMathListIndex level0Index:0], + point(0, -20) : [MTMathListIndex level0Index:0], + point(9, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(9, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + // The superscript is closer than the nucleus (and the touch boundaries overlap) + point(9, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], + point(9, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(10, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + // The nucleus is closer and the touch boundaries overlap + point(10, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(10, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], + point(10, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(11, 0) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(11, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], + point(11, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:0] type:kMTSubIndexTypeSuperscript], + point(11, -20) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeNucleus], + point(17, 0) : [MTMathListIndex level0Index:1], + point(17, 8) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeSuperscript], + point(17, 40) : [MTMathListIndex indexAtLocation:0 withSubIndex:[MTMathListIndex level0Index:1] type:kMTSubIndexTypeSuperscript], + point(17, -20) : [MTMathListIndex level0Index:1], + point(30, 0) : [MTMathListIndex level0Index:1], + point(30, 8) : [MTMathListIndex level0Index:1], + point(30, 40) : [MTMathListIndex level0Index:1], + point(30, -20) : [MTMathListIndex level0Index:1], + }; + + } + + + - (void) testClosestPointExponent + { + [self testClosestPointForExpression:@"2^3" data:getExponentTestData()]; + } + @end + + */ diff --git a/mathEditor/editor/MTEditableMathLabel.m b/mathEditor/editor/MTEditableMathLabel.m index 05f528f..4c1504a 100644 --- a/mathEditor/editor/MTEditableMathLabel.m +++ b/mathEditor/editor/MTEditableMathLabel.m @@ -921,10 +921,12 @@ - (void) clearHighlights @synthesize selectedTextRange; @synthesize tokenizer; +#if !TARGET_OS_XR - (UITextWritingDirection)baseWritingDirectionForPosition:(UITextPosition *)position inDirection:(UITextStorageDirection)direction { return UITextWritingDirectionLeftToRight; } +#endif - (CGRect)caretRectForPosition:(UITextPosition *)position { @@ -1006,9 +1008,11 @@ - (NSArray *)selectionRectsForRange:(UITextRange *)range { return nil; } +#if !TARGET_OS_XR - (void)setBaseWritingDirection:(UITextWritingDirection)writingDirection forRange:(UITextRange *)range { } +#endif - (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange { } diff --git a/mathEditor/keyboard/MTKeyboard.m b/mathEditor/keyboard/MTKeyboard.m index 7a4b5fa..2a81553 100644 --- a/mathEditor/keyboard/MTKeyboard.m +++ b/mathEditor/keyboard/MTKeyboard.m @@ -110,7 +110,9 @@ - (BOOL)enableInputClicksWhenVisible - (void) playClickForCustomKeyTap { +#if !TARGET_OS_XR [[UIDevice currentDevice] playInputClick]; +#endif } - (void)fractionPressed:(id)sender