@@ -108,12 +108,43 @@ impl Cmd {
108108 }
109109}
110110
111+ #[ cfg( all( target_os = "linux" , any( dialog_open, dialog_save) ) ) ]
112+ fn set_default_path ( dialog_builder : FileDialogBuilder , default_path : PathBuf ) -> FileDialogBuilder {
113+ if default_path. is_file ( ) {
114+ dialog_builder. set_file_name ( & default_path. to_string_lossy ( ) . to_string ( ) )
115+ } else {
116+ dialog_builder. set_directory ( default_path)
117+ }
118+ }
119+
120+ #[ cfg( all( any( windows, target_os = "macos" ) , any( dialog_open, dialog_save) ) ) ]
121+ fn set_default_path (
122+ mut dialog_builder : FileDialogBuilder ,
123+ default_path : PathBuf ,
124+ ) -> FileDialogBuilder {
125+ if default_path. is_file ( ) {
126+ if let Some ( parent) = default_path. parent ( ) {
127+ dialog_builder = dialog_builder. set_directory ( parent) ;
128+ }
129+ dialog_builder = dialog_builder. set_file_name (
130+ & default_path
131+ . file_name ( )
132+ . unwrap ( )
133+ . to_string_lossy ( )
134+ . to_string ( ) ,
135+ ) ;
136+ dialog_builder
137+ } else {
138+ dialog_builder. set_directory ( default_path)
139+ }
140+ }
141+
111142/// Shows an open dialog.
112143#[ cfg( dialog_open) ]
113144pub fn open ( options : OpenDialogOptions ) -> crate :: Result < InvokeResponse > {
114145 let mut dialog_builder = FileDialogBuilder :: new ( ) ;
115146 if let Some ( default_path) = options. default_path {
116- dialog_builder = dialog_builder . set_directory ( default_path) ;
147+ dialog_builder = set_default_path ( dialog_builder , default_path) ;
117148 }
118149 for filter in options. filters {
119150 let extensions: Vec < & str > = filter. extensions . iter ( ) . map ( |s| & * * s) . collect ( ) ;
@@ -134,7 +165,7 @@ pub fn open(options: OpenDialogOptions) -> crate::Result<InvokeResponse> {
134165pub fn save ( options : SaveDialogOptions ) -> crate :: Result < InvokeResponse > {
135166 let mut dialog_builder = FileDialogBuilder :: new ( ) ;
136167 if let Some ( default_path) = options. default_path {
137- dialog_builder = dialog_builder . set_directory ( default_path) ;
168+ dialog_builder = set_default_path ( dialog_builder , default_path) ;
138169 }
139170 for filter in options. filters {
140171 let extensions: Vec < & str > = filter. extensions . iter ( ) . map ( |s| & * * s) . collect ( ) ;
0 commit comments