Files
Attractor/App/Script Policy UI/ScriptControllerIconView.swift
2021-10-21 15:08:04 -07:00

98 lines
3.1 KiB
Swift

//
// ScriptControllerIconView.swift
// SBrowser
//
// Created by James Magahern on 7/24/20.
//
import UIKit
class ScriptControllerIconView: ReliefButton
{
public var shieldsDown: Bool = false {
didSet { setNeedsLayout() }
}
@Invalidating(.layout)
public var currentPolicy: ScriptPolicy = ScriptPolicy(securityOrigin: "", policyType: .alpha)
private let labelView = UILabel(frame: .zero)
private let policyImageView = UIImageView(frame: .zero)
private let shieldsDownImage = UIImage(systemName: "shield.slash")
private let shieldsUpImage = UIImage(systemName: "shield")
private let shieldsPartiallyUpImage = UIImage(systemName: "shield.lefthalf.fill")
override init() {
super.init()
addSubview(labelView)
imageView?.contentMode = .scaleAspectFit
labelView.backgroundColor = .systemRed
labelView.textAlignment = .center
labelView.layer.cornerRadius = 4.0
labelView.layer.masksToBounds = true
labelView.font = .boldSystemFont(ofSize: 8)
labelView.textColor = .white
policyImageView.contentMode = .scaleAspectFit
setBlockedScriptsNumber(0)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public func setBlockedScriptsNumber(_ num: Int) {
if num > 0 {
labelView.isHidden = false
labelView.text = "\(num)"
} else {
labelView.isHidden = true
}
setNeedsLayout()
}
override func layoutSubviews() {
super.layoutSubviews()
labelView.sizeToFit()
labelView.center = CGPoint(x: bounds.center.x + 10, y: bounds.center.y + 10)
labelView.bounds = labelView.bounds.insetBy(dx: -3.0, dy: -2.0)
let policyImageWidth = round(bounds.width / 3)
let policyImageSize = CGSize(
// Make multiple of 2 to ensure proper centering
width: policyImageWidth - policyImageWidth.truncatingRemainder(dividingBy: 2),
height: policyImageWidth - policyImageWidth.truncatingRemainder(dividingBy: 2)
)
if let imageView = imageView {
imageView.addSubview(policyImageView)
policyImageView.frame = CGRect(origin: .zero, size: policyImageSize)
.centered(inRect: imageView.bounds)
.offsetBy(dx: 0.0, dy: -1.0)
}
if shieldsDown {
setImage(shieldsDownImage, for: .normal)
} else {
setImage(shieldsUpImage, for: .normal)
if isEnabled {
policyImageView.isHidden = false
policyImageView.image = ScriptPolicy.iconRepresentation(forPolicyType: currentPolicy.policyType, configuration: ScriptPolicy.IconConfiguration(
size: policyImageSize,
foregroundColor: .label,
backgroundColor: .clear
))
} else {
policyImageView.isHidden = true
}
}
}
}