Skip to content

Commit

Permalink
Use static home grid layout when not customizable
Browse files Browse the repository at this point in the history
  • Loading branch information
dus7 committed Nov 12, 2024
1 parent e8b0c2b commit 91825dc
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 15 deletions.
2 changes: 1 addition & 1 deletion DuckDuckGo/EditableShortcutsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct EditableShortcutsView: View {
private let haptics = UIImpactFeedbackGenerator()

var body: some View {
NewTabPageGridView(geometry: geometry) { _ in
NewTabPageGridView(geometry: geometry, isUsingDynamicSpacing: true) { _ in
ReorderableForEach(model.itemsSettings, id: \.item.id, isReorderingEnabled: true) { setting in
let isEnabled = model.enabledItems.contains(setting.item)
Button {
Expand Down
6 changes: 4 additions & 2 deletions DuckDuckGo/FavoritesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ struct FavoritesView<Model: FavoritesViewModel>: View {
var body: some View {
VStack(alignment: .center, spacing: 24) {

let columns = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape)
let columns = NewTabPageGrid.columnsCount(for: horizontalSizeClass,
isLandscape: isLandscape,
isDynamic: model.isNewTabPageCustomizationEnabled)
let result = model.prefixedFavorites(for: columns)

NewTabPageGridView(geometry: geometry) { _ in
NewTabPageGridView(geometry: geometry, isUsingDynamicSpacing: model.isNewTabPageCustomizationEnabled) { _ in
ReorderableForEach(result.items) { item in
viewFor(item)
.previewShape()
Expand Down
3 changes: 2 additions & 1 deletion DuckDuckGo/FavoritesViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ class FavoritesViewModel: ObservableObject {
private let favoriteDataSource: NewTabPageFavoriteDataSource
private let pixelFiring: PixelFiring.Type
private let dailyPixelFiring: DailyPixelFiring.Type
private let isNewTabPageCustomizationEnabled: Bool

let isNewTabPageCustomizationEnabled: Bool

var isEmpty: Bool {
allFavorites.filter(\.isFavorite).isEmpty
Expand Down
45 changes: 35 additions & 10 deletions DuckDuckGo/NewTabPageGridView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@ struct NewTabPageGridView<Content: View>: View {
@Environment(\.isLandscapeOrientation) var isLandscape

let geometry: GeometryProxy?
let isUsingDynamicSpacing: Bool
@ViewBuilder var content: (_ columnsCount: Int) -> Content

@State private var width: CGFloat = .zero

var body: some View {
let columnsCount = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape)
let columnsCount = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape, isDynamic: isUsingDynamicSpacing)

LazyVGrid(columns: flexibleColumns(columnsCount, width: width), spacing: 24, content: {
LazyVGrid(columns: createColumns(columnsCount), spacing: 24, content: {
content(columnsCount)
})
.frame(maxWidth: .infinity)
Expand All @@ -41,12 +42,14 @@ struct NewTabPageGridView<Content: View>: View {
return geometry[anchor].width
})
.onPreferenceChange(FramePreferenceKey.self, perform: { value in
width = value
if isUsingDynamicSpacing {
width = value
}
})
.padding(0)
}

private func flexibleColumns(_ count: Int, width: CGFloat) -> [GridItem] {
private func flexibleColumns(_ count: Int) -> [GridItem] {
let spacing: CGFloat?
if width != .zero {
let columnsWidth = NewTabPageGrid.Item.edgeSize * Double(count)
Expand All @@ -62,6 +65,17 @@ struct NewTabPageGridView<Content: View>: View {
alignment: .top),
count: count)
}

private func staticColumns(_ count: Int) -> [GridItem] {
return Array(repeating: GridItem(.fixed(NewTabPageGrid.Item.edgeSize),
spacing: NewTabPageGrid.Item.staticSpacing,
alignment: .top),
count: count)
}

private func createColumns(_ count: Int) -> [GridItem] {
isUsingDynamicSpacing ? flexibleColumns(count) : staticColumns(count)
}
}

private struct FramePreferenceKey: PreferenceKey {
Expand All @@ -72,17 +86,28 @@ private struct FramePreferenceKey: PreferenceKey {
}

enum NewTabPageGrid {
enum ColumnCount {
static let compact = 4
static let regular = 6
static func columnsCount(for sizeClass: UserInterfaceSizeClass?, isLandscape: Bool, isDynamic: Bool) -> Int {
if isDynamic {
let usesWideLayout = isLandscape || sizeClass == .regular
return usesWideLayout ? ColumnCount.regular : ColumnCount.compact
} else {
return UIDevice.current.userInterfaceIdiom == .pad ? ColumnCount.iPadStaticLayout : ColumnCount.compact
}
}

enum Item {
static let edgeSize = 64.0
}
}

static func columnsCount(for sizeClass: UserInterfaceSizeClass?, isLandscape: Bool) -> Int {
let usesWideLayout = isLandscape || sizeClass == .regular
return usesWideLayout ? ColumnCount.regular : ColumnCount.compact
private extension NewTabPageGrid {
enum ColumnCount {
static let compact = 4
static let regular = 6
static let iPadStaticLayout = 5
}
}

private extension NewTabPageGrid.Item {
static let staticSpacing = 32.0
}
2 changes: 1 addition & 1 deletion DuckDuckGo/ShortcutsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct ShortcutsView: View {
let proxy: GeometryProxy?

var body: some View {
NewTabPageGridView(geometry: proxy) { _ in
NewTabPageGridView(geometry: proxy, isUsingDynamicSpacing: true) { _ in
ForEach(shortcuts) { shortcut in
Button {
model.openShortcut(shortcut)
Expand Down

0 comments on commit 91825dc

Please sign in to comment.