-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathAbsoluteEdge.swift
68 lines (63 loc) · 2.03 KB
/
AbsoluteEdge.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//
// AbsoluteEdge.swift
// OpenSwiftUICore
//
// Audited for iOS 18.0
// Status: Complete
package enum AbsoluteEdge: Int8, CaseIterable, Hashable {
case top, left, bottom, right
package struct Set: OptionSet {
package let rawValue: Int8
package init(rawValue: Int8) { self.rawValue = rawValue }
package static let top: AbsoluteEdge.Set = .init(.top)
package static let left: AbsoluteEdge.Set = .init(.left)
package static let bottom: AbsoluteEdge.Set = .init(.bottom)
package static let right: AbsoluteEdge.Set = .init(.right)
package static let all: AbsoluteEdge.Set = [.top, .left, .bottom, .right]
package static let horizontal: AbsoluteEdge.Set = [.left, .right]
package static let vertical: AbsoluteEdge.Set = [.top, .bottom]
package init(_ e: AbsoluteEdge) {
self.init(rawValue: 1 << e.rawValue)
}
package func contains(_ e: AbsoluteEdge) -> Bool {
self.contains(.init(e))
}
}
}
extension AbsoluteEdge.Set {
package init(_ edges: Edge.Set, layoutDirection: LayoutDirection) {
var result: AbsoluteEdge.Set = []
if edges.contains(.top) {
result.insert(.top)
}
if edges.contains(.leading) {
switch layoutDirection {
case .leftToRight: result.insert(.left)
case .rightToLeft: result.insert(.right)
}
}
if edges.contains(.bottom) {
result.insert(.bottom)
}
if edges.contains(.trailing) {
switch layoutDirection {
case .leftToRight: result.insert(.right)
case .rightToLeft: result.insert(.left)
}
}
self = result
}
}
extension AbsoluteEdge {
package var horizontal: Bool {
self == .left || self == .right
}
package var opposite: AbsoluteEdge {
switch self {
case .top: .bottom
case .left: .right
case .bottom: .top
case .right: .left
}
}
}