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) 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()