Files
ABS-Client/ABS Client/Audiobookshelf swift/Views/LibraryGridView.swift
2026-05-25 18:43:16 +02:00

97 lines
2.3 KiB
Swift

import SwiftUI
struct LibraryGridView: View {
let items: [LibraryItem]
var onRefresh: (() async -> Void)? = nil
var onSelect: (LibraryItem) -> Void
@AppStorage("libraryCoverSize") private var coverSize: Double = Self.defaultCoverSize
var body: some View {
#if os(macOS)
VStack(spacing: 0) {
zoomBar
gridContent
}
#else
gridContent
#endif
}
private var gridContent: some View {
ScrollView {
LazyVGrid(columns: gridColumns, spacing: gridSpacing) {
ForEach(items) { item in
LibraryItemCell(item: item)
.onTapGesture { onSelect(item) }
}
}
#if os(iOS)
.padding(.horizontal, 8)
.padding(.vertical, 4)
#else
.padding(20)
#endif
}
#if os(iOS)
.refreshable { await onRefresh?() }
#endif
}
#if os(macOS)
private var zoomBar: some View {
HStack(spacing: 8) {
Spacer()
Image(systemName: "rectangle.grid.3x2")
.font(.caption2)
.foregroundStyle(.secondary)
Slider(value: $coverSize, in: Self.minCoverSize...Self.maxCoverSize)
.frame(maxWidth: 220)
Image(systemName: "square")
.font(.caption2)
.foregroundStyle(.secondary)
}
.padding(.horizontal, 12)
.padding(.vertical, 4)
}
#endif
private var gridColumns: [GridItem] {
[GridItem(.adaptive(minimum: CGFloat(coverSize)), spacing: gridSpacing)]
}
private var gridSpacing: CGFloat {
#if os(iOS)
return 8
#else
return 20
#endif
}
// MARK: - Cover-Größen-Defaults (plattformabhängig)
private static var defaultCoverSize: Double {
#if os(iOS)
return 110
#else
return 180
#endif
}
private static var minCoverSize: Double {
#if os(iOS)
return 80
#else
return 120
#endif
}
private static var maxCoverSize: Double {
#if os(iOS)
return 200
#else
return 320
#endif
}
}