60 lines
1.7 KiB
Swift
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) {
|
|
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 }
|
|
}
|
|
|
|
}
|