You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.2 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. //
  2. // NodeProperty.swift
  3. // lottie-swift
  4. //
  5. // Created by Brandon Withrow on 1/30/19.
  6. //
  7. import CoreGraphics
  8. import Foundation
  9. /// A node property that holds a reference to a T ValueProvider and a T ValueContainer.
  10. class NodeProperty<T>: AnyNodeProperty {
  11. // MARK: Lifecycle
  12. init(provider: AnyValueProvider) {
  13. valueProvider = provider
  14. originalValueProvider = valueProvider
  15. typedContainer = ValueContainer<T>(provider.value(frame: 0) as! T)
  16. typedContainer.setNeedsUpdate()
  17. }
  18. // MARK: Internal
  19. var valueProvider: AnyValueProvider
  20. var originalValueProvider: AnyValueProvider
  21. var valueType: Any.Type { T.self }
  22. var value: T {
  23. typedContainer.outputValue
  24. }
  25. var valueContainer: AnyValueContainer {
  26. typedContainer
  27. }
  28. func needsUpdate(frame: CGFloat) -> Bool {
  29. valueContainer.needsUpdate || valueProvider.hasUpdate(frame: frame)
  30. }
  31. func setProvider(provider: AnyValueProvider) {
  32. guard provider.valueType == valueType else { return }
  33. valueProvider = provider
  34. valueContainer.setNeedsUpdate()
  35. }
  36. func update(frame: CGFloat) {
  37. typedContainer.setValue(valueProvider.value(frame: frame), forFrame: frame)
  38. }
  39. // MARK: Fileprivate
  40. fileprivate var typedContainer: ValueContainer<T>
  41. }