@@ -15,6 +15,7 @@ public struct WelcomeWindow<RecentsView: View, SubtitleView: View>: Scene {
1515 private let customRecentsList : ( ( _ dismissWindow: @escaping ( ) -> Void ) -> RecentsView ) ?
1616 private let onDrop : ( ( _ url: URL , _ dismiss: @escaping ( ) -> Void ) -> Void ) ?
1717 private let subtitleView : ( ( ) -> SubtitleView ) ?
18+ private let openHandler : WelcomeOpenHandler ?
1819
1920 let iconImage : Image ?
2021 let title : String ?
@@ -33,14 +34,16 @@ public struct WelcomeWindow<RecentsView: View, SubtitleView: View>: Scene {
3334 @ActionsBuilder actions: @escaping ( _ dismissWindow: @escaping ( ) -> Void ) -> WelcomeActions ,
3435 customRecentsList: ( ( _ dismissWindow: @escaping ( ) -> Void ) -> RecentsView ) ? = nil ,
3536 subtitleView: ( ( ) -> SubtitleView ) ? = nil ,
36- onDrop: ( ( _ url: URL , _ dismiss: @escaping ( ) -> Void ) -> Void ) ? = nil
37+ onDrop: ( ( _ url: URL , _ dismiss: @escaping ( ) -> Void ) -> Void ) ? = nil ,
38+ openHandler: WelcomeOpenHandler ? = nil
3739 ) {
3840 self . iconImage = iconImage
3941 self . title = title
4042 self . buildActions = actions
4143 self . customRecentsList = customRecentsList
4244 self . subtitleView = subtitleView
4345 self . onDrop = onDrop
46+ self . openHandler = openHandler
4447 }
4548
4649 public var body : some Scene {
@@ -52,7 +55,8 @@ public struct WelcomeWindow<RecentsView: View, SubtitleView: View>: Scene {
5255 subtitleView: subtitleView,
5356 buildActions: buildActions,
5457 onDrop: onDrop,
55- customRecentsList: customRecentsList
58+ customRecentsList: customRecentsList,
59+ openHandler: openHandler
5660 )
5761 . frame ( width: 740 , height: isMacOS26 ? 460 - 28 : 460 )
5862 . task {
@@ -71,6 +75,20 @@ public struct WelcomeWindow<RecentsView: View, SubtitleView: View>: Scene {
7175 }
7276}
7377
78+ /// A closure type used to handle opening recent items from the default `RecentsListView`.
79+ ///
80+ /// This allows apps to override the default `NSDocumentController` behavior for
81+ /// opening files, making the handling of recent-item URLs fully configurable.
82+ ///
83+ /// The closure is executed on the **main actor** to ensure UI safety.
84+ ///
85+ /// - Parameters:
86+ /// - urls: The recent-item URLs selected by the user to be opened.
87+ /// - dismiss: A closure to invoke when the opening process is complete and the
88+ /// `RecentsListView` can be dismissed.
89+ ///
90+ public typealias WelcomeOpenHandler = @MainActor ( _ urls: [ URL ] , _ dismiss: @escaping ( ) -> Void ) -> Void
91+
7492// ──────────────────────────────────────────────────────────────
7593// 1) NEITHER a custom recents list NOR a subtitle view
7694// ──────────────────────────────────────────────────────────────
@@ -81,15 +99,17 @@ extension WelcomeWindow where RecentsView == EmptyView, SubtitleView == EmptyVie
8199 iconImage: Image ? = nil ,
82100 title: String ? = nil ,
83101 @ActionsBuilder actions: @escaping ( _ dismissWindow: @escaping ( ) -> Void ) -> WelcomeActions ,
84- onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil
102+ onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil ,
103+ openHandler: WelcomeOpenHandler ? = nil
85104 ) {
86105 self . init (
87106 iconImage: iconImage,
88107 title: title,
89108 actions: actions,
90109 customRecentsList: nil ,
91110 subtitleView: nil ,
92- onDrop: onDrop
111+ onDrop: onDrop,
112+ openHandler: openHandler
93113 )
94114 }
95115}
@@ -105,15 +125,17 @@ extension WelcomeWindow where RecentsView == EmptyView {
105125 title: String ? = nil ,
106126 subtitleView: @escaping ( ) -> SubtitleView ,
107127 @ActionsBuilder actions: @escaping ( _ dismissWindow: @escaping ( ) -> Void ) -> WelcomeActions ,
108- onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil
128+ onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil ,
129+ openHandler: WelcomeOpenHandler ? = nil
109130 ) {
110131 self . init (
111132 iconImage: iconImage,
112133 title: title,
113134 actions: actions,
114135 customRecentsList: nil ,
115136 subtitleView: subtitleView,
116- onDrop: onDrop
137+ onDrop: onDrop,
138+ openHandler: openHandler
117139 )
118140 }
119141}
@@ -129,15 +151,17 @@ extension WelcomeWindow where SubtitleView == EmptyView {
129151 title: String ? = nil ,
130152 @ActionsBuilder actions: @escaping ( _ dismissWindow: @escaping ( ) -> Void ) -> WelcomeActions ,
131153 customRecentsList: ( ( _ dismissWindow: @escaping ( ) -> Void ) -> RecentsView ) ? = nil ,
132- onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil
154+ onDrop: ( ( _ url: URL , _ dismissWindow: @escaping ( ) -> Void ) -> Void ) ? = nil ,
155+ openHandler: WelcomeOpenHandler ? = nil
133156 ) {
134157 self . init (
135158 iconImage: iconImage,
136159 title: title,
137160 actions: actions,
138161 customRecentsList: customRecentsList,
139162 subtitleView: nil ,
140- onDrop: onDrop
163+ onDrop: onDrop,
164+ openHandler: openHandler
141165 )
142166 }
143167}
0 commit comments