Add support for frame
This commit is contained in:
parent
caa8e6bb6e
commit
faffc6da0f
37
Sources/Core/Model/Enumerations/Alignment.swift
Normal file
37
Sources/Core/Model/Enumerations/Alignment.swift
Normal file
@ -0,0 +1,37 @@
|
||||
//
|
||||
// Alignment.swift
|
||||
// MacBackend
|
||||
//
|
||||
// Created by david-swift on 05.01.2025.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// The two-dimensional alignment, consisting of the vertical and horizontal alignment.
|
||||
public struct Alignment {
|
||||
|
||||
/// The center alignment.
|
||||
public static var center: Self {
|
||||
.init(vertical: .center, horizontal: .center)
|
||||
}
|
||||
|
||||
/// The vertical alignment.
|
||||
var vertical: VerticalAlignment
|
||||
/// The horizontal alignment.
|
||||
var horizontal: HorizontalAlignment
|
||||
|
||||
/// The SwiftUI alignment.
|
||||
var swiftUI: SwiftUI.Alignment {
|
||||
.init(horizontal: horizontal.swiftUI, vertical: vertical.swiftUI)
|
||||
}
|
||||
|
||||
/// Initialize an alignment.
|
||||
/// - Parameters:
|
||||
/// - vertical: The vertical alignment.
|
||||
/// - horizontal: The horizontal alignment.
|
||||
public init(vertical: VerticalAlignment, horizontal: HorizontalAlignment) {
|
||||
self.vertical = vertical
|
||||
self.horizontal = horizontal
|
||||
}
|
||||
|
||||
}
|
||||
32
Sources/Core/Model/Enumerations/HorizontalAlignment.swift
Normal file
32
Sources/Core/Model/Enumerations/HorizontalAlignment.swift
Normal file
@ -0,0 +1,32 @@
|
||||
//
|
||||
// HorizontalAlignment.swift
|
||||
// MacBackend
|
||||
//
|
||||
// Created by david-swift on 05.01.25.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// The horizontal alignment.
|
||||
public enum HorizontalAlignment {
|
||||
|
||||
/// The leading alignment.
|
||||
case leading
|
||||
/// The center alignment.
|
||||
case center
|
||||
/// The trailing alignment.
|
||||
case trailing
|
||||
|
||||
/// The SwiftUI alignment.
|
||||
var swiftUI: SwiftUI.HorizontalAlignment {
|
||||
switch self {
|
||||
case .leading:
|
||||
.leading
|
||||
case .center:
|
||||
.center
|
||||
case .trailing:
|
||||
.trailing
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
32
Sources/Core/Model/Enumerations/VerticalAlignment.swift
Normal file
32
Sources/Core/Model/Enumerations/VerticalAlignment.swift
Normal file
@ -0,0 +1,32 @@
|
||||
//
|
||||
// VerticalAlignment.swift
|
||||
// MacBackend
|
||||
//
|
||||
// Created by david-swift on 05.01.25.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// The vertical alignment.
|
||||
public enum VerticalAlignment {
|
||||
|
||||
/// The top alignment.
|
||||
case top
|
||||
/// The center alignment.
|
||||
case center
|
||||
/// The bottom alignment.
|
||||
case bottom
|
||||
|
||||
/// The SwiftUI alignment.
|
||||
var swiftUI: SwiftUI.VerticalAlignment {
|
||||
switch self {
|
||||
case .top:
|
||||
.top
|
||||
case .center:
|
||||
.center
|
||||
case .bottom:
|
||||
.bottom
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
95
Sources/Core/View/FrameWrapper.swift
Normal file
95
Sources/Core/View/FrameWrapper.swift
Normal file
@ -0,0 +1,95 @@
|
||||
//
|
||||
// FrameWrapper.swift
|
||||
// MacBackend
|
||||
//
|
||||
// Created by david-swift on 05.01.2025.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// Wrap a view with a view that defines the wrapped view's frame.
|
||||
public struct FrameWrapper: SwiftUIWidget {
|
||||
|
||||
/// The wrapped view.
|
||||
var content: Body
|
||||
/// The minimum width.
|
||||
var minWidth: Double?
|
||||
/// The ideal width.
|
||||
var idealWidth: Double?
|
||||
/// The maximum width.
|
||||
var maxWidth: Double?
|
||||
/// The minimum height.
|
||||
var minHeight: Double?
|
||||
/// The ideal height.
|
||||
var idealHeight: Double?
|
||||
/// The maximum height.
|
||||
var maxHeight: Double?
|
||||
/// The alignment inside the frame.
|
||||
var alignment: Alignment
|
||||
|
||||
/// The wrapped views.
|
||||
public var wrappedViews: [String: Meta.AnyView] {
|
||||
[.mainContent: content]
|
||||
}
|
||||
|
||||
/// Initialize a wrapper view defining a view's frame.
|
||||
/// - Parameters:
|
||||
/// - minWidth: The minimum width.
|
||||
/// - idealWidth: The ideal width.
|
||||
/// - maxWidth: The maximum width.
|
||||
/// - minHeight: The minimum height.
|
||||
/// - idealHeight: The ideal height.
|
||||
/// - maxHeight: The maximum height.
|
||||
/// - alignment: The alignment inside the view's frame.
|
||||
/// - content: The wrapped view.
|
||||
public init(
|
||||
minWidth: Double? = nil,
|
||||
idealWidth: Double? = nil,
|
||||
maxWidth: Double? = nil,
|
||||
minHeight: Double? = nil,
|
||||
idealHeight: Double? = nil,
|
||||
maxHeight: Double? = nil,
|
||||
alignment: Alignment = .center,
|
||||
@Meta.ViewBuilder content: () -> Body
|
||||
) {
|
||||
self.content = content()
|
||||
self.minWidth = minWidth
|
||||
self.idealWidth = idealWidth
|
||||
self.maxWidth = maxWidth
|
||||
self.minHeight = minHeight
|
||||
self.idealHeight = idealHeight
|
||||
self.maxHeight = maxHeight
|
||||
self.alignment = alignment
|
||||
}
|
||||
|
||||
/// Get the SwiftUI view.
|
||||
/// - Parameter properties: The widget data.
|
||||
/// - Returns: The SwiftUI view.
|
||||
public static func view(properties: Self) -> some SwiftUI.View {
|
||||
MacBackendView(.mainContent)
|
||||
.frame(
|
||||
minWidth: .init(properties.minWidth),
|
||||
idealWidth: .init(properties.idealWidth),
|
||||
maxWidth: .init(properties.maxWidth),
|
||||
minHeight: .init(properties.minHeight),
|
||||
idealHeight: .init(properties.idealHeight),
|
||||
maxHeight: .init(properties.maxHeight),
|
||||
alignment: properties.alignment.swiftUI
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension CGFloat {
|
||||
|
||||
/// Initialize a `CGFloat` from a `Double`.
|
||||
/// - Parameter value: The double value.
|
||||
public init?(_ value: Double?) {
|
||||
if let value {
|
||||
self = .init(value)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -72,4 +72,36 @@ extension AnyView {
|
||||
.init(isPresented: isPresented, content: { self }, dialog: dialog)
|
||||
}
|
||||
|
||||
/// Define a view's frame.
|
||||
/// - Parameters:
|
||||
/// - minWidth: The minimum width.
|
||||
/// - idealWidth: The ideal width.
|
||||
/// - maxWidth: The maximum width.
|
||||
/// - minHeight: The minimum height.
|
||||
/// - idealHeight: The ideal height.
|
||||
/// - maxHeight: The maximum height.
|
||||
/// - alignment: The alignment inside the view's frame.
|
||||
/// - Returns: The view.
|
||||
public func frame(
|
||||
minWidth: Double? = nil,
|
||||
idealWidth: Double? = nil,
|
||||
maxWidth: Double? = nil,
|
||||
minHeight: Double? = nil,
|
||||
idealHeight: Double? = nil,
|
||||
maxHeight: Double? = nil,
|
||||
alignment: Alignment = .center
|
||||
) -> AnyView {
|
||||
FrameWrapper(
|
||||
minWidth: minWidth,
|
||||
idealWidth: idealWidth,
|
||||
maxWidth: maxWidth,
|
||||
minHeight: minHeight,
|
||||
idealHeight: idealHeight,
|
||||
maxHeight: maxHeight,
|
||||
alignment: alignment
|
||||
) {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user