-
Notifications
You must be signed in to change notification settings - Fork 567
/
Copy pathdialog.rs
128 lines (113 loc) · 4.02 KB
/
dialog.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2019 The xi-editor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! File open/save dialogs.
use std::path::{Path, PathBuf};
/// Information about a file to be opened or saved.
#[derive(Debug, Clone)]
pub struct FileInfo {
pub(crate) path: PathBuf,
}
/// Type of file dialog.
#[cfg(not(feature = "x11"))]
pub enum FileDialogType {
/// File open dialog.
Open,
/// File save dialog.
Save,
}
/// Options for file dialogs.
#[derive(Debug, Clone, Default)]
pub struct FileDialogOptions {
pub show_hidden: bool,
pub allowed_types: Option<Vec<FileSpec>>,
pub default_type: Option<FileSpec>,
pub select_directories: bool,
pub multi_selection: bool,
// we don't want a library user to be able to construct this type directly
__non_exhaustive: (),
}
/// A description of a filetype, for specifiying allowed types in a file dialog.
///
/// # Windows
///
/// On windows, each instance of this type is converted to a [`COMDLG_FILTERSPEC`]
/// struct.
///
/// [`COMDLG_FILTERSPEC`]: https://docs.microsoft.com/en-ca/windows/win32/api/shtypes/ns-shtypes-comdlg_filterspec
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FileSpec {
/// A human readable name, describing this filetype.
///
/// This is used in the Windows file dialog, where the user can select
/// from a dropdown the type of file they would like to choose.
///
/// This should not include the file extensions; they will be added automatically.
/// For instance, if we are describing Word documents, the name would be "Word Document",
/// and the displayed string would be "Word Document (*.doc)".
pub name: &'static str,
/// The file extensions used by this file type.
///
/// This should not include the leading '.'.
pub extensions: &'static [&'static str],
}
impl FileInfo {
/// The file's path.
pub fn path(&self) -> &Path {
&self.path
}
}
impl FileDialogOptions {
/// Create a new set of options.
pub fn new() -> FileDialogOptions {
FileDialogOptions::default()
}
/// Set the 'show hidden files' bit.
pub fn show_hidden(mut self) -> Self {
self.show_hidden = true;
self
}
/// Set whether folders should be selectable.
pub fn select_directories(mut self) -> Self {
self.select_directories = true;
self
}
/// Set whether multiple files can be selected.
pub fn multi_selection(mut self) -> Self {
self.multi_selection = true;
self
}
/// Set the file types the user is allowed to select.
pub fn allowed_types(mut self, types: Vec<FileSpec>) -> Self {
self.allowed_types = Some(types);
self
}
/// Set the default file type.
/// If it's `None` or not present in [`allowed_types`](#method.allowed_types)
/// then the first entry in [`allowed_types`](#method.allowed_types) will be used as default.
pub fn default_type(mut self, default_type: FileSpec) -> Self {
self.default_type = Some(default_type);
self
}
}
impl FileSpec {
pub const TEXT: FileSpec = FileSpec::new("Text", &["txt"]);
pub const JPG: FileSpec = FileSpec::new("Jpeg", &["jpg", "jpeg"]);
pub const GIF: FileSpec = FileSpec::new("Gif", &["gif"]);
pub const PDF: FileSpec = FileSpec::new("PDF", &["pdf"]);
pub const HTML: FileSpec = FileSpec::new("Web Page", &["htm", "html"]);
/// Create a new `FileSpec`.
pub const fn new(name: &'static str, extensions: &'static [&'static str]) -> Self {
FileSpec { name, extensions }
}
}