david-swift 6b5e1c1a25 Add freeze modifier
Prevent a view from being updated
2024-02-13 15:48:24 +01:00

47 lines
1.2 KiB
Swift

//
// Freeze.swift
// Adwaita
//
// Created by david-swift on 13.02.24.
//
/// State whether to update the child views or not.
struct Freeze: Widget {
/// Whether not to update the child view.
var freeze: Bool
/// The wrapped view.
var content: View
/// Get the content's container.
/// - Parameter modifiers: Modify views before being updated.
/// - Returns: The content's container.
func container(modifiers: [(View) -> View]) -> ViewStorage {
let storage = content.storage(modifiers: [])
return storage
}
/// Update the content.
/// - Parameters:
/// - storage: The content's storage.
/// - modifiers: Modify views before being updated.
/// - updateProperties: Whether to update properties.
func update(_ storage: ViewStorage, modifiers: [(View) -> View], updateProperties: Bool) {
if !freeze {
content.updateStorage(storage, modifiers: [], updateProperties: updateProperties)
}
}
}
extension View {
/// Prevent a view from being updated.
/// - Parameter freeze: Whether to freeze the view.
/// - Returns: A view.
public func freeze(_ freeze: Bool = true) -> View {
Freeze(freeze: freeze, content: self)
}
}