diff --git a/README.md b/README.md
index 28e6ebdb..6a39ec19 100644
--- a/README.md
+++ b/README.md
@@ -721,8 +721,8 @@ Support levels:
DatePicker (example)
init(selection: Binding<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View)
+ init(selection: Binding<Date>, in: ClosedRange<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View)
init(_ title: String, selection: Binding<Date>, displayedComponents: DatePickerComponents = [.hourAndMinute, .date])
- - Date range constraints (
in: ClosedRange<Date>) are supported via Skip Fuse bridging
diff --git a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift
index a62d1380..df81d90a 100644
--- a/Sources/SkipUI/SkipUI/Controls/DatePicker.swift
+++ b/Sources/SkipUI/SkipUI/Controls/DatePicker.swift
@@ -46,8 +46,10 @@ public struct DatePicker : View, Renderable {
public init(selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View) {
self.selection = selection
self.label = ComposeBuilder.from(label)
+
self.minDate = nil
self.maxDate = nil
+
if displayedComponents.contains(.date) {
dateFormatter = DateFormatter()
dateFormatter?.dateStyle = .medium
@@ -64,18 +66,18 @@ public struct DatePicker : View, Renderable {
}
}
- // SKIP @bridge
- public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedDisplayedComponents: Int, bridgedLabel: any View) {
- self.init(selection: Binding(get: getSelection, set: setSelection), displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel })
- }
+ public init(selection: Binding, in range: ClosedRange, displayedComponents: DatePickerComponents = [.hourAndMinute, .date], @ViewBuilder label: () -> any View) {
+ self.selection = selection
+ self.label = ComposeBuilder.from(label)
+
+ #if SKIP
+ self.minDate = range.start
+ self.maxDate = range.endInclusive
+ #else
+ self.minDate = range.lowerBound
+ self.maxDate = range.upperBound
+ #endif
- // SKIP @bridge
- public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedMinDate: Date, bridgedMaxDate: Date, bridgedDisplayedComponents: Int, bridgedLabel: any View) {
- self.selection = Binding(get: getSelection, set: setSelection)
- self.label = ComposeBuilder.from({ bridgedLabel })
- self.minDate = bridgedMinDate
- self.maxDate = bridgedMaxDate
- let displayedComponents = DatePickerComponents(rawValue: bridgedDisplayedComponents)
if displayedComponents.contains(.date) {
dateFormatter = DateFormatter()
dateFormatter?.dateStyle = .medium
@@ -92,6 +94,17 @@ public struct DatePicker : View, Renderable {
}
}
+ // SKIP @bridge
+ public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedDisplayedComponents: Int, bridgedLabel: any View) {
+ self.init(selection: Binding(get: getSelection, set: setSelection), displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel })
+ }
+
+ // SKIP @bridge
+ public init(getSelection: @escaping () -> Date, setSelection: @escaping (Date) -> Void, bridgedMinDate: Date, bridgedMaxDate: Date, bridgedDisplayedComponents: Int, bridgedLabel: any View) {
+ self.init(selection: Binding(get: getSelection, set: setSelection), in: bridgedMinDate...bridgedMaxDate, displayedComponents: DatePickerComponents(rawValue: bridgedDisplayedComponents), label: { bridgedLabel }
+ )
+ }
+
public init(_ titleKey: LocalizedStringKey, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
self.init(selection: selection, displayedComponents: displayedComponents, label: { Text(titleKey) })
}
@@ -104,6 +117,18 @@ public struct DatePicker : View, Renderable {
self.init(selection: selection, displayedComponents: displayedComponents, label: { Text(verbatim: title) })
}
+ public init(_ titleKey: LocalizedStringKey, in range: ClosedRange, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleKey) })
+ }
+
+ public init(_ titleResource: LocalizedStringResource, in range: ClosedRange, selection: Binding, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(titleResource) })
+ }
+
+ public init(_ title: String, selection: Binding, in range: ClosedRange, displayedComponents: DatePickerComponents = [.hourAndMinute, .date]) {
+ self.init(selection: selection, in: range, displayedComponents: displayedComponents, label: { Text(verbatim: title) })
+ }
+
#if SKIP
@Composable override func Render(context: ComposeContext) {
let contentContext = context.content()