diff --git a/Sources/GameWidget/Commons/Entity.swift b/Sources/GameWidget/Commons/Entity.swift deleted file mode 100644 index f0ca3c9..0000000 --- a/Sources/GameWidget/Commons/Entity.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// Entity.swift -// -// -// Created by rrbox on 2022/06/18. -// - -import GameplayKit - -final private class UserInterfaceBaseNode: GKSKNodeComponent {} - -final public class UserInterfaceDisplay: GKSKNodeComponent { - - public let nofiticationSystem: WidgetNotificationSystem - - init(_ display: T) { - let (node, sys) = display.createModels() - self.nofiticationSystem = sys - super.init(node: node) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - public override func didAddToEntity() { - self.entity?.component(ofType: UserInterfaceBaseNode.self)?.node.addChild(self.node) - } - - deinit { - self.node.removeFromParent() - } - -} - -public func makeUserInterfaceEntity(camera: SKNode, display: T) -> GKEntity { - let result = GKEntity() - result.addComponent(UserInterfaceBaseNode(node: camera)) - result.addComponent(UserInterfaceDisplay(display)) - return result -} diff --git a/Sources/GameWidget/Commons/ModifierSystem/Context/FrameContext.swift b/Sources/GameWidget/Commons/ModifierSystem/Context/FrameContext.swift new file mode 100644 index 0000000..24b9823 --- /dev/null +++ b/Sources/GameWidget/Commons/ModifierSystem/Context/FrameContext.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by rrbox on 2023/04/22. +// + +import Foundation diff --git a/Sources/GameWidget/Commons/Spacer.swift b/Sources/GameWidget/Commons/Spacer.swift new file mode 100644 index 0000000..7527810 --- /dev/null +++ b/Sources/GameWidget/Commons/Spacer.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by rrbox on 2023/04/23. +// + +import Foundation diff --git a/Sources/GameWidget/Commons/StructuringTools/Stack/Constraint.swift b/Sources/GameWidget/Commons/StructuringTools/Stack/Constraint.swift new file mode 100644 index 0000000..24b9823 --- /dev/null +++ b/Sources/GameWidget/Commons/StructuringTools/Stack/Constraint.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by rrbox on 2023/04/22. +// + +import Foundation diff --git a/Sources/GameWidget/Commons/StructuringTools/Stack/HStack.swift b/Sources/GameWidget/Commons/StructuringTools/Stack/HStack.swift new file mode 100644 index 0000000..4405e6b --- /dev/null +++ b/Sources/GameWidget/Commons/StructuringTools/Stack/HStack.swift @@ -0,0 +1,29 @@ +// +// HStack.swift +// +// +// Created by rrbox on 2023/04/21. +// + +import SpriteKit + +public struct HStack: WidgetListElementType, SplittingFrameElementType { + let widgetTuple: T + + public init(@WidgetTupleBuilder _ builder: () -> T) { + self.widgetTuple = builder() + } + + public func addTo(buffer: inout [SKNode], frame: WidgetFrame, center: WidgetNotificationSystem) { + let size = CGSize(width: frame.size.width/CGFloat(self.widgetTuple.countOfNodes), height: frame.size.height) + var position = CGPoint(x: frame.position.x + (-frame.size.width/2) + (size.width/2), y: frame.position.y)// 左端四角形の中心の座標 + + let frames = (0...self.widgetTuple.countOfNodes-1).reduce(into: [WidgetFrame]()) { partialResult, i in + partialResult.append(WidgetFrame(position: position, padding: frame.padding, size: size)) + position.x += size.width + } + + self.widgetTuple.addTo(buffer: &buffer, frames: frames, center: center) + } + +} diff --git a/Sources/GameWidget/Commons/StructuringTools/Stack/VStack.swift b/Sources/GameWidget/Commons/StructuringTools/Stack/VStack.swift new file mode 100644 index 0000000..8062d24 --- /dev/null +++ b/Sources/GameWidget/Commons/StructuringTools/Stack/VStack.swift @@ -0,0 +1,32 @@ +// +// VStack.swift +// +// +// Created by rrbox on 2023/04/21. +// + +import SpriteKit + +public struct VStack: WidgetListElementType, SplittingFrameElementType { + let widgetTuple: T + + public init(@WidgetTupleBuilder _ builder: () -> T) { + self.widgetTuple = builder() + } + + public func addTo(buffer: inout [SKNode], frame: WidgetFrame, center: WidgetNotificationSystem) { + // 等分されたサイズ + let size = CGSize(width: frame.size.width, height: frame.size.height/CGFloat(self.widgetTuple.countOfNodes)) + + // 四角形の左端頂点の座標 + var position = CGPoint(x: frame.position.x, y: frame.position.y + (frame.size.height/2) - (size.height/2)) + + let frames = (0...self.widgetTuple.countOfNodes-1).reduce(into: [WidgetFrame]()) { partialResult, i in + partialResult.append(WidgetFrame(position: position, padding: frame.padding, size: size)) + position.y -= size.height + } + + self.widgetTuple.addTo(buffer: &buffer, frames: frames, center: center) + } + +} diff --git a/Sources/GameWidget/Commons/WidgetList.swift b/Sources/GameWidget/Commons/WidgetList.swift deleted file mode 100644 index 7f2dc6f..0000000 --- a/Sources/GameWidget/Commons/WidgetList.swift +++ /dev/null @@ -1,182 +0,0 @@ -// -// Group.swift -// -// -// Created by rrbox on 2022/07/24. -// - -import CoreGraphics -import SpriteKit - -@resultBuilder public struct GroupBuilder { - - public static func buildBlock(_ c0: C0) -> some WidgetList { - Single(widget: c0) - } - - public static func buildBlock(_ c0: C0, _ c1: C1) -> some WidgetList { - Single(widget: c0) - .append(c1) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - .append(c5) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - .append(c5) - .append(c6) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - .append(c5) - .append(c6) - .append(c7) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - .append(c5) - .append(c6) - .append(c7) - .append(c8) - } - - public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> some WidgetList { - Single(widget: c0) - .append(c1) - .append(c2) - .append(c3) - .append(c4) - .append(c5) - .append(c6) - .append(c7) - .append(c8) - .append(c9) - } - -} - -public protocol WidgetList { - func widgetNodes(center: WidgetNotificationSystem) -> [SKNode] -} - -/// 再帰可能. widget のペアです. オーバーヘッドはありません. -public struct RecursiveGroup: WidgetList { - - var first: T - var second: U - - func append(_ newWidget: V) -> RecursiveGroup { - .init(first: self, second: newWidget) - } - - public func widgetNodes(center: WidgetNotificationSystem) -> [SKNode] { - var result = self.first.widgetNodes(center: center) - self.second.addTo(buffer: &result, center: center) - return result - } - -} - -// 一つの widget から RecursiveGroup を生成するためのラッパー. -struct Single: WidgetList { - - var widget: T - - func append(_ newWidget: U) -> RecursiveGroup { - .init(first: self, second: newWidget) - } - - func widgetNodes(center: WidgetNotificationSystem) -> [SKNode] { - var result = [SKNode]() - self.widget.addTo(buffer: &result, center: center) - return result - } - -} diff --git a/Sources/GameWidget/Commons/WidgetTuple.swift b/Sources/GameWidget/Commons/WidgetTuple.swift new file mode 100644 index 0000000..7090711 --- /dev/null +++ b/Sources/GameWidget/Commons/WidgetTuple.swift @@ -0,0 +1,383 @@ +// +// WidgetTuple.swift +// +// +// Created by rrbox on 2023/04/18. +// + +import SpriteKit + +public protocol WidgetTupleProtocol: SplittingFrameElementType { + func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) +} + +public struct Single: WidgetTupleProtocol { + let widget: Content + init(widget: Content) { + self.widget = widget + } + + public var countOfNodes: Int { + self.widget.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widget.addTo(buffer: &buffer, frame: frames[0], center: center) + } +} + +public struct WidgetTuple2: WidgetTupleProtocol { + let widgets: (C0, C1) + init(widgets: (C0, C1)) { + self.widgets = widgets + } + public var countOfNodes: Int { + self.widgets.0.countOfNodes + self.widgets.1.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + } +} + +public struct WidgetTuple3: WidgetTupleProtocol { + let widgets: (C0, C1, C2) + init(widgets: (C0, C1, C2)) { + self.widgets = widgets + } + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + } +} + +public struct WidgetTuple4: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3) + + init(widgets: (C0, C1, C2, C3)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + } +} + +public struct WidgetTuple5: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4) + + init(widgets: (C0, C1, C2, C3, C4)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + + self.widgets.4.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + } + +} + +public struct WidgetTuple6: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4, C5) + + init(widgets: (C0, C1, C2, C3, C4, C5)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + + self.widgets.4.countOfNodes + + self.widgets.5.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + self.widgets.5.addTo(buffer: &buffer, frame: frames[5], center: center) + } +} + +public struct WidgetTuple7: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4, C5, C6) + + init(widgets: (C0, C1, C2, C3, C4, C5, C6)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + self.widgets.1.countOfNodes + self.widgets.2.countOfNodes + self.widgets.3.countOfNodes + self.widgets.4.countOfNodes + self.widgets.5.countOfNodes + self.widgets.6.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + self.widgets.5.addTo(buffer: &buffer, frame: frames[5], center: center) + self.widgets.6.addTo(buffer: &buffer, frame: frames[6], center: center) + } +} + +public struct WidgetTuple8: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4, C5, C6, C7) + + init(widgets: (C0, C1, C2, C3, C4, C5, C6, C7)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + + self.widgets.4.countOfNodes + + self.widgets.5.countOfNodes + + self.widgets.6.countOfNodes + + self.widgets.7.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + self.widgets.5.addTo(buffer: &buffer, frame: frames[5], center: center) + self.widgets.6.addTo(buffer: &buffer, frame: frames[6], center: center) + self.widgets.7.addTo(buffer: &buffer, frame: frames[7], center: center) + } + +} + +public struct WidgetTuple9: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4, C5, C6, C7, C8) + + init(widgets: (C0, C1, C2, C3, C4, C5, C6, C7, C8)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + + self.widgets.4.countOfNodes + + self.widgets.5.countOfNodes + + self.widgets.6.countOfNodes + + self.widgets.7.countOfNodes + + self.widgets.8.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + self.widgets.5.addTo(buffer: &buffer, frame: frames[5], center: center) + self.widgets.6.addTo(buffer: &buffer, frame: frames[6], center: center) + self.widgets.7.addTo(buffer: &buffer, frame: frames[7], center: center) + self.widgets.8.addTo(buffer: &buffer, frame: frames[8], center: center) + } +} + +public struct WidgetTuple10: WidgetTupleProtocol { + let widgets: (C0, C1, C2, C3, C4, C5, C6, C7, C8, C9) + + init(widgets: (C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)) { + self.widgets = widgets + } + + public var countOfNodes: Int { + self.widgets.0.countOfNodes + + self.widgets.1.countOfNodes + + self.widgets.2.countOfNodes + + self.widgets.3.countOfNodes + + self.widgets.4.countOfNodes + + self.widgets.5.countOfNodes + + self.widgets.6.countOfNodes + + self.widgets.7.countOfNodes + + self.widgets.8.countOfNodes + + self.widgets.9.countOfNodes + } + + public func addTo(buffer: inout [SKNode], frames: [WidgetFrame], center: WidgetNotificationSystem) { + self.widgets.0.addTo(buffer: &buffer, frame: frames[0], center: center) + self.widgets.1.addTo(buffer: &buffer, frame: frames[1], center: center) + self.widgets.2.addTo(buffer: &buffer, frame: frames[2], center: center) + self.widgets.3.addTo(buffer: &buffer, frame: frames[3], center: center) + self.widgets.4.addTo(buffer: &buffer, frame: frames[4], center: center) + self.widgets.5.addTo(buffer: &buffer, frame: frames[5], center: center) + self.widgets.6.addTo(buffer: &buffer, frame: frames[6], center: center) + self.widgets.7.addTo(buffer: &buffer, frame: frames[7], center: center) + self.widgets.8.addTo(buffer: &buffer, frame: frames[8], center: center) + self.widgets.9.addTo(buffer: &buffer, frame: frames[9], center: center) + } +} + +@resultBuilder public struct WidgetTupleBuilder { + public static func buildBlock(_ content: Content) -> some WidgetTupleProtocol { + Single(widget: content) + } + + public static func buildBlock(_ c0: C0, _ c1: C1) -> some WidgetTupleProtocol { + WidgetTuple2(widgets: (c0, c1)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2) -> some WidgetTupleProtocol { + WidgetTuple3(widgets: (c0, c1, c2)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> some WidgetTupleProtocol { + WidgetTuple4(widgets: (c0, c1, c2, c3)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4) -> some WidgetTupleProtocol { + WidgetTuple5(widgets: (c0, c1, c2, c3, c4)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5) -> some WidgetTupleProtocol { + WidgetTuple6(widgets: (c0, c1, c2, c3, c4, c5)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6) -> some WidgetTupleProtocol { + WidgetTuple7(widgets: (c0, c1, c2, c3, c4, c5, c6)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7) -> some WidgetTupleProtocol { + WidgetTuple8(widgets: (c0, c1, c2, c3, c4, c5, c6, c7)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8) -> some WidgetTupleProtocol { + WidgetTuple9(widgets: (c0, c1, c2, c3, c4, c5, c6, c7, c8)) + } + + public static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> some WidgetTupleProtocol { + WidgetTuple10(widgets: (c0, c1, c2, c3, c4, c5, c6, c7, c8, c9)) + } +} diff --git a/Sources/GameWidget/Controller/ControllerModifiers.swift b/Sources/GameWidget/Controller/ControllerModifiers.swift deleted file mode 100644 index 93729e9..0000000 --- a/Sources/GameWidget/Controller/ControllerModifiers.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// ControllerModifiers.swift -// -// -// Created by rrbox on 2022/11/28. -// - -import CoreGraphics - -public struct ControllerContext: PositionContextProtocol, - ResizeableContextProtocol { - public var position: CGPoint = .zero - public var size: CGSize = CGSize(width: 100, height: 100) - - public init() {} -} diff --git a/Sources/GameWidget/Modifiers/FrameModifier.swift b/Sources/GameWidget/Modifiers/FrameModifier.swift new file mode 100644 index 0000000..debea6e --- /dev/null +++ b/Sources/GameWidget/Modifiers/FrameModifier.swift @@ -0,0 +1,41 @@ +// +// Frame.swift +// +// +// Created by rrbox on 2022/11/28. +// + +import CoreGraphics + +public struct Position: Modifier { + var value: CGPoint + + public init(value: CGPoint) { + self.value = value + } + + public func mod(context: inout Context) { + context.position = self.value + } + +} + +public struct Size: Modifier { + var value: CGSize + public func mod(context: inout Context) { + context.size = self.value + } +} + +public extension ModifiableWidget where Context: ContextProtocol { + func size(_ value: CGSize) -> Next> { + self.modifier(mod: Size(value: value)) + } +} + +public struct Padding: Modifier { + var value: CGSize + public func mod(context: inout Context) { + context.size + } +} diff --git a/Sources/GameWidget/Modifiers/Resizeable.swift b/Sources/GameWidget/Modifiers/Resizeable.swift deleted file mode 100644 index 01b8534..0000000 --- a/Sources/GameWidget/Modifiers/Resizeable.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// Resieable.swift -// -// -// Created by rrbox on 2022/11/28. -// - -import CoreGraphics - -public protocol ResizeableContextProtocol: ContextProtocol { - var size: CGSize { get set } -} - -public struct Size: Modifier { - var value: CGSize - public func mod(context: inout Context) { - context.size = self.value - } -} - -public extension ModifiableWidget where Context: ResizeableContextProtocol { - func size(_ value: CGSize) -> Next> { - self.modifier(mod: Size(value: value)) - } -}