8
8
import SwiftUI
9
9
10
10
public struct VSplit < P: View , D: View , S: View > : View {
11
- private let isResizing : Bool
12
11
private let fraction : FractionHolder
13
12
private let hide : SideHolder
14
13
private let styling : SplitStyling
15
14
private let constraints : SplitConstraints
16
15
private let onDrag : ( ( CGFloat ) -> Void ) ?
16
+ private let isResizing : Bool
17
17
private let primary : P
18
18
private let splitter : D
19
19
private let secondary : S
20
20
21
21
public var body : some View {
22
- Split (
23
- isResizing: isResizing,
24
- primary: { primary } ,
25
- secondary: { secondary }
26
- )
27
- . layout ( LayoutHolder ( . vertical) )
28
- . styling ( styling)
29
- . constraints ( constraints)
30
- . onDrag ( onDrag)
31
- . splitter {
32
- splitter
33
- . environmentObject ( styling)
34
- }
35
- . fraction ( fraction)
36
- . hide ( hide)
22
+ Split ( primary: { primary } , secondary: { secondary } )
23
+ . layout ( LayoutHolder ( . vertical) )
24
+ . styling ( styling)
25
+ . constraints ( constraints)
26
+ . onDrag ( onDrag)
27
+ . splitter {
28
+ splitter
29
+ . environmentObject ( styling)
30
+ }
31
+ . fraction ( fraction)
32
+ . hide ( hide)
33
+ . disableResizing ( isResizing)
37
34
}
38
35
39
36
public init (
40
- isResizing: Bool = true ,
41
37
@ViewBuilder top: @escaping ( ) -> P ,
42
38
@ViewBuilder bottom: @escaping ( ) -> S
43
39
) where D == Splitter {
44
40
let fraction = FractionHolder ( )
45
41
let hide = SideHolder ( )
46
42
let styling = SplitStyling ( )
47
43
let constraints = SplitConstraints ( )
48
- self . init ( isResizing: isResizing,
49
- fraction: fraction,
50
- hide: hide,
51
- styling: styling,
52
- constraints: constraints,
53
- onDrag: nil ,
54
- primary: { top ( ) } ,
55
- splitter: { D ( ) } ,
56
- secondary: { bottom ( ) } )
44
+ let isResizing = true
45
+ self . init (
46
+ fraction: fraction,
47
+ hide: hide,
48
+ styling: styling,
49
+ constraints: constraints,
50
+ onDrag: nil ,
51
+ isResizing: isResizing,
52
+ primary: { top ( ) } ,
53
+ splitter: { D ( ) } ,
54
+ secondary: { bottom ( ) }
55
+ )
57
56
}
58
57
59
58
private init (
60
- isResizing: Bool ,
61
59
fraction: FractionHolder ,
62
60
hide: SideHolder ,
63
61
styling: SplitStyling ,
64
62
constraints: SplitConstraints ,
65
63
onDrag: ( ( CGFloat ) -> Void ) ? ,
64
+ isResizing: Bool ,
66
65
@ViewBuilder primary: @escaping ( ) -> P ,
67
66
@ViewBuilder splitter: @escaping ( ) -> D ,
68
67
@ViewBuilder secondary: @escaping ( ) -> S
69
68
) {
70
- self . isResizing = isResizing
71
69
self . fraction = fraction
72
70
self . hide = hide
73
71
self . styling = styling
74
72
self . constraints = constraints
75
73
self . onDrag = onDrag
74
+ self . isResizing = isResizing
76
75
self . primary = primary ( )
77
76
self . splitter = splitter ( )
78
77
self . secondary = secondary ( )
@@ -92,22 +91,26 @@ public struct VSplit<P: View, D: View, S: View>: View {
92
91
styling. visibleThickness = splitDivider. visibleThickness
93
92
}
94
93
return VSplit < P , T , S > (
95
- isResizing: isResizing,
96
94
fraction: fraction,
97
95
hide: hide,
98
96
styling: styling,
99
97
constraints: constraints,
100
98
onDrag: onDrag,
101
- primary: {
102
- primary
103
- } ,
99
+ isResizing: isResizing,
100
+ primary: { primary } ,
104
101
splitter: splitter,
105
102
secondary: { secondary }
106
103
)
107
104
}
108
105
109
106
/// Return a new instance of VSplit with `constraints` set to these values.
110
- public func constraints( minPFraction: CGFloat ? = nil , minSFraction: CGFloat ? = nil , priority: SplitSide ? = nil , dragToHideP: Bool = false , dragToHideS: Bool = false ) -> VSplit {
107
+ public func constraints(
108
+ minPFraction: CGFloat ? = nil ,
109
+ minSFraction: CGFloat ? = nil ,
110
+ priority: SplitSide ? = nil ,
111
+ dragToHideP: Bool = false ,
112
+ dragToHideS: Bool = false
113
+ ) -> VSplit {
111
114
let constraints = SplitConstraints (
112
115
minPFraction: minPFraction,
113
116
minSFraction: minSFraction,
@@ -116,12 +119,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
116
119
dragToHideS: dragToHideS
117
120
)
118
121
return VSplit (
119
- isResizing: isResizing,
120
122
fraction: fraction,
121
123
hide: hide,
122
124
styling: styling,
123
125
constraints: constraints,
124
126
onDrag: onDrag,
127
+ isResizing: isResizing,
125
128
primary: { primary } ,
126
129
splitter: { splitter } ,
127
130
secondary: { secondary }
@@ -134,28 +137,40 @@ public struct VSplit<P: View, D: View, S: View>: View {
134
137
/// Note that `fraction` is different. It is only set when drag ends, and it is used to determine the initial fraction at open.
135
138
public func onDrag( _ callback: ( ( CGFloat ) -> Void ) ? ) -> VSplit {
136
139
return VSplit (
137
- isResizing: isResizing,
138
140
fraction: fraction,
139
141
hide: hide,
140
142
styling: styling,
141
143
constraints: constraints,
142
144
onDrag: callback,
145
+ isResizing: isResizing,
143
146
primary: { primary } ,
144
147
splitter: { splitter } ,
145
148
secondary: { secondary }
146
149
)
147
150
}
148
151
149
152
/// Return a new instance of VSplit with `styling` set to these values.
150
- public func styling( color: Color ? = nil , inset: CGFloat ? = nil , visibleThickness: CGFloat ? = nil , invisibleThickness: CGFloat ? = nil , hideSplitter: Bool = false ) -> VSplit {
151
- let styling = SplitStyling ( color: color, inset: inset, visibleThickness: visibleThickness, invisibleThickness: invisibleThickness, hideSplitter: hideSplitter)
153
+ public func styling(
154
+ color: Color ? = nil ,
155
+ inset: CGFloat ? = nil ,
156
+ visibleThickness: CGFloat ? = nil ,
157
+ invisibleThickness: CGFloat ? = nil ,
158
+ hideSplitter: Bool = false
159
+ ) -> VSplit {
160
+ let styling = SplitStyling (
161
+ color: color,
162
+ inset: inset,
163
+ visibleThickness: visibleThickness,
164
+ invisibleThickness: invisibleThickness,
165
+ hideSplitter: hideSplitter
166
+ )
152
167
return VSplit (
153
- isResizing: isResizing,
154
168
fraction: fraction,
155
169
hide: hide,
156
170
styling: styling,
157
171
constraints: constraints,
158
172
onDrag: onDrag,
173
+ isResizing: isResizing,
159
174
primary: { primary } ,
160
175
splitter: { splitter } ,
161
176
secondary: { secondary }
@@ -165,12 +180,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
165
180
/// Return a new instance of VSplit with `fraction` set to this FractionHolder
166
181
public func fraction( _ fraction: FractionHolder ) -> VSplit < P , D , S > {
167
182
VSplit (
168
- isResizing: isResizing,
169
183
fraction: fraction,
170
184
hide: hide,
171
185
styling: styling,
172
186
constraints: constraints,
173
187
onDrag: onDrag,
188
+ isResizing: isResizing,
174
189
primary: { primary } ,
175
190
splitter: { splitter } ,
176
191
secondary: { secondary }
@@ -185,12 +200,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
185
200
/// Return a new instance of VSplit with `hide` set to this SideHolder
186
201
public func hide( _ side: SideHolder ) -> VSplit < P , D , S > {
187
202
VSplit (
188
- isResizing: isResizing,
189
203
fraction: fraction,
190
204
hide: side,
191
205
styling: styling,
192
206
constraints: constraints,
193
207
onDrag: onDrag,
208
+ isResizing: isResizing,
194
209
primary: { primary } ,
195
210
splitter: { splitter } ,
196
211
secondary: { secondary }
@@ -201,6 +216,23 @@ public struct VSplit<P: View, D: View, S: View>: View {
201
216
public func hide( _ side: SplitSide ) -> VSplit < P , D , S > {
202
217
hide ( SideHolder ( side) )
203
218
}
219
+
220
+ /// Omitts setting the height (if vertical) or width (if horizontal) that matches the container frame
221
+ /// May result in unexpected behaviour, as it's main goal is to keep content at it's original size,
222
+ /// outside of the view frame if required
223
+ public func disableResizing( _ value: Bool = true ) -> VSplit < P , D , S > {
224
+ VSplit (
225
+ fraction: fraction,
226
+ hide: hide,
227
+ styling: styling,
228
+ constraints: constraints,
229
+ onDrag: onDrag,
230
+ isResizing: value,
231
+ primary: { primary } ,
232
+ splitter: { splitter } ,
233
+ secondary: { secondary }
234
+ )
235
+ }
204
236
}
205
237
206
238
struct VSplit_Previews : PreviewProvider {
0 commit comments