blob: 859658324be1442023ffda1e29b8e280ee34d2f2 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import SwiftUI
/// Represents an item in the overflow menu.
@objcMembers public class OverflowMenuItem: NSObject, ObservableObject {
public enum ImageType {
case uiImage(UIImage)
case name(String)
}
/// The user-visible name of the item.
@Published public var name: String
/// The base data used to load the image for SwiftUI, either a `UImage` or
/// a `String`.
/// Note that SwiftUI has a bug regarding `Image`s generated from `UIImage`s
/// in Dark Mode. The image color will not adjust.
@Published public var storedImage: ImageType
/// The SwiftUI `Image` for the action icon.
public var image: Image {
switch storedImage {
case .uiImage(let uiImage):
return Image(uiImage: uiImage)
case .name(let name):
return Image(name)
}
}
/// The accessibility identifier for this item.
@Published public var accessibilityIdentifier: String
/// Whether the action is disabled by enterprise policy.
@Published public var enterpriseDisabled: Bool
/// Closure to execute when item is selected.
@Published public var handler: () -> Void
public init(
name: String, image: ImageType, accessibilityIdentifier: String, enterpriseDisabled: Bool,
handler: @escaping () -> Void
) {
self.name = name
storedImage = image
self.accessibilityIdentifier = accessibilityIdentifier
self.enterpriseDisabled = enterpriseDisabled
self.handler = handler
}
public convenience init(
name: String, uiImage: UIImage, accessibilityIdentifier: String, enterpriseDisabled: Bool,
handler: @escaping () -> Void
) {
self.init(
name: name, image: .uiImage(uiImage), accessibilityIdentifier: accessibilityIdentifier,
enterpriseDisabled: enterpriseDisabled, handler: handler)
}
public convenience init(
name: String, imageName: String, accessibilityIdentifier: String, enterpriseDisabled: Bool,
handler: @escaping () -> Void
) {
self.init(
name: name, image: .name(imageName), accessibilityIdentifier: accessibilityIdentifier,
enterpriseDisabled: enterpriseDisabled, handler: handler)
}
/// Objective-C-exposed method to change `storedImage`, as Objective-C cannot
/// view enums with stored values.
@objc(setStordUIImage:) public func setStoredImage(uiImage: UIImage) {
storedImage = .uiImage(uiImage)
}
/// Objective-C-exposed method to change `storedImage`, as Objective-C cannot
/// view enums with stored values.
@objc(setStoredImageName:) public func setStoredImage(name: String) {
storedImage = .name(name)
}
}
// MARK: - Identifiable
extension OverflowMenuItem: Identifiable {
public var id: String {
return name
}
}