From d6a8f180ef901a295f30a3802478eadbed787351 Mon Sep 17 00:00:00 2001 From: david-swift Date: Fri, 20 Sep 2024 13:27:40 +0200 Subject: [PATCH] Facilitate usage of opaque pointers --- .../User Interface/View/Pointer/Pointer.swift | 9 ++++-- .../User Interface/View/ViewStorage.swift | 28 +++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Sources/Model/User Interface/View/Pointer/Pointer.swift b/Sources/Model/User Interface/View/Pointer/Pointer.swift index 8bac184..83a317e 100644 --- a/Sources/Model/User Interface/View/Pointer/Pointer.swift +++ b/Sources/Model/User Interface/View/Pointer/Pointer.swift @@ -13,12 +13,17 @@ public struct Pointer: Sendable { /// Get the opaque pointer. public var opaquePointer: OpaquePointer? { - .init(bitPattern: bitPattern) + get { + .init(bitPattern: bitPattern) + } + set { + bitPattern = .init(bitPattern: newValue) + } } /// Initialize the pointer. /// - Parameter pointer: The opaque pointer. - public init(_ pointer: OpaquePointer) { + public init(_ pointer: OpaquePointer?) { bitPattern = .init(bitPattern: pointer) } diff --git a/Sources/Model/User Interface/View/ViewStorage.swift b/Sources/Model/User Interface/View/ViewStorage.swift index e94a012..7a56c57 100644 --- a/Sources/Model/User Interface/View/ViewStorage.swift +++ b/Sources/Model/User Interface/View/ViewStorage.swift @@ -21,8 +21,8 @@ public actor ViewStorage: Sendable { /// The previous state of the widget. public var previousState: Widget? - /// The pointer as an opaque pointer, as this is needed with backends interoperating with C or C++. - public var opaquePointer: Pointer? { + /// The pointer as an actual pointer, e.g. for interoperating with C or C++. + public var actualPointer: Pointer? { get { pointer as? Pointer } @@ -31,6 +31,16 @@ public actor ViewStorage: Sendable { } } + /// 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. @@ -45,6 +55,20 @@ public actor ViewStorage: Sendable { 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.