Skip to content
This repository was archived by the owner on Dec 27, 2020. It is now read-only.

Commit 4a00ef6

Browse files
committed
optimizations
1 parent 07e2536 commit 4a00ef6

11 files changed

+119
-145
lines changed

Examples/GridExamples macOS/AppDelegate.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ class AppDelegate: NSObject, NSApplicationDelegate {
99
func applicationDidFinishLaunching(_ aNotification: Notification) {
1010
// Insert code here to initialize your application
1111
window = NSWindow(
12-
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
12+
contentRect: NSRect(x: 0, y: 0, width: 600, height: 600),
1313
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
1414
backing: .buffered, defer: false)
1515
window.center()
16+
window.minSize = CGSize(width: 600, height: 600)
1617
window.setFrameAutosaveName("Main Window")
1718

1819
window.contentView = NSHostingView(rootView: ContentView())

Examples/GridExamples macOS/ContentView.swift

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,42 @@ import SwiftUI
22
import Grid
33

44
struct ContentView: View {
5-
@State private var selection = 1
5+
@State private var selection = 0
66

77
var body: some View {
88
TabView(selection: $selection) {
9-
OneColumnLayoutView()
9+
AutoColumnsLayoutView()
1010
.tabItem {
11-
Text("One Column")
11+
Text("Auto Columns")
1212
}
1313
.tag(0)
14-
// AutoColumnLayoutView()
15-
// .tabItem {
16-
// Text("Auto Column")
17-
// }
18-
// .tag(1)
19-
// PerformanceLayoutView()
20-
// .tabItem {
21-
// Text("Performance")
22-
// }
23-
// .tag(2)
24-
// BuilderLayoutView()
25-
// .tabItem {
26-
// Text("Builder")
27-
// }
28-
// .tag(2)
14+
.frame(minWidth: 300)
15+
FixedColumnsLayoutView()
16+
.tabItem {
17+
Text("Fixed Columns")
18+
}
19+
.tag(1)
20+
.frame(minWidth: 300)
21+
SingleColumnLayoutView()
22+
.tabItem {
23+
Text("One Column")
24+
}
25+
.tag(2)
26+
.frame(minWidth: 300)
27+
PerformanceLayoutView()
28+
.tabItem {
29+
Text("Performance")
30+
}
31+
.tag(3)
32+
.frame(minWidth: 300)
33+
BuilderLayoutView()
34+
.tabItem {
35+
Text("Builder")
36+
}
37+
.tag(4)
38+
.frame(minWidth: 300)
2939
}
30-
//.frame(maxWidth: .infinity, maxHeight: .infinity)
40+
.frame(minWidth: 600, maxWidth: .infinity, maxHeight: .infinity)
3141
.padding()
3242
}
3343
}

Examples/GridExamples/BuilderLayoutView.swift

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,60 @@ import SwiftUI
22
import Grid
33

44
struct BuilderLayoutView: View {
5+
@Environment(\.colorScheme) var colorScheme
6+
@State var itemsCount: CGFloat = 8
7+
@State var minItemWidth: CGFloat = 160
8+
@State var itemHeight: CGFloat = 160
9+
@State var hSpacing: CGFloat = 8
10+
@State var vSpacing: CGFloat = 8
11+
@State var cornerRadius: CGFloat = 0
12+
@State var padding: CGFloat = 0
13+
14+
private let itemsCountRange: ClosedRange<CGFloat> = 0...360
15+
private let minItemWidthRange: ClosedRange<CGFloat> = 8...360
16+
private let itemHeightRange: ClosedRange<CGFloat> = 8...360
17+
private let hSpacingRange: ClosedRange<CGFloat> = 0...36
18+
private let zSpacingRange: ClosedRange<CGFloat> = 0...36
19+
private let vSpacingRange: ClosedRange<CGFloat> = 0...36
20+
private var cornerRadiusRange: ClosedRange<CGFloat> = 0...36
21+
private var paddingRange: ClosedRange<CGFloat> = 0...16
22+
523
var body: some View {
6-
ScrollView {
7-
VStack(alignment: .center) {
8-
Section(header: Text("Section 1")) {
9-
Grid {
10-
ForEach(0...10, id: \.self) { _ in
11-
Rectangle()
12-
.foregroundColor(.random)
13-
}
14-
}
15-
}
16-
17-
Section(header: Text("Section 2")) {
18-
Grid {
19-
ForEach(0...10, id: \.self) { _ in
20-
Rectangle()
21-
.foregroundColor(.random)
22-
}
23-
}
24+
ZStack(alignment: .init(horizontal: .center, vertical: .bottom)) {
25+
Grid(0...Int(itemsCount)) { _ in
26+
Rectangle()
27+
.foregroundColor(.random)
28+
.cornerRadius(self.cornerRadius)
29+
}
30+
.padding(self.padding)
31+
.gridStyle(DefaultGridStyle(minItemWidth: minItemWidth, itemHeight: itemHeight, hSpacing: hSpacing, vSpacing: vSpacing))
32+
33+
VStack {
34+
Slider(value: $itemsCount, in: itemsCountRange)
35+
Slider(value: $minItemWidth, in: minItemWidthRange)
36+
Slider(value: $itemHeight, in: hSpacingRange)
37+
Slider(value: $hSpacing, in: zSpacingRange)
38+
Slider(value: $vSpacing, in: vSpacingRange)
39+
Slider(value: $cornerRadius, in: 0...min(minItemWidth, itemHeight))
40+
Slider(value: $padding, in: paddingRange)
41+
Button("Randomize") {
42+
self.randomizeGridValues()
2443
}
2544
}
2645
.padding()
46+
.background(colorScheme == .light ? Color.white.opacity(0.9) : Color.black.opacity(0.6))
2747
}
2848
}
49+
50+
func randomizeGridValues() {
51+
itemsCount = CGFloat.random(in: itemsCountRange)
52+
minItemWidth = CGFloat.random(in: minItemWidthRange)
53+
itemHeight = CGFloat.random(in: itemHeightRange)
54+
hSpacing = CGFloat.random(in: hSpacingRange)
55+
vSpacing = CGFloat.random(in: vSpacingRange)
56+
cornerRadius = CGFloat.random(in: cornerRadiusRange)
57+
padding = CGFloat.random(in: paddingRange)
58+
}
2959
}
3060

3161
struct BuilderLayoutView_Previews: PreviewProvider {

Examples/GridExamples/FixedColumnsLayoutView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ struct FixedColumnsLayoutView: View {
77
Card(title: "\(number)")
88
}
99
.padding()
10-
.gridStyle(FixedColumnsGridStyle(columns: 5, itemHeight: 100))
10+
.gridStyle(
11+
FixedColumnsGridStyle(columns: 3, itemHeight: 80)
12+
)
1113
}
1214
}
1315

Examples/GridExamples/PerformanceLayoutView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ struct PerformanceLayoutView: View {
77
Rectangle()
88
.foregroundColor(.random)
99
}
10-
.gridStyle(DefaultGridStyle(minItemWidth: 16, itemHeight: 16, spacing: 0))
10+
.gridStyle(
11+
DefaultGridStyle(minItemWidth: 16, itemHeight: 16, spacing: 0)
12+
)
1113
}
1214
}
1315

Examples/GridExamples/SingleColumnLayoutView.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ import Grid
33

44
struct SingleColumnLayoutView: View {
55
var body: some View {
6-
GeometryReader { geometry in
7-
///Grid(0...100, minItemWidth: geometry.size.width, itemHeight: 300) { number in
8-
Grid(0...100) { number in
9-
Card(title: "\(number)")
10-
}
11-
.padding()
12-
.gridStyle(SingleColumnGridStyle(itemHeight: 160))
6+
Grid(0...100) { number in
7+
Card(title: "\(number)")
138
}
9+
.padding()
10+
.gridStyle(
11+
SingleColumnGridStyle(itemHeight: 160)
12+
)
1413
}
1514
}
1615

Sources/Grid/DefaultGridStyle.swift

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -32,36 +32,6 @@ public struct DefaultGridStyle: GridStyle {
3232
}
3333

3434
public func position(at index: Int, with geometry: GeometryProxy, itemsCount: Int) -> CGPoint {
35-
self.position(
36-
at: index,
37-
with: geometry,
38-
minItemWidth: self.minItemWidth,
39-
itemHeight: self.itemHeight,
40-
padding: self.padding,
41-
hSpacing: self.hSpacing,
42-
vSpacing: self.vSpacing
43-
)
44-
}
45-
46-
public func gridHeight(with geometry: GeometryProxy, itemsCount: Int) -> CGFloat {
47-
self.gridHeight(
48-
with: geometry,
49-
itemsCount: itemsCount,
50-
minItemWidth: self.minItemWidth,
51-
itemHeight: self.itemHeight,
52-
padding: self.padding,
53-
hSpacing: self.hSpacing,
54-
vSpacing: self.vSpacing
55-
)
56-
}
57-
58-
59-
@inlinable func availableWidth(with geometry: GeometryProxy, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
60-
let horizontalPadding = padding.leading + padding.trailing
61-
return geometry.size.width - horizontalPadding
62-
}
63-
64-
@inlinable func position(at index: Int, with geometry: GeometryProxy, minItemWidth: CGFloat, itemHeight: CGFloat, padding: EdgeInsets, hSpacing: CGFloat, vSpacing: CGFloat) -> CGPoint {
6535
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
6636
let columnCount = Int(availableWidth / minItemWidth)
6737
let row = index / max(1, columnCount)
@@ -73,6 +43,14 @@ public struct DefaultGridStyle: GridStyle {
7343
return CGPoint(x: x, y: y)
7444
}
7545

46+
public func gridHeight(with geometry: GeometryProxy, itemsCount: Int) -> CGFloat {
47+
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
48+
let columnCount = Int(availableWidth / minItemWidth)
49+
let rowCount = Int((CGFloat(itemsCount) / max(1.0, CGFloat(columnCount))).rounded(.up))
50+
let verticalPadding = padding.top + padding.bottom
51+
return CGFloat(rowCount) * itemHeight + verticalPadding + (CGFloat(rowCount - 1) * vSpacing)
52+
}
53+
7654
@inlinable func itemWidth(for geometry: GeometryProxy, minItemWidth: CGFloat, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
7755
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
7856
let columnCount = Int(availableWidth / minItemWidth)
@@ -85,18 +63,4 @@ public struct DefaultGridStyle: GridStyle {
8563
}
8664
return availableWidth
8765
}
88-
89-
@inlinable func itemWidth(for geometry: GeometryProxy, columns: Int, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
90-
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
91-
let usableWidth = availableWidth - (CGFloat(columns - 1) * hSpacing)
92-
return usableWidth / CGFloat(columns)
93-
}
94-
95-
@inlinable func gridHeight(with geometry: GeometryProxy, itemsCount: Int, minItemWidth: CGFloat, itemHeight: CGFloat, padding: EdgeInsets, hSpacing: CGFloat, vSpacing: CGFloat) -> CGFloat {
96-
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
97-
let columnCount = Int(availableWidth / minItemWidth)
98-
let rowCount = Int((CGFloat(itemsCount) / max(1.0, CGFloat(columnCount))).rounded(.up))
99-
let verticalPadding = padding.top + padding.bottom
100-
return CGFloat(rowCount) * itemHeight + verticalPadding + (CGFloat(rowCount - 1) * vSpacing)
101-
}
10266
}

Sources/Grid/FixedColumnsGridStyle.swift

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,35 +32,6 @@ public struct FixedColumnsGridStyle: GridStyle {
3232
}
3333

3434
public func position(at index: Int, with geometry: GeometryProxy, itemsCount: Int) -> CGPoint {
35-
self.position(
36-
at: index,
37-
with: geometry,
38-
columns: self.columns,
39-
itemHeight: self.itemHeight,
40-
padding: self.padding,
41-
hSpacing: self.hSpacing,
42-
vSpacing: self.vSpacing
43-
)
44-
}
45-
46-
public func gridHeight(with geometry: GeometryProxy, itemsCount: Int) -> CGFloat {
47-
self.gridHeight(
48-
with: geometry,
49-
itemsCount: itemsCount,
50-
columns: self.columns,
51-
itemHeight: self.itemHeight,
52-
padding: self.padding,
53-
hSpacing: self.hSpacing,
54-
vSpacing: self.vSpacing
55-
)
56-
}
57-
58-
@inlinable func availableWidth(with geometry: GeometryProxy, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
59-
let horizontalPadding = padding.leading + padding.trailing
60-
return geometry.size.width - horizontalPadding
61-
}
62-
63-
@inlinable func position(at index: Int, with geometry: GeometryProxy, columns: Int, itemHeight: CGFloat, padding: EdgeInsets, hSpacing: CGFloat, vSpacing: CGFloat) -> CGPoint {
6435
let row = index / max(1, columns)
6536
let itemIndexAtRow = index % max(1, columns)
6637
let itemWidth = self.itemWidth(for: geometry, columns: columns, padding: padding, hSpacing: hSpacing)
@@ -70,13 +41,7 @@ public struct FixedColumnsGridStyle: GridStyle {
7041
return CGPoint(x: x, y: y)
7142
}
7243

73-
@inlinable func itemWidth(for geometry: GeometryProxy, columns: Int, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
74-
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
75-
let usableWidth = availableWidth - (CGFloat(columns - 1) * hSpacing)
76-
return usableWidth / CGFloat(columns)
77-
}
78-
79-
@inlinable func gridHeight(with geometry: GeometryProxy, itemsCount: Int, columns: Int, itemHeight: CGFloat, padding: EdgeInsets, hSpacing: CGFloat, vSpacing: CGFloat) -> CGFloat {
44+
public func gridHeight(with geometry: GeometryProxy, itemsCount: Int) -> CGFloat {
8045
let rowCount = Int((CGFloat(itemsCount) / max(1.0, CGFloat(columns))).rounded(.up))
8146
let verticalPadding = padding.top + padding.bottom
8247
return CGFloat(rowCount) * itemHeight + verticalPadding + (CGFloat(rowCount - 1) * vSpacing)

Sources/Grid/Grid+Padding.swift

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extension Grid {
2020
edgeInsets.leading = length
2121
}
2222
if edges.contains(.all) || edges.contains(.bottom) || edges.contains(.vertical) {
23-
edgeInsets.trailing = length
23+
edgeInsets.bottom = length
2424
}
2525
if edges.contains(.all) || edges.contains(.trailing) || edges.contains(.horizontal) {
2626
edgeInsets.trailing = length
@@ -29,19 +29,3 @@ extension Grid {
2929
return self.environment(\.gridStyle.padding, edgeInsets)
3030
}
3131
}
32-
33-
34-
//struct GridPaddingKey: EnvironmentKey {
35-
// static let defaultValue: EdgeInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0)
36-
//}
37-
38-
//extension EnvironmentValues {
39-
// var gridPadding: EdgeInsets {
40-
// get {
41-
// return self[GridPaddingKey.self]
42-
// }
43-
// set {
44-
// self[GridPaddingKey.self] = newValue
45-
// }
46-
// }
47-
//}

Sources/Grid/Grid+Style.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,20 @@ public protocol GridStyle {
1111
func gridHeight(with geometry: GeometryProxy, itemsCount: Int) -> CGFloat
1212
}
1313

14+
15+
extension GridStyle {
16+
@inlinable func availableWidth(with geometry: GeometryProxy, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
17+
let horizontalPadding = padding.leading + padding.trailing
18+
return geometry.size.width - horizontalPadding
19+
}
20+
21+
@inlinable func itemWidth(for geometry: GeometryProxy, columns: Int, padding: EdgeInsets, hSpacing: CGFloat) -> CGFloat {
22+
let availableWidth = self.availableWidth(with: geometry, padding: padding, hSpacing: hSpacing)
23+
let usableWidth = availableWidth - (CGFloat(columns - 1) * hSpacing)
24+
return usableWidth / CGFloat(columns)
25+
}
26+
}
27+
1428
extension View {
1529

1630
/// Sets the style for `Grid` within the environment of `self`.

0 commit comments

Comments
 (0)