136 lines
3.7 KiB
Swift
136 lines
3.7 KiB
Swift
//
|
|
// ViewStorage.swift
|
|
// Meta
|
|
//
|
|
// Created by david-swift on 26.05.24.
|
|
//
|
|
|
|
/// Store a reference to a rendered view in a view storage.
|
|
public actor ViewStorage: Sendable {
|
|
|
|
/// The pointer.
|
|
///
|
|
/// It can be a C pointer, a Swift class, or other information depending on the backend.
|
|
public var pointer: Sendable?
|
|
/// The view's content for container widgets.
|
|
var content: [String: [ViewStorage]]
|
|
/// The view's state (used in `StateWrapper`).
|
|
var state: [String: StateProtocol] = [:]
|
|
/// Various properties of a widget.
|
|
var fields: [String: Sendable] = [:]
|
|
/// The previous state of the widget.
|
|
public var previousState: Widget?
|
|
|
|
/// The pointer as an actual pointer, e.g. for interoperating with C or C++.
|
|
public var actualPointer: Pointer? {
|
|
get {
|
|
pointer as? Pointer
|
|
}
|
|
set {
|
|
pointer = newValue
|
|
}
|
|
}
|
|
|
|
/// The pointer as an opaque pointer, as this is needed with backends interoperating with C or C++.
|
|
public var opaquePointer: OpaquePointer? {
|
|
get {
|
|
actualPointer?.opaquePointer
|
|
}
|
|
set {
|
|
actualPointer?.opaquePointer = newValue
|
|
}
|
|
}
|
|
|
|
/// Initialize a view storage.
|
|
/// - Parameters:
|
|
/// - pointer: The pointer to the widget, its type depends on the backend.
|
|
/// - content: The view's content for container widgets.
|
|
public init(
|
|
_ pointer: Sendable?,
|
|
content: [String: [ViewStorage]] = [:],
|
|
state: Widget? = nil
|
|
) {
|
|
self.pointer = pointer
|
|
self.content = content
|
|
self.previousState = state
|
|
}
|
|
|
|
/// Initialize a view storage.
|
|
/// - Parameters:
|
|
/// - pointer: The opaque pointer.
|
|
/// - content: The view's content for container widgets.
|
|
public init(
|
|
_ pointer: OpaquePointer?,
|
|
content: [String: [ViewStorage]] = [:],
|
|
state: Widget? = nil
|
|
) {
|
|
self.pointer = Pointer(pointer)
|
|
self.content = content
|
|
self.previousState = state
|
|
}
|
|
|
|
/// Set the state under a certain key.
|
|
/// - Parameters:
|
|
/// - key: The key.
|
|
/// - value: The state.
|
|
func setState(key: String, value: StateProtocol) {
|
|
state[key] = value
|
|
}
|
|
|
|
/// Set the state.
|
|
/// - Parameter state: The state.
|
|
func setState(_ state: [String: StateProtocol]) {
|
|
self.state = state
|
|
}
|
|
|
|
/// Get the state under a certain key.
|
|
/// - Parameter key: The key.
|
|
/// - Returns: The state.
|
|
func getState(key: String) -> StateProtocol? {
|
|
state[key]
|
|
}
|
|
|
|
/// Set the pointer.
|
|
/// - Parameter value: The new pointer.
|
|
public func setPointer(_ value: Sendable?) {
|
|
pointer = value
|
|
}
|
|
|
|
/// Set the element of a certain field.
|
|
/// - Parameters:
|
|
/// - key: The key.
|
|
/// - value: The field.
|
|
public func setField(key: String, value: Sendable) {
|
|
fields[key] = value
|
|
}
|
|
|
|
/// Get the element of a certain field.
|
|
/// - Parameter key: The key.
|
|
/// - Returns: The field.
|
|
public func getField(key: String) -> Sendable? {
|
|
fields[key]
|
|
}
|
|
|
|
/// Set the content elements under a certain key.
|
|
/// - Parameters:
|
|
/// - key: The key.
|
|
/// - value: The content elements.
|
|
public func setContent(key: String, value: [ViewStorage]) {
|
|
content[key] = value
|
|
}
|
|
|
|
/// Get the content elements under a certain key.
|
|
/// - Parameter key: The key.
|
|
/// - Returns: The content elements.
|
|
public func getContent(key: String) -> [ViewStorage] {
|
|
content[key] ?? []
|
|
}
|
|
|
|
/// Set the previous state.
|
|
/// - Parameter state: The state.
|
|
public func setPreviousState(_ state: Widget?) {
|
|
previousState = state
|
|
}
|
|
|
|
}
|