Skip to main content

blocking_dialog/linux/
save_file.rs

1// SPDX-FileCopyrightText: 2026 Manuel Quarneti <mq1@ik.me>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use crate::{BlockingDialogError, BlockingSaveFileDialog};
5use native_dialog::DialogBuilder;
6use raw_window_handle::HasWindowHandle;
7use std::path::PathBuf;
8
9impl<'a, W: HasWindowHandle> BlockingSaveFileDialog<'a, W> {
10    pub fn show(&self) -> Result<Option<PathBuf>, BlockingDialogError> {
11        let mut dialog = DialogBuilder::file()
12            .set_title(self.title)
13            .set_owner(&self.window);
14
15        if let Some(default_filename) = self.default_filename {
16            dialog = dialog.set_filename(default_filename);
17        }
18
19        for filter in self.filter {
20            dialog = dialog.add_filter(filter.name, filter.extensions);
21        }
22
23        let dialog = dialog.save_single_file();
24
25        match dialog.show() {
26            Ok(maybe_path) => Ok(maybe_path),
27            Err(err) => Err(BlockingDialogError::NativeDialog(err)),
28        }
29    }
30}