Skip to main content

blocking_dialog/linux/
pick_files.rs

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