dialog.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use crate::api::dialog::{select, select_multiple, save_file, pick_folder, Response};
  2. use super::cmd::{OpenDialogOptions, SaveDialogOptions};
  3. use web_view::WebView;
  4. fn map_response(response: Response) -> String {
  5. match response {
  6. Response::Okay(path) => format!(r#""{}""#, path).replace("\\", "\\\\"),
  7. Response::OkayMultiple(paths) => format!("{:?}", paths),
  8. Response::Cancel => panic!("unexpected response type")
  9. }
  10. }
  11. pub fn open<T: 'static>(
  12. webview: &mut WebView<'_, T>,
  13. options: OpenDialogOptions,
  14. callback: String,
  15. error: String,
  16. ) {
  17. crate::execute_promise_sync(
  18. webview,
  19. move || {
  20. let response = if options.multiple {
  21. select_multiple(options.filter, options.default_path)
  22. } else if options.directory {
  23. pick_folder(options.default_path)
  24. } else {
  25. select(options.filter, options.default_path)
  26. };
  27. response
  28. .map(|r| map_response(r))
  29. .map_err(|e| crate::ErrorKind::Dialog(e.to_string()).into())
  30. },
  31. callback,
  32. error,
  33. );
  34. }
  35. pub fn save<T: 'static>(
  36. webview: &mut WebView<'_, T>,
  37. options: SaveDialogOptions,
  38. callback: String,
  39. error: String,
  40. ) {
  41. crate::execute_promise_sync(
  42. webview,
  43. move || {
  44. save_file(options.filter, options.default_path)
  45. .map(|r| map_response(r))
  46. .map_err(|e| crate::ErrorKind::Dialog(e.to_string()).into())
  47. },
  48. callback,
  49. error,
  50. );
  51. }