diff --git a/Sources/OpenSwiftUICore/View/Input/ViewInputPredicate.swift b/Sources/OpenSwiftUICore/View/Input/ViewInputPredicate.swift index f7c9083a5..ffeea2d4e 100644 --- a/Sources/OpenSwiftUICore/View/Input/ViewInputPredicate.swift +++ b/Sources/OpenSwiftUICore/View/Input/ViewInputPredicate.swift @@ -9,6 +9,18 @@ package protocol ViewInputPredicate { static func evaluate(inputs: _GraphInputs) -> Bool + + static func evaluate(listInputs: _ViewListInputs) -> Bool +} + +extension ViewInputPredicate { + package static func evaluate(inputs: _ViewInputs) -> Bool { + evaluate(inputs: inputs.base) + } + + package static func evaluate(listInputs: _ViewListInputs) -> Bool { + evaluate(inputs: listInputs.base) + } } // MARK: - ViewInputFlag diff --git a/Sources/OpenSwiftUICore/View/Style/DefaultStyle.swift b/Sources/OpenSwiftUICore/View/Style/DefaultStyle.swift new file mode 100644 index 000000000..46fb4cbb2 --- /dev/null +++ b/Sources/OpenSwiftUICore/View/Style/DefaultStyle.swift @@ -0,0 +1,64 @@ +// +// DefaultStyle.swift +// OpenSwiftUICore +// +// Audited for 6.5.4 +// Status: Complete + +// MARK: - AnyDefaultStyle + +package protocol AnyDefaultStyle { + init() +} + +// MARK: - DefaultStyleModifier + +package protocol DefaultStyleModifier: StyleModifier where Style: AnyDefaultStyle {} + +// MARK: - StyleOverrideModifier + +package protocol StyleOverrideModifier: DefaultStyleModifier where Style == OverrideStyleModifier.Style { + associatedtype OriginalStyle + + associatedtype OverrideStyleModifier: StyleModifier +} + +// MARK: - StyleWriterOverrideModifier + +package protocol StyleWriterOverrideModifier: AnyDefaultStyle { + associatedtype OriginalStyle + + associatedtype StyleOverride + + static func injectStyleOverride(in inputs: inout _ViewInputs) -> () +} + +extension StyleWriterOverrideModifier { + package static func injectStyleOverride

( + in inputs: inout _ViewInputs, + requiring: P.Type + ) where P: ViewInputPredicate { + guard requiring.evaluate(inputs: inputs) else { + return + } + injectStyleOverride(in: &inputs) + } +} + +// MARK: - DefaultStyleModifierTypeVisitor + +package protocol DefaultStyleModifierTypeVisitor { + func visit(type: T.Type) where T: DefaultStyleModifier +} + +// MARK: - StyleOverrideModifierTypeVisitor + +package protocol StyleOverrideModifierTypeVisitor { + func visit(type: T.Type) where T: StyleOverrideModifier +} + +// MARK: - StyleWriterOverrideModifierTypeVisitor + +package protocol StyleWriterOverrideModifierTypeVisitor { + func visit(type: T.Type) where T: StyleWriterOverrideModifier +} diff --git a/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift b/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift new file mode 100644 index 000000000..6cf0f9c19 --- /dev/null +++ b/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift @@ -0,0 +1,385 @@ +// +// ViewStyle.swift +// OpenSwiftUICore +// +// Audited for 6.5.4 +// Status: Complete +// ID: AC03956538119E2820390436C305EBF1 (SwiftUI) +// ID: AC59074524C298808AAD87A4737AEFFC (SwiftUICore) + +import OpenAttributeGraphShims + +// MARK: - StyleableView + +package protocol StyleableView: View where Configuration == DefaultStyleModifier.StyleConfiguration { + associatedtype Configuration + + associatedtype DefaultStyleModifier: StyleModifier + + var configuration: Configuration { get } + + static var defaultStyleModifier: DefaultStyleModifier { get } +} + +extension StyleableView { + package var body: some View { self } + + nonisolated package static func _makeView( + view: _GraphValue, + inputs: _ViewInputs + ) -> _ViewOutputs { + var inputs = inputs + guard inputs.base.isCurrentStyleableView(Self.self) else { + inputs.base.setCurrentStyleableView(Self.self) + return Body._makeView( + view: _GraphValue(MakeResolvedRepresentation(view: view.value)), + inputs: inputs + ) + } + guard let modifier = inputs.base.popLast(StyleInput.self) else { + return MakeDefaultRepresentation.Value.makeDebuggableView( + view: _GraphValue(MakeDefaultRepresentation(view: view.value)), + inputs: inputs + ) + } + return modifier.type.makeView( + view: view, + modifier: modifier, + inputs: inputs + ) + } + + nonisolated package static func _makeViewList( + view: _GraphValue, + inputs: _ViewListInputs + ) -> _ViewListOutputs { + var inputs = inputs + guard inputs.base.isCurrentStyleableView(Self.self) else { + inputs.base.setCurrentStyleableView(Self.self) + return Body._makeViewList( + view: _GraphValue(MakeResolvedRepresentation(view: view.value)), + inputs: inputs + ) + } + guard let modifier = inputs.base.popLast(StyleInput.self) else { + return MakeDefaultRepresentation.Value.makeDebuggableViewList( + view: _GraphValue(MakeDefaultRepresentation(view: view.value)), + inputs: inputs + ) + } + return modifier.type.makeViewList( + view: view, + modifier: modifier, + inputs: inputs + ) + } + + nonisolated package static func _viewListCount( + inputs: _ViewListCountInputs + ) -> Int? { + var inputs = inputs + guard inputs.isCurrentStyleableView(Self.self) else { + inputs.setCurrentStyleableView(Self.self) + return Body._viewListCount(inputs: inputs) + } + guard let modifier = inputs.popLast(StyleInput.self) else { + return MakeDefaultRepresentation.Value._viewListCount(inputs: inputs) + } + return modifier.type.viewListCount(inputs: inputs) + } +} + +// MARK: - StyleModifier + +package protocol StyleModifier: MultiViewModifier, PrimitiveViewModifier { + associatedtype Style + + associatedtype StyleConfiguration + + associatedtype StyleBody: View + + init(style: Style) + + var style: Style { get set } + + func styleBody(configuration: StyleConfiguration) -> StyleBody +} + +extension StyleModifier { + nonisolated package static func _makeView( + modifier: _GraphValue, + inputs: _ViewInputs, + body: @escaping (_Graph, _ViewInputs) -> _ViewOutputs + ) -> _ViewOutputs { + var inputs = inputs + let override = inputs[StyleOverrideInput