OverridePresetCollectionViewCell.swift 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. //
  2. // OverridePresetCollectionViewCell.swift
  3. // Loop
  4. //
  5. // Created by Michael Pangburn on 1/2/19.
  6. // Copyright © 2019 LoopKit Authors. All rights reserved.
  7. //
  8. import UIKit
  9. protocol OverridePresetCollectionViewCellDelegate: AnyObject {
  10. func overridePresetCollectionViewCellDidScheduleOverride(_ cell: OverridePresetCollectionViewCell)
  11. func overridePresetCollectionViewCellDidPerformFirstDeletionStep(_ cell: OverridePresetCollectionViewCell)
  12. func overridePresetCollectionViewCellDidDeletePreset(_ cell: OverridePresetCollectionViewCell)
  13. }
  14. final class OverridePresetCollectionViewCell: UICollectionViewCell, IdentifiableClass {
  15. @IBOutlet weak var symbolLabel: UILabel!
  16. @IBOutlet weak var startTimeLabel: UILabel! {
  17. didSet {
  18. startTimeLabel.text?.removeAll()
  19. }
  20. }
  21. @IBOutlet weak var nameLabel: UILabel!
  22. @IBOutlet weak var targetRangeLabel: UILabel! {
  23. didSet {
  24. targetRangeLabel.text?.removeAll()
  25. }
  26. }
  27. @IBOutlet weak var insulinNeedsBar: SegmentedGaugeBarView! {
  28. didSet {
  29. insulinNeedsBar.backgroundColor = .systemGray6
  30. insulinNeedsBar.isUserInteractionEnabled = false
  31. }
  32. }
  33. @IBOutlet private weak var durationStackView: UIStackView!
  34. @IBOutlet weak var durationLabel: UILabel!
  35. @IBOutlet weak var scheduleButton: UIButton!
  36. @IBOutlet private weak var editingIndicator: UIImageView! {
  37. didSet {
  38. editingIndicator.alpha = 0
  39. }
  40. }
  41. @IBOutlet private weak var deleteButton: UIButton! {
  42. didSet {
  43. deleteButton.layer.cornerRadius = 4
  44. }
  45. }
  46. @IBOutlet private weak var deleteButtonWidthConstraint: NSLayoutConstraint! {
  47. didSet {
  48. deleteButtonWidthConstraint.constant = 0
  49. }
  50. }
  51. weak var delegate: OverridePresetCollectionViewCellDelegate?
  52. private lazy var overlayDimmerView: UIView = {
  53. let view = UIView()
  54. view.backgroundColor = .systemBackground
  55. view.alpha = 0
  56. view.translatesAutoresizingMaskIntoConstraints = false
  57. return view
  58. }()
  59. override func awakeFromNib() {
  60. super.awakeFromNib()
  61. let selectedBackgroundView = UIView()
  62. self.selectedBackgroundView = selectedBackgroundView
  63. selectedBackgroundView.backgroundColor = .tertiarySystemFill
  64. backgroundColor = .secondarySystemGroupedBackground
  65. layer.cornerCurve = .continuous
  66. layer.cornerRadius = 16
  67. scheduleButton.addTarget(self, action: #selector(scheduleButtonTapped), for: .touchUpInside)
  68. addSubview(overlayDimmerView)
  69. NSLayoutConstraint.activate([
  70. overlayDimmerView.leadingAnchor.constraint(equalTo: leadingAnchor),
  71. overlayDimmerView.trailingAnchor.constraint(equalTo: trailingAnchor),
  72. overlayDimmerView.topAnchor.constraint(equalTo: topAnchor),
  73. overlayDimmerView.bottomAnchor.constraint(equalTo: bottomAnchor)
  74. ])
  75. }
  76. override func prepareForReuse() {
  77. startTimeLabel.text?.removeAll()
  78. targetRangeLabel.isHidden = false
  79. insulinNeedsBar.isHidden = false
  80. configureForStandard(animated: false)
  81. removeOverlay(animated: false)
  82. }
  83. func configureForEditing(animated: Bool) {
  84. func makeVisualChanges() {
  85. durationStackView.alpha = 0
  86. scheduleButton.alpha = 0
  87. editingIndicator.alpha = 1
  88. deleteButtonWidthConstraint.constant = 32
  89. deleteButton.setImage(UIImage(systemName: "xmark")!, for: .normal)
  90. deleteButton.setTitle(nil, for: .normal)
  91. }
  92. if animated {
  93. UIView.animate(withDuration: 0.3, animations: {
  94. makeVisualChanges()
  95. self.layoutIfNeeded()
  96. })
  97. } else {
  98. makeVisualChanges()
  99. }
  100. isShowingFinalDeleteConfirmation = false
  101. }
  102. func configureForStandard(animated: Bool) {
  103. func makeVisualChanges() {
  104. durationStackView.alpha = 1
  105. scheduleButton.alpha = 1
  106. editingIndicator.alpha = 0
  107. deleteButtonWidthConstraint.constant = 0
  108. deleteButton.setImage(UIImage(systemName: "xmark")!, for: .normal)
  109. deleteButton.setTitle(nil, for: .normal)
  110. }
  111. if animated {
  112. UIView.animate(withDuration: 0.3, animations: {
  113. makeVisualChanges()
  114. self.layoutIfNeeded()
  115. })
  116. } else {
  117. makeVisualChanges()
  118. }
  119. isShowingFinalDeleteConfirmation = false
  120. }
  121. func applyOverlayToFade(animated: Bool) {
  122. if animated {
  123. UIView.animate(withDuration: 0.3, animations: {
  124. self.overlayDimmerView.alpha = 0.5
  125. })
  126. } else {
  127. self.overlayDimmerView.alpha = 0.5
  128. }
  129. }
  130. func removeOverlay(animated: Bool) {
  131. if animated {
  132. UIView.animate(withDuration: 0.3, animations: {
  133. self.overlayDimmerView.alpha = 0
  134. })
  135. } else {
  136. self.overlayDimmerView.alpha = 0
  137. }
  138. }
  139. @objc private func scheduleButtonTapped() {
  140. delegate?.overridePresetCollectionViewCellDidScheduleOverride(self)
  141. }
  142. private(set) var isShowingFinalDeleteConfirmation = false
  143. @IBAction private func deleteButtonTapped(_ sender: UIButton) {
  144. if isShowingFinalDeleteConfirmation {
  145. delegate?.overridePresetCollectionViewCellDidDeletePreset(self)
  146. } else {
  147. UIView.animate(withDuration: 0.3, animations: {
  148. self.deleteButton.setImage(nil, for: .normal)
  149. self.deleteButton.setTitle("Delete", for: .normal)
  150. self.deleteButtonWidthConstraint.constant = 72
  151. self.layoutIfNeeded()
  152. })
  153. isShowingFinalDeleteConfirmation = true
  154. delegate?.overridePresetCollectionViewCellDidPerformFirstDeletionStep(self)
  155. }
  156. }
  157. }