desktop: Add FilePicker::show_dialog

This method makes it possible to easily integrate an existing RFD
dialog with Ruffle, i.e. make sure it's a proper child of the main window
and ensure there's only one picker present at any moment.
This commit is contained in:
Kamil Jarosz 2024-09-11 21:27:37 +02:00 committed by Nathan Adams
parent c34a4adb71
commit 4e395b26ad
1 changed files with 17 additions and 7 deletions

View File

@ -33,11 +33,6 @@ impl FilePicker {
}
pub async fn pick_ruffle_file(&self, dir: Option<PathBuf>) -> Option<PathBuf> {
if self.data.picking.swap(true, Ordering::SeqCst) {
// Already picking
return None;
}
let locale = &self.data.preferences.language();
let mut dialog = AsyncFileDialog::new()
.add_filter(
@ -54,12 +49,27 @@ impl FilePicker {
dialog = dialog.set_directory(dir);
}
if let Some(result) = self.show_dialog(dialog, |d| d.pick_file()) {
result.await.map(|h| h.into())
} else {
None
}
}
pub fn show_dialog<F, O>(&self, mut dialog: AsyncFileDialog, f: F) -> Option<O>
where
F: FnOnce(AsyncFileDialog) -> O,
{
if let Some(parent) = self.data.parent.upgrade() {
dialog = dialog.set_parent(&parent);
}
let result = dialog.pick_file().await.map(|h| h.into());
if self.data.picking.swap(true, Ordering::SeqCst) {
// Already picking
return None;
}
let result = f(dialog);
self.data.picking.store(false, Ordering::SeqCst);
result
Some(result)
}
}