File Path Indicator¶
本节在状态栏中添加一个显示文件路径的文本控件。首先需要存储文件路径状态,并在初始化阶段设置为None
。
struct Editor {
path: Option<PathBuf>,
// ...
}
impl Application for Editor {
// ...
fn new() -> (Editor, Command<Message>) {
(
Editor {
path: None,
// ...
},
// ...
)
}
// ...
}
Path与PathBuf
std::path::Path
和std::path::PathBuf
的关系类似于&str
和String
的关系。Path
是一个不可变引用,PathBuf
是一个可变的对象,因此存储路径状态需要使用PathBuf
,引用路径可以使用Path
。
之前的load_file
函数只返回了文件内容,此处需要将文件的路径一同返回。注意函数不能返回引用,因此需要将路径转换为PathBuf
类型。and_then
方法处理Result
的Ok
值,在成功读取文件后将Path
转换为PathBuf
并返回。调用load_file
的pick_file
函数也需要一并修改,同时返回路径和文件内容。
async fn pick_file() -> Result<(PathBuf, Arc<String>), Error> {
// ...
}
async fn load_file(path: impl AsRef<Path>) -> Result<(PathBuf, Arc<String>), Error> {
let content = tokio::fs::read_to_string(path.as_ref())
.await
.map(Arc::new)
.map_err(|err| err.kind())
.map_err(Error::IO);
content.and_then(|content| Ok((path.as_ref().to_path_buf(), content)))
}
在修改读取文件的函数后,需要修改函数回调事件的类型和对应的处理函数
enum Message {
// ...
FileOpened(Result<(PathBuf, Arc<String>), Error>),
}
impl Application for Editor {
// ...
fn update(&mut self, message: Message) -> Command<Message> {
match message {
// ...
Message::FileOpened(Ok((path, result))) => {
self.path = Some(path);
self.content = text_editor::Content::with(&result);
Command::none()
},
}
}
}
enum Message {
// ...
FileOpened(Result<Arc<String>, Error>),
}
impl Application for Editor {
// ...
fn update(&mut self, message: Message) -> Command<Message> {
match message {
// ...
Message::FileOpened(Ok(result)) => {
self.content = text_editor::Content::with(&result);
Command::none()
},
}
}
}
最后在状态栏中添加一个文本控件显示文件路径即可。
impl Application for Editor {
// ...
fn view(&mut self) -> Element<Message> {
// ...
let path_indicator = match &self.path {
None => text(""),
Some(path) => text(path.to_string_lossy())
};
let status_bar = row![
path_indicator, // Add path indicator here
horizontal_space(Length::Fill),
cursor_indicator
];
// ...
}
}
以下为完整的main.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 |
|