76 lines
2.1 KiB
Swift
76 lines
2.1 KiB
Swift
//
|
|
// Toggle.swift
|
|
// Adwaita
|
|
//
|
|
// Created by david-swift on 19.12.23.
|
|
//
|
|
|
|
import Libadwaita
|
|
|
|
/// A toggle button widget.
|
|
public struct Toggle: Widget {
|
|
|
|
/// The button's label.
|
|
var label: String?
|
|
/// The button's icon.
|
|
var icon: Icon?
|
|
/// Whether the toggle is on.
|
|
@Binding var isOn: Bool
|
|
|
|
// swiftlint:disable function_default_parameter_at_end
|
|
/// Initialize a toggle button.
|
|
/// - Parameters:
|
|
/// - label: The button's label.
|
|
/// - icon: The button's icon.
|
|
/// - isOn: Whether the toggle is on.
|
|
public init(_ label: String? = nil, icon: Icon, isOn: Binding<Bool>) {
|
|
self.label = label
|
|
self.icon = icon
|
|
self._isOn = isOn
|
|
}
|
|
// swiftlint:enable function_default_parameter_at_end
|
|
|
|
/// Initialize a toggle button.
|
|
/// - Parameters:
|
|
/// - label: The buttons label.
|
|
/// - isOn: Whether the toggle is on.
|
|
public init(_ label: String, isOn: Binding<Bool>) {
|
|
self.label = label
|
|
self._isOn = isOn
|
|
}
|
|
|
|
/// Update a toggle button's view storage.
|
|
/// - Parameters:
|
|
/// - storage: The view storage.
|
|
/// - modifiers: Modify views before being updated.
|
|
public func update(_ storage: ViewStorage, modifiers: [(View) -> View]) {
|
|
if let toggle = storage.view as? Libadwaita.ToggleButton {
|
|
updateState(toggle: toggle)
|
|
}
|
|
}
|
|
|
|
/// Get a button's view storage.
|
|
/// - Parameter modifiers: Modify views before being updated.
|
|
/// - Returns: The button's view storage.
|
|
public func container(modifiers: [(View) -> View]) -> ViewStorage {
|
|
let toggle: Libadwaita.ToggleButton = .init(label ?? "")
|
|
updateState(toggle: toggle)
|
|
toggle.handler {
|
|
self.isOn.toggle()
|
|
}
|
|
return .init(toggle)
|
|
}
|
|
|
|
/// Update the toggle's state.
|
|
/// - Parameter toggle: The toggle.
|
|
func updateState(toggle: Libadwaita.ToggleButton) {
|
|
if let icon {
|
|
toggle.setLabel(icon: icon, label: label)
|
|
} else if let label {
|
|
toggle.setLabel(label)
|
|
}
|
|
toggle.setActive(isOn)
|
|
}
|
|
|
|
}
|