First try to find changed values
This commit is contained in:
parent
5cdc104b40
commit
e717c92f33
@ -18,6 +18,7 @@ mod shell;
|
|||||||
mod input;
|
mod input;
|
||||||
mod settings;
|
mod settings;
|
||||||
mod cursor;
|
mod cursor;
|
||||||
|
mod shell_dlg;
|
||||||
|
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
62
src/shell_dlg.rs
Normal file
62
src/shell_dlg.rs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
use ui::{SH, Ui};
|
||||||
|
use neovim_lib::{NeovimApi, CallError, Value};
|
||||||
|
use gtk;
|
||||||
|
use gtk_sys;
|
||||||
|
use gtk::{Dialog, DialogExt};
|
||||||
|
|
||||||
|
pub fn can_close_window(ui: &Ui) -> bool {
|
||||||
|
match get_changed_buffers() {
|
||||||
|
Ok(vec) => {
|
||||||
|
if !vec.is_empty() {
|
||||||
|
show_not_saved_dlg(ui, &vec)
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Err(ref err) => {
|
||||||
|
println!("Error getting info from nvim: {}", err);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn show_not_saved_dlg(ui: &Ui, changed_bufs: &Vec<String>) -> bool {
|
||||||
|
let flags = gtk::DIALOG_MODAL | gtk::DIALOG_DESTROY_WITH_PARENT;
|
||||||
|
let dlg = Dialog::new_with_buttons(Some("Question"), ui.window.as_ref(), flags, &[
|
||||||
|
("_OK", gtk_sys::GTK_RESPONSE_ACCEPT as i32),
|
||||||
|
("_Cancel",
|
||||||
|
gtk_sys::GTK_RESPONSE_REJECT as i32)
|
||||||
|
]);
|
||||||
|
|
||||||
|
dlg.run();
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_changed_buffers() -> Result<Vec<String>, CallError> {
|
||||||
|
SHELL!(shell = {
|
||||||
|
let mut nvim = shell.nvim();
|
||||||
|
let buffers = nvim.get_buffers()?;
|
||||||
|
|
||||||
|
Ok(buffers.iter()
|
||||||
|
.map(|buf| {
|
||||||
|
(match buf.get_option(&mut nvim, "modified") {
|
||||||
|
Ok(Value::Boolean(val)) => val,
|
||||||
|
_ => {
|
||||||
|
println!("Value must be boolean");
|
||||||
|
false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
match buf.get_name(&mut nvim) {
|
||||||
|
Ok(name) => name,
|
||||||
|
Err(ref err) => {
|
||||||
|
println!("Something going wrong while getting buffer name: {}", err);
|
||||||
|
"<Error>".to_owned()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.filter(|e| e.0)
|
||||||
|
.map(|e| e.1)
|
||||||
|
.collect())
|
||||||
|
})
|
||||||
|
}
|
18
src/ui.rs
18
src/ui.rs
@ -13,6 +13,7 @@ use neovim_lib::NeovimApi;
|
|||||||
|
|
||||||
use settings;
|
use settings;
|
||||||
use shell::{Shell, NvimMode};
|
use shell::{Shell, NvimMode};
|
||||||
|
use shell_dlg;
|
||||||
use nvim::ErrorReport;
|
use nvim::ErrorReport;
|
||||||
|
|
||||||
macro_rules! ui_thread_var {
|
macro_rules! ui_thread_var {
|
||||||
@ -169,16 +170,17 @@ fn edit_save_all() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn quit() {
|
|
||||||
UI.with(|ui_cell| {
|
|
||||||
let mut ui = ui_cell.borrow_mut();
|
|
||||||
ui.destroy();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn gtk_delete(_: &ApplicationWindow, _: &Event) -> Inhibit {
|
fn gtk_delete(_: &ApplicationWindow, _: &Event) -> Inhibit {
|
||||||
quit();
|
Inhibit(UI.with(|ui_cell| {
|
||||||
Inhibit(false)
|
let mut ui = ui_cell.borrow_mut();
|
||||||
|
if shell_dlg::can_close_window(&ui) {
|
||||||
|
ui.destroy();
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user