forked from LoopKit/Loop
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeviceStatusHUDView.swift
More file actions
146 lines (124 loc) · 4.64 KB
/
DeviceStatusHUDView.swift
File metadata and controls
146 lines (124 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//
// DeviceStatusHUDView.swift
// LoopUI
//
// Created by Nathaniel Hamming on 2020-06-05.
// Copyright © 2020 LoopKit Authors. All rights reserved.
//
import UIKit
import HealthKit
import LoopKit
import LoopKitUI
@objc open class DeviceStatusHUDView: BaseHUDView {
var statusHighlightView: StatusHighlightHUDView! {
didSet {
statusHighlightView.isHidden = true
}
}
@IBOutlet private var statusBadgeView: StatusBadgeHUDView! {
didSet {
statusBadgeView.isHidden = true
}
}
@IBOutlet private weak var progressView: UIProgressView! {
didSet {
progressView.isHidden = true
progressView.tintColor = .systemGray
// round the edges of the progress view
progressView.layer.cornerRadius = 2
progressView.clipsToBounds = true
progressView.layer.sublayers!.last!.cornerRadius = 2
progressView.subviews.last!.clipsToBounds = true
}
}
@IBOutlet private weak var backgroundView: UIView! {
didSet {
backgroundView.backgroundColor = .systemBackground
backgroundView.layer.cornerRadius = 23
}
}
@IBOutlet weak var statusStackView: UIStackView!
public var lifecycleProgress: DeviceLifecycleProgress? {
didSet {
guard let lifecycleProgress = lifecycleProgress else {
resetProgress()
return
}
progressView.isHidden = false
progressView.progress = Float(lifecycleProgress.percentComplete.clamped(to: 0...1))
progressView.tintColor = lifecycleProgress.progressState.color
}
}
public var adjustViewsForNarrowDisplay: Bool = false {
didSet {
if adjustViewsForNarrowDisplay != oldValue {
NSLayoutConstraint.activate([
statusHighlightView.icon.widthAnchor.constraint(equalToConstant: 26),
statusHighlightView.icon.heightAnchor.constraint(equalToConstant: 26),
])
} else {
NSLayoutConstraint.activate([
statusHighlightView.icon.widthAnchor.constraint(equalToConstant: 34),
statusHighlightView.icon.heightAnchor.constraint(equalToConstant: 34),
])
}
}
}
private func resetProgress() {
progressView.isHidden = true
progressView.progress = 0
}
func setup() {
if statusHighlightView == nil {
statusHighlightView = StatusHighlightHUDView(frame: self.frame)
}
}
public func presentStatusHighlight(_ statusHighlight: DeviceStatusHighlight?) {
guard let statusHighlight = statusHighlight else {
dismissStatusHighlight()
return
}
presentStatusHighlight(withMessage: statusHighlight.localizedMessage,
image: statusHighlight.image,
color: statusHighlight.state.color)
}
private func presentStatusHighlight(withMessage message: String,
image: UIImage?,
color: UIColor)
{
statusHighlightView.messageLabel.text = message
statusHighlightView.messageLabel.tintColor = .label
statusHighlightView.icon.image = image
statusHighlightView.icon.tintColor = color
presentStatusHighlight()
}
func presentStatusHighlight() {
statusStackView?.addArrangedSubview(statusHighlightView)
statusHighlightView.isHidden = false
}
func dismissStatusHighlight() {
// need to also hide this view, since it will be added back to the stack at some point
statusHighlightView.isHidden = true
statusStackView?.removeArrangedSubview(statusHighlightView)
}
public func presentStatusBadge(_ statusBadge: DeviceStatusBadge?) {
guard let statusBadge = statusBadge else {
dismissStatusBadge()
return
}
presentStatusBadge(withIcon: statusBadge.image,
color: statusBadge.state.color)
}
private func presentStatusBadge(withIcon badgeIcon: UIImage?,
color: UIColor) {
statusBadgeView.setBadgeIcon(badgeIcon)
statusBadgeView.tintColor = color
presentStatusBadge()
}
private func presentStatusBadge() {
statusBadgeView.isHidden = false
}
private func dismissStatusBadge() {
statusBadgeView.isHidden = true
}
}