Start implementing settings page
This commit is contained in:
parent
482f3f7fb0
commit
68011d61ee
3 changed files with 52 additions and 1 deletions
|
@ -20,3 +20,4 @@ hex = "0.4"
|
||||||
sha2 = "0.10"
|
sha2 = "0.10"
|
||||||
argon2 = "0.5"
|
argon2 = "0.5"
|
||||||
fs_extra = "1.3"
|
fs_extra = "1.3"
|
||||||
|
rfd = "0.11"
|
|
@ -6,6 +6,7 @@ This is a simple and experimental password-based note-taking app with built-in
|
||||||
## To-Do list
|
## To-Do list
|
||||||
- [x] Improve password checking
|
- [x] Improve password checking
|
||||||
- [x] Allow the addition of arbitrary metadata when creating a note
|
- [x] Allow the addition of arbitrary metadata when creating a note
|
||||||
|
- [ ] Add basic settings (export and import notes, change data directory, etc)
|
||||||
- [ ] Add basic markdown support (bold, italics, underline)
|
- [ ] Add basic markdown support (bold, italics, underline)
|
||||||
- [ ] Improve performance (duplicate decryption operations, tons of copying/cloning, etc)
|
- [ ] Improve performance (duplicate decryption operations, tons of copying/cloning, etc)
|
||||||
|
|
||||||
|
|
49
src/main.rs
49
src/main.rs
|
@ -28,6 +28,7 @@ enum CurrentMode {
|
||||||
View,
|
View,
|
||||||
Compose,
|
Compose,
|
||||||
PasswordInput,
|
PasswordInput,
|
||||||
|
Settings,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct App {
|
struct App {
|
||||||
|
@ -159,6 +160,9 @@ impl eframe::App for App {
|
||||||
if ui.button("want to add one note?").clicked() {
|
if ui.button("want to add one note?").clicked() {
|
||||||
self.mode = CurrentMode::Compose;
|
self.mode = CurrentMode::Compose;
|
||||||
}
|
}
|
||||||
|
if ui.button("settings").clicked() {
|
||||||
|
self.mode = CurrentMode::Settings;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
|
||||||
|
@ -316,6 +320,51 @@ impl eframe::App for App {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
CurrentMode::Settings => {
|
||||||
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
ui.heading("settings");
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.label("manage encryption, export your notes, and other settings");
|
||||||
|
ui.add_space(7.5);
|
||||||
|
if ui.button("return to view mode?").clicked() {
|
||||||
|
self.mode = CurrentMode::View;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ui.separator();
|
||||||
|
|
||||||
|
if let Some(password) = &self.password {
|
||||||
|
ui.label(RichText::new("export notes").size(14.0));
|
||||||
|
ui.label("decrypt your notes and export them in a portable JSON format.");
|
||||||
|
ui.label("note: this action may take a while to finish!");
|
||||||
|
ui.add_space(5.0);
|
||||||
|
if ui.button("export decrypted notes").clicked() {
|
||||||
|
let current_date = SystemTime::now()
|
||||||
|
.duration_since(SystemTime::UNIX_EPOCH)
|
||||||
|
.unwrap()
|
||||||
|
.as_millis()
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
let save_path = rfd::FileDialog::new()
|
||||||
|
.add_filter("JSON", &["json"])
|
||||||
|
.set_title("where to save the decrypted notes")
|
||||||
|
.set_file_name(&format!("note_export_{}.json", current_date))
|
||||||
|
.save_file();
|
||||||
|
|
||||||
|
if let Some(save_path) = save_path {
|
||||||
|
let notes: Vec<Note> = self.notes.clone()
|
||||||
|
.iter()
|
||||||
|
.map(|note| note.decrypt(password).expect("failed to decrypt note"))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let json_notes = serde_json::to_string(¬es).unwrap();
|
||||||
|
|
||||||
|
fs::write(save_path, json_notes)
|
||||||
|
.expect("failed to save decrypted notes")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue