macbackend/Sources/Core/View/Picker.swift
david-swift b17f05a6a0
All checks were successful
Deploy Docs / publish (push) Successful in 3m39s
SwiftLint / SwiftLint (push) Successful in 5s
Add support for ForEach
2024-12-31 09:55:02 +01:00

60 lines
1.7 KiB
Swift

//
// Picker.swift
// MacBackend
//
// Created by david-swift on 08.12.2024.
//
import SwiftUI
/// A picker view.
public struct Picker<Item>: SwiftUIWidget where Item: Hashable, Item: CustomStringConvertible {
/// The selected item.
@Meta.Binding var selection: Item
/// The picker's label.
var label: String
/// The picker's items.
var items: [Item]
/// Whether to use the segmented picker stlye.
var segmented = false
/// Initialize the picker.
/// - Parameters:
/// - label: The picker's label.
/// - items: The picker's items.
/// - selection: The selected item.
public init(_ label: String, items: [Item], selection: Meta.Binding<Item>) {
self._selection = selection
self.label = label
self.items = items
}
/// Get the SwiftUI view.
/// - Parameter properties: The widget data.
/// - Returns: The SwiftUI view.
public static func view(properties: Picker<Item>) -> some SwiftUI.View {
let picker = SwiftUI.Picker(properties.label, selection: properties._selection.swiftUI) {
SwiftUI.ForEach(properties.items, id: \.hashValue) { item in
SwiftUI.Text(item.description)
.tag(item.description)
}
}
if properties.segmented {
picker
.pickerStyle(.segmented)
} else {
picker
.pickerStyle(.automatic)
}
}
/// Make the picker segmented.
/// - Parameter segmented: Whether the picker is segmented.
/// - Returns: The picker.
public func segmented(_ segmented: Bool = true) -> Self {
modify { $0.segmented = segmented }
}
}