diff --git a/runtime/src/app_window.rs b/runtime/src/app_window.rs index dd994415..87d58fda 100644 --- a/runtime/src/app_window.rs +++ b/runtime/src/app_window.rs @@ -561,6 +561,56 @@ pub fn select_file(_token: APIToken, payload: Json) -> Json) -> Json { + + // Create a new file dialog builder: + let file_dialog = FileDialogBuilder::new(); + + // Set the title of the file dialog: + let file_dialog = file_dialog.set_title(&payload.title); + + // Set the file type filter if provided: + let file_dialog = match &payload.filter { + Some(filter) => { + file_dialog.add_filter(&filter.filter_name, &filter.filter_extensions.iter().map(|s| s.as_str()).collect::>()) + }, + + None => file_dialog, + }; + + // Set the previous file path if provided: + let file_dialog = match &payload.previous_file { + Some(previous) => { + let previous_path = previous.file_path.as_str(); + file_dialog.set_directory(previous_path) + }, + + None => file_dialog, + }; + + // Show the file dialog and get the selected file path: + let file_paths = file_dialog.pick_files(); + match file_paths { + Some(paths) => { + info!("User selected {} files.", paths.len()); + Json(FilesSelectionResponse { + user_cancelled: false, + selected_file_paths: paths.iter().map(|p| p.to_str().unwrap().to_string()).collect(), + }) + } + + None => { + info!("User cancelled file selection."); + Json(FilesSelectionResponse { + user_cancelled: true, + selected_file_paths: Vec::new(), + }) + }, + } +} + #[post("/save/file", data = "")] pub fn save_file(_token: APIToken, payload: Json) -> Json { @@ -620,6 +670,13 @@ pub struct FileSelectionResponse { user_cancelled: bool, selected_file_path: String, } + +#[derive(Serialize)] +pub struct FilesSelectionResponse { + user_cancelled: bool, + selected_file_paths: Vec, +} + #[derive(Serialize)] pub struct FileSaveResponse { user_cancelled: bool, diff --git a/runtime/src/runtime_api.rs b/runtime/src/runtime_api.rs index 23fc5e33..745b82c4 100644 --- a/runtime/src/runtime_api.rs +++ b/runtime/src/runtime_api.rs @@ -73,6 +73,7 @@ pub fn start_runtime_api() { crate::app_window::install_update, crate::app_window::select_directory, crate::app_window::select_file, + crate::app_window::select_files, crate::app_window::save_file, crate::secret::get_secret, crate::secret::store_secret,