Skip to content

Commit 8fb9440

Browse files
committed
Move disableResizing to modifier
1 parent 345a3c6 commit 8fb9440

File tree

3 files changed

+107
-59
lines changed

3 files changed

+107
-59
lines changed

Sources/SplitView/HSplit.swift

+11-15
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,17 @@ public struct HSplit<P: View, D: View, S: View>: View {
1919
private let secondary: S
2020

2121
public var body: some View {
22-
Split(
23-
isResizing: isResizing,
24-
primary: { primary },
25-
secondary: { secondary }
26-
)
27-
.layout(LayoutHolder(.horizontal))
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(.horizontal))
24+
.styling(styling)
25+
.constraints(constraints)
26+
.onDrag(onDrag)
27+
.splitter {
28+
splitter
29+
.environmentObject(styling)
30+
}
31+
.fraction(fraction)
32+
.hide(hide)
3733
}
3834

3935
public init(

Sources/SplitView/Split.swift

+24-4
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,15 @@ public struct Split<P: View, D: View, S: View>: View {
9494
primary
9595
.frame(width: pWidth, height: pHeight)
9696
} else {
97-
primary
98-
.frame(width: pWidth)
99-
.offset(pOffset)
97+
if horizontal {
98+
primary
99+
.frame(height: pHeight)
100+
.offset(pOffset)
101+
} else {
102+
primary
103+
.frame(width: pWidth)
104+
.offset(pOffset)
105+
}
100106
}
101107
}
102108
if !hideSecondary {
@@ -129,7 +135,6 @@ public struct Split<P: View, D: View, S: View>: View {
129135
///
130136
/// The `layout`, `fraction`, `hide` , `styling`, `constraints`, and any custom `splitter` must be specified using the modifiers if they are not defaults
131137
public init(
132-
isResizing: Bool = true,
133138
@ViewBuilder primary: @escaping () -> P,
134139
@ViewBuilder secondary: @escaping () -> S
135140
) where D == Splitter {
@@ -138,6 +143,7 @@ public struct Split<P: View, D: View, S: View>: View {
138143
let hide = SideHolder()
139144
let styling = SplitStyling()
140145
let constraints = SplitConstraints()
146+
let isResizing = true
141147
self.init(layout,
142148
isResizing: isResizing,
143149
fraction: fraction,
@@ -541,6 +547,20 @@ public struct Split<P: View, D: View, S: View>: View {
541547
self.fraction(FractionHolder(fraction))
542548
}
543549

550+
/// Returns new instance of Split with `isResizing` set to boolean value
551+
public func disableResizing(_ value: Bool) -> Split {
552+
Split(layout,
553+
isResizing: !value,
554+
fraction: fraction,
555+
hide: hide,
556+
styling: styling,
557+
constraints: constraints,
558+
onDrag: onDrag,
559+
primary: { primary },
560+
splitter: { splitter },
561+
secondary: { secondary })
562+
}
563+
544564
/// Return a new instance of Split with `hide` set to this SideHolder.
545565
public func hide(_ side: SideHolder) -> Split {
546566
Split(layout,

Sources/SplitView/VSplit.swift

+72-40
Original file line numberDiff line numberDiff line change
@@ -8,71 +8,70 @@
88
import SwiftUI
99

1010
public struct VSplit<P: View, D: View, S: View>: View {
11-
private let isResizing: Bool
1211
private let fraction: FractionHolder
1312
private let hide: SideHolder
1413
private let styling: SplitStyling
1514
private let constraints: SplitConstraints
1615
private let onDrag: ((CGFloat) -> Void)?
16+
private let isResizing: Bool
1717
private let primary: P
1818
private let splitter: D
1919
private let secondary: S
2020

2121
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)
3734
}
3835

3936
public init(
40-
isResizing: Bool = true,
4137
@ViewBuilder top: @escaping () -> P,
4238
@ViewBuilder bottom: @escaping () -> S
4339
) where D == Splitter {
4440
let fraction = FractionHolder()
4541
let hide = SideHolder()
4642
let styling = SplitStyling()
4743
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+
)
5756
}
5857

5958
private init(
60-
isResizing: Bool,
6159
fraction: FractionHolder,
6260
hide: SideHolder,
6361
styling: SplitStyling,
6462
constraints: SplitConstraints,
6563
onDrag: ((CGFloat) -> Void)?,
64+
isResizing: Bool,
6665
@ViewBuilder primary: @escaping () -> P,
6766
@ViewBuilder splitter: @escaping () -> D,
6867
@ViewBuilder secondary: @escaping () -> S
6968
) {
70-
self.isResizing = isResizing
7169
self.fraction = fraction
7270
self.hide = hide
7371
self.styling = styling
7472
self.constraints = constraints
7573
self.onDrag = onDrag
74+
self.isResizing = isResizing
7675
self.primary = primary()
7776
self.splitter = splitter()
7877
self.secondary = secondary()
@@ -92,22 +91,26 @@ public struct VSplit<P: View, D: View, S: View>: View {
9291
styling.visibleThickness = splitDivider.visibleThickness
9392
}
9493
return VSplit<P, T, S>(
95-
isResizing: isResizing,
9694
fraction: fraction,
9795
hide: hide,
9896
styling: styling,
9997
constraints: constraints,
10098
onDrag: onDrag,
101-
primary: {
102-
primary
103-
},
99+
isResizing: isResizing,
100+
primary: { primary },
104101
splitter: splitter,
105102
secondary: { secondary }
106103
)
107104
}
108105

109106
/// 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 {
111114
let constraints = SplitConstraints(
112115
minPFraction: minPFraction,
113116
minSFraction: minSFraction,
@@ -116,12 +119,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
116119
dragToHideS: dragToHideS
117120
)
118121
return VSplit(
119-
isResizing: isResizing,
120122
fraction: fraction,
121123
hide: hide,
122124
styling: styling,
123125
constraints: constraints,
124126
onDrag: onDrag,
127+
isResizing: isResizing,
125128
primary: { primary },
126129
splitter: { splitter },
127130
secondary: { secondary }
@@ -134,28 +137,40 @@ public struct VSplit<P: View, D: View, S: View>: View {
134137
/// Note that `fraction` is different. It is only set when drag ends, and it is used to determine the initial fraction at open.
135138
public func onDrag(_ callback: ((CGFloat) -> Void)?) -> VSplit {
136139
return VSplit(
137-
isResizing: isResizing,
138140
fraction: fraction,
139141
hide: hide,
140142
styling: styling,
141143
constraints: constraints,
142144
onDrag: callback,
145+
isResizing: isResizing,
143146
primary: { primary },
144147
splitter: { splitter },
145148
secondary: { secondary }
146149
)
147150
}
148151

149152
/// 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+
)
152167
return VSplit(
153-
isResizing: isResizing,
154168
fraction: fraction,
155169
hide: hide,
156170
styling: styling,
157171
constraints: constraints,
158172
onDrag: onDrag,
173+
isResizing: isResizing,
159174
primary: { primary },
160175
splitter: { splitter },
161176
secondary: { secondary }
@@ -165,12 +180,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
165180
/// Return a new instance of VSplit with `fraction` set to this FractionHolder
166181
public func fraction(_ fraction: FractionHolder) -> VSplit<P, D, S> {
167182
VSplit(
168-
isResizing: isResizing,
169183
fraction: fraction,
170184
hide: hide,
171185
styling: styling,
172186
constraints: constraints,
173187
onDrag: onDrag,
188+
isResizing: isResizing,
174189
primary: { primary },
175190
splitter: { splitter },
176191
secondary: { secondary }
@@ -185,12 +200,12 @@ public struct VSplit<P: View, D: View, S: View>: View {
185200
/// Return a new instance of VSplit with `hide` set to this SideHolder
186201
public func hide(_ side: SideHolder) -> VSplit<P, D, S> {
187202
VSplit(
188-
isResizing: isResizing,
189203
fraction: fraction,
190204
hide: side,
191205
styling: styling,
192206
constraints: constraints,
193207
onDrag: onDrag,
208+
isResizing: isResizing,
194209
primary: { primary },
195210
splitter: { splitter },
196211
secondary: { secondary }
@@ -201,6 +216,23 @@ public struct VSplit<P: View, D: View, S: View>: View {
201216
public func hide(_ side: SplitSide) -> VSplit<P, D, S> {
202217
hide(SideHolder(side))
203218
}
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+
}
204236
}
205237

206238
struct VSplit_Previews: PreviewProvider {

0 commit comments

Comments
 (0)