add confirmation dialog on exit when there are unsaved changes

This commit is contained in:
Crispy 2023-03-14 14:04:21 +01:00
parent eb9ab8f85b
commit aecedfb4be
3 changed files with 24 additions and 1 deletions

View file

@ -82,6 +82,10 @@ impl Editor {
"*untitled".into()
}
pub fn is_unsaved(&self) -> bool {
self.unsaved_changes
}
pub fn path(&self) -> Option<&PathBuf> {
self.path.as_ref()
}

View file

@ -17,9 +17,9 @@ use std::{
mod clipboard;
mod editor;
mod util;
use crate::util::{color_highlight, color_reset};
use clipboard::Clipboard;
use editor::Editor;
use util::{color_highlight, color_reset, read_yes_no};
fn main() {
Navigator::new().run();
@ -257,7 +257,16 @@ impl Navigator {
}
}
fn any_unsaved(&self) -> bool {
self.editors.iter().any(Editor::is_unsaved)
}
fn quit(&self) {
if self.any_unsaved() {
if !read_yes_no("Unsaved changes, quit anyway?", false) {
return;
}
}
disable_raw_mode().unwrap();
execute!(stdout(), LeaveAlternateScreen, cursor::Show).unwrap();
exit(0);

View file

@ -7,6 +7,16 @@ use crossterm::{
};
use std::io::{stdout, Write};
pub fn read_yes_no(prompt: &str, default: bool) -> bool {
let options = if default { "Y/n" } else { "y/N" };
let prompt = format!("{prompt} [{options}]: ");
match read_line(&prompt).and_then(|s| s.chars().next()) {
Some('Y' | 'y') => true,
Some('N' | 'n') => false,
_ => default,
}
}
pub fn read_line(prompt: &str) -> Option<String> {
let mut response = String::new();
let size = terminal::size().unwrap();