Created
August 3, 2022 17:56
-
-
Save davidsteppenbeck/19b3bdb8b4425f3e506e1fa45657ba6c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import SwiftUI | |
import WidgetKit | |
enum WidgetPreviewProviderMode: CaseIterable { | |
/// Use for a system small widget preview. | |
case small | |
/// Use for a system medium widget preview. | |
case medium | |
/// Use for a system large widget preview. | |
case large | |
/// Use for a system extra large widget preview. | |
case extraLarge | |
} | |
extension WidgetPreviewProviderMode { | |
/// Provides the appropriate mode for the specified widget family. | |
static func mode(for widgetFamily: WidgetFamily) -> WidgetPreviewProviderMode { | |
switch widgetFamily { | |
case .systemSmall: | |
return .small | |
case .systemMedium: | |
return .medium | |
case .systemLarge: | |
return .large | |
case .systemExtraLarge: | |
return .extraLarge | |
@unknown default: | |
return .small | |
} | |
} | |
} | |
fileprivate struct WidgetPreviewProviderModifier: ViewModifier { | |
/// The widget preview provider modes to display. | |
let modes: [WidgetPreviewProviderMode] | |
func body(content: Content) -> some View { | |
Group { | |
if modes.contains(.small) { | |
content | |
.previewContext(WidgetPreviewContext(family: .systemSmall)) | |
.previewDisplayName("Small") | |
} | |
if modes.contains(.medium) { | |
content | |
.previewContext(WidgetPreviewContext(family: .systemMedium)) | |
.previewDisplayName("Medium") | |
} | |
if modes.contains(.large) { | |
content | |
.previewContext(WidgetPreviewContext(family: .systemLarge)) | |
.previewDisplayName("Large") | |
} | |
if modes.contains(.extraLarge) { | |
content | |
.previewContext(WidgetPreviewContext(family: .systemExtraLarge)) | |
.previewDisplayName("Extra Large") | |
} | |
} | |
} | |
} | |
extension View { | |
/// Creates a group of views with various widget contexts that are useful for widget previews. | |
/// | |
/// - Parameters: | |
/// - modes: The widget preview provider modes to display, such as small, medium, large, and extra large. | |
func makeForWidgetPreviewProvider(_ modes: [WidgetPreviewProviderMode] = WidgetPreviewProviderMode.allCases) -> some View { | |
modifier(WidgetPreviewProviderModifier(modes: modes)) | |
} | |
/// Creates a group of views with various widget contexts that are useful for widget previews. | |
/// | |
/// - Parameters: | |
/// - mode: The widget preview provider mode to display, such as small, medium, large, or extra large. | |
func makeForWidgetPreviewProvider(_ mode: WidgetPreviewProviderMode) -> some View { | |
modifier(WidgetPreviewProviderModifier(modes: [mode])) | |
} | |
/// Creates a group of views with various environment settings that are useful for widget previews. | |
/// | |
/// - Parameters: | |
/// - modes: The widget preview provider modes to be excluded from being displayed. All other modes will be displayed. | |
func makeForWidgetPreviewProvider(excluding modes: [WidgetPreviewProviderMode]) -> some View { | |
let included = WidgetPreviewProviderMode.allCases.filter { modes.contains($0) == false } | |
return modifier(WidgetPreviewProviderModifier(modes: included)) | |
} | |
/// Creates a group of views with various environment settings that are useful for widget previews. | |
/// | |
/// - Parameters: | |
/// - mode: The widget preview provider mode to be excluded from being displayed. All other modes will be displayed. | |
func makeForWidgetPreviewProvider(excluding mode: WidgetPreviewProviderMode) -> some View { | |
makeForWidgetPreviewProvider(excluding: [mode]) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment