TM-SGNL-iOS/SignalUI/Appearance/ColorOrGradient+SignalUI.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

108 lines
3.2 KiB
Swift

//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public import SignalServiceKit
import UIKit
// MARK: -
/// ColorOrGradientSetting is used for persistence and comparison.
/// ColorOrGradientValue is used for rendering.
public enum ColorOrGradientValue: CustomStringConvertible {
case transparent
case solidColor(color: UIColor)
/// If angleRadians = 0, gradientColor1 is N.
/// If angleRadians = PI / 2, gradientColor1 is E.
/// etc.
case gradient(
gradientColor1: UIColor,
gradientColor2: UIColor,
angleRadians: CGFloat
)
public var description: String {
switch self {
case .transparent:
return "[transparent]"
case .solidColor(let color):
return "[solidColor: \(color.asOWSColor)]"
case .gradient(let gradientColor1, let gradientColor2, let angleRadians):
return "[gradient gradientColor1: \(gradientColor1.asOWSColor), gradientColor2: \(gradientColor2.asOWSColor), angleRadians: \(angleRadians)]"
}
}
}
// MARK: -
public enum ColorOrGradientThemeMode: Int {
case auto
case alwaysLight
case alwaysDark
}
// MARK: -
public extension ColorOrGradientSetting {
var asValue: ColorOrGradientValue {
asValue(themeMode: .auto)
}
func asValue(themeMode: ColorOrGradientThemeMode) -> ColorOrGradientValue {
let shouldUseDarkColors: Bool = {
switch themeMode {
case .auto:
return Theme.isDarkThemeEnabled
case .alwaysDark:
return true
case .alwaysLight:
return false
}
}()
switch self {
case .solidColor(let solidColor):
return .solidColor(color: solidColor.asUIColor)
case .themedColor(let lightThemeColor, let darkThemeColor):
let color = shouldUseDarkColors ? darkThemeColor : lightThemeColor
return .solidColor(color: color.asUIColor)
case .gradient(let gradientColor1, let gradientColor2, let angleRadians):
return .gradient(
gradientColor1: gradientColor1.asUIColor,
gradientColor2: gradientColor2.asUIColor,
angleRadians: angleRadians
)
case .themedGradient(
let lightGradientColor1,
let lightGradientColor2,
let darkGradientColor1,
let darkGradientColor2,
let angleRadians
):
let gradientColor1 = shouldUseDarkColors ? darkGradientColor1 : lightGradientColor1
let gradientColor2 = shouldUseDarkColors ? darkGradientColor2 : lightGradientColor2
return .gradient(
gradientColor1: gradientColor1.asUIColor,
gradientColor2: gradientColor2.asUIColor,
angleRadians: angleRadians
)
}
}
}
// MARK: -
public extension UIColor {
var asOWSColor: OWSColor {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
return OWSColor(red: red.clamp01(), green: green.clamp01(), blue: blue.clamp01())
}
}