Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/views/SelectionButton.swift
1 views
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalUI
import UIKit

/// A checkmark in a circle to indicate an item (typically in a table view or collection view) is
/// selected.
class SelectionButton: UIView {
    private let outlineBadgeView: UIView = {
        let imageView = UIImageView(image: UIImage(imageLiteralResourceName: "circle"))
        imageView.contentMode = .center
        imageView.tintColor = .white
        imageView.isHidden = true
        return imageView
    }()

    private let selectedBadgeView: UIView = {
        let imageView = UIImageView(image: UIImage(imageLiteralResourceName: "check-circle-fill"))
        imageView.contentMode = .center
        imageView.tintColor = .ows_accentBlue

        // This will give checkmark it's color.
        let backgroundView = CircleView(diameter: 18)
        backgroundView.backgroundColor = .white

        let containerView = UIView(frame: imageView.bounds)
        containerView.isHidden = true

        containerView.addSubview(backgroundView)
        backgroundView.autoCenterInSuperview()

        containerView.addSubview(imageView)
        imageView.autoPinEdgesToSuperviewEdges()

        return containerView
    }()

    var isSelected: Bool = false {
        didSet {
            updateAppearance()
        }
    }

    var allowsMultipleSelection: Bool = false {
        didSet {
            updateAppearance()
        }
    }

    var outlineColor: UIColor = .white {
        didSet {
            outlineBadgeView.tintColor = outlineColor
        }
    }

    var hidesOutlineWhenSelected: Bool = false {
        didSet {
            updateAppearance()
        }
    }

    init() {
        super.init(frame: .zero)

        addSubview(selectedBadgeView)
        selectedBadgeView.autoCenterInSuperview()

        addSubview(outlineBadgeView)
        outlineBadgeView.autoCenterInSuperview()

        autoSetDimensions(to: .square(24))
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func updateAppearance() {
        if isSelected {
            outlineBadgeView.isHidden = hidesOutlineWhenSelected
            selectedBadgeView.isHidden = false
        } else if allowsMultipleSelection {
            outlineBadgeView.isHidden = false
            selectedBadgeView.isHidden = true
        } else {
            outlineBadgeView.isHidden = true
            selectedBadgeView.isHidden = true
        }
    }

    func reset() {
        selectedBadgeView.isHidden = true
        outlineBadgeView.isHidden = true
    }
}