MinimedReservoirView.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // MinimedReservoirView.swift
  3. // MinimedKitUI
  4. //
  5. // Created by Pete Schwamb on 11/30/22.
  6. // Copyright © 2022 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. struct MinimedReservoirView: View {
  10. let filledPercent: Double
  11. let fillColor: Color
  12. // mask height to reservoir height ratio
  13. let maskHeightRatio = 0.887
  14. let reservoirAspectRatio = 28.0 / 44.0
  15. func reservoirSize(in frame: CGSize) -> CGSize {
  16. let frameAspectRatio = frame.width / frame.height
  17. if frameAspectRatio > reservoirAspectRatio {
  18. return CGSize(
  19. width: frame.height * reservoirAspectRatio,
  20. height: frame.height)
  21. } else {
  22. return CGSize(
  23. width: frame.width,
  24. height: frame.width / reservoirAspectRatio)
  25. }
  26. }
  27. var body: some View {
  28. ZStack(alignment: Alignment(horizontal: .center, vertical: .center)) {
  29. GeometryReader { geometry in
  30. let reservoirSize = reservoirSize(in: geometry.size)
  31. let frameCenterX = geometry.size.width / 2
  32. let frameCenterY = geometry.size.height / 2
  33. let maskHeight = reservoirSize.height * maskHeightRatio
  34. let fillHeight = maskHeight * filledPercent
  35. let maskOffset = (reservoirSize.height - maskHeight) / 2
  36. Rectangle()
  37. .fill(fillColor)
  38. .mask(
  39. Image("reservoir_mask")
  40. .resizable()
  41. .scaledToFit()
  42. .frame(height: maskHeight)
  43. .position(x:frameCenterX, y:frameCenterY+maskOffset)
  44. )
  45. .mask(
  46. Rectangle().path(in: CGRect(x:0, y: frameCenterY+maskHeight/2 - fillHeight + maskOffset, width: geometry.size.width, height: fillHeight))
  47. )
  48. }
  49. Image("reservoir")
  50. .resizable()
  51. .scaledToFit()
  52. }
  53. }
  54. }