Add display model
This commit is contained in:
60
Sources/SwiftUIMath/Internal/Display/DisplayFraction.swift
Normal file
60
Sources/SwiftUIMath/Internal/Display/DisplayFraction.swift
Normal file
@@ -0,0 +1,60 @@
|
||||
import CoreGraphics
|
||||
import Foundation
|
||||
|
||||
extension Math {
|
||||
final class DisplayFraction: DisplayNode {
|
||||
var numerator: DisplayList?
|
||||
var denominator: DisplayList?
|
||||
|
||||
var numeratorUp: CGFloat = 0 { didSet { updateNumeratorPosition() } }
|
||||
var denominatorDown: CGFloat = 0 { didSet { updateDenominatorPosition() } }
|
||||
var linePosition: CGFloat = 0
|
||||
var lineThickness: CGFloat = 0
|
||||
|
||||
init(numerator: DisplayList?, denominator: DisplayList?, position: CGPoint, range: NSRange) {
|
||||
self.numerator = numerator
|
||||
self.denominator = denominator
|
||||
super.init()
|
||||
self.position = position
|
||||
self.range = range
|
||||
}
|
||||
|
||||
override var ascent: CGFloat {
|
||||
get { (numerator?.ascent ?? 0) + numeratorUp }
|
||||
set { super.ascent = newValue }
|
||||
}
|
||||
|
||||
override var descent: CGFloat {
|
||||
get { (denominator?.descent ?? 0) + denominatorDown }
|
||||
set { super.descent = newValue }
|
||||
}
|
||||
|
||||
override var width: CGFloat {
|
||||
get { max(numerator?.width ?? 0, denominator?.width ?? 0) }
|
||||
set { super.width = newValue }
|
||||
}
|
||||
|
||||
override var position: CGPoint {
|
||||
didSet {
|
||||
updateDenominatorPosition()
|
||||
updateNumeratorPosition()
|
||||
}
|
||||
}
|
||||
|
||||
private func updateDenominatorPosition() {
|
||||
guard let denominator else { return }
|
||||
denominator.position = CGPoint(
|
||||
x: position.x + (width - denominator.width) / 2,
|
||||
y: position.y - denominatorDown
|
||||
)
|
||||
}
|
||||
|
||||
private func updateNumeratorPosition() {
|
||||
guard let numerator else { return }
|
||||
numerator.position = CGPoint(
|
||||
x: position.x + (width - numerator.width) / 2,
|
||||
y: position.y + numeratorUp
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user