aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 61be22b..da2a259 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,6 +7,7 @@
//!
//! The `dialog` crate can be used to display different types of dialog boxes. The supported types
//! are:
+//! - [`FileSelection`][]: a file chooser dialog box
//! - [`Input`][]: a text input dialog
//! - [`Message`][]: a simple message box
//! - [`Password`][]: a password input dialog
@@ -70,6 +71,7 @@
//! ```
//!
//! [`Dialog`]: backends/struct.Dialog.html
+//! [`FileSelection`]: struct.FileSelection.html
//! [`Input`]: struct.Input.html
//! [`Message`]: struct.Message.html
//! [`Password`]: struct.Password.html
@@ -92,7 +94,11 @@ mod error;
/// [`Backend`]: trait.Backend.html
pub mod backends;
-use std::env;
+use dirs;
+use std::{
+ env,
+ path::{Path, PathBuf},
+};
pub use crate::error::{Error, Result};
@@ -342,6 +348,80 @@ impl DialogBox for Question {
}
}
+/// A file chooser dialog box.
+///
+/// This dialog box opens a file chooser with an optional title in the specified path. If the path
+/// is not specified, it defaults to the user’s home directory.
+///
+/// # Example
+///
+/// ```no_run
+/// use dialog::DialogBox;
+///
+/// let choice = dialog::FileSelection::new("Please select a file")
+/// .title("File Selection")
+/// .path("/home/user/Downloads")
+/// .show()
+/// .expect("Could not display dialog box");
+/// println!("The user chose: {:?}", choice);
+/// ```
+pub struct FileSelection {
+ text: String,
+ title: Option<String>,
+ path: Option<PathBuf>,
+}
+
+impl FileSelection {
+ /// Creates a new file chooser with the given path.
+ pub fn new(text: impl Into<String>) -> FileSelection {
+ FileSelection {
+ text: text.into(),
+ title: None,
+ path: dirs::home_dir(),
+ }
+ }
+
+ /// Sets the title of this file chooser dialog box.
+ ///
+ /// This method returns a reference to `self` to enable chaining.
+ pub fn title(&mut self, title: impl Into<String>) -> &mut FileSelection {
+ self.title = Some(title.into());
+ self
+ }
+
+ /// Sets the path of this file chooser dialog box.
+ ///
+ /// This method returns a reference to `self` to enable chaining.
+ pub fn path(&mut self, path: impl AsRef<Path>) -> &mut FileSelection {
+ self.path = Some(path.as_ref().to_path_buf());
+ self
+ }
+
+ /// Gets the path of this file chooser dialog box.
+ ///
+ /// This method returns the validated directory as a `String`.
+ pub fn path_to_string(&self) -> Option<String> {
+ match self.path {
+ Some(ref path) if path.is_dir() => {
+ // The backends expect a trailing / after the directory
+ path.to_str().map(|s| s.to_string() + "/")
+ }
+ _ => None,
+ }
+ }
+}
+
+impl DialogBox for FileSelection {
+ type Output = Option<String>;
+
+ fn show_with<B>(&self, backend: impl AsRef<B>) -> Result<Self::Output>
+ where
+ B: backends::Backend + ?Sized,
+ {
+ backend.as_ref().show_file_selection(self)
+ }
+}
+
/// Creates a new instance of the default backend.
///
/// The following steps are performed to determine the default backend: