diff --git a/src/board.rs b/src/board.rs index 2bc3bdb..76f1830 100644 --- a/src/board.rs +++ b/src/board.rs @@ -90,7 +90,7 @@ pub fn write_board_to_file(board: &Board, image: Option<&DynamicImage>, path: &P let options = zip::write::FileOptions::default(); ar.start_file("graph.json", options)?; - ar.write(&serde_json::to_vec(board)?)?; + ar.write_all(&serde_json::to_vec(board)?)?; if let Some(image) = image { ar.start_file("image.png", options)?; let data = encode_png(image); @@ -101,6 +101,23 @@ pub fn write_board_to_file(board: &Board, image: Option<&DynamicImage>, path: &P Ok(()) } +pub fn read_board_from_file(path: &Path) -> io::Result<(Board, Option)> { + let file = File::open(path)?; + let mut ar = zip::ZipArchive::new(file)?; + + let json_file = ar.by_name("graph.json")?; + let board = serde_json::from_reader(json_file)?; + let image = ar.by_name("image.png").ok(); + if image.is_none() { + return Ok((board, None)) + } + let mut image_file = image.unwrap(); + let mut buf = Vec::new(); + image_file.read_to_end(&mut buf)?; + let image = decode_png(&buf); + Ok((board, Some(image))) +} + pub fn encode_png(image: &DynamicImage) -> Vec { let mut cursor = Cursor::new(Vec::new()); image.write_to(&mut cursor, image::ImageOutputFormat::Png).unwrap(); diff --git a/src/main.rs b/src/main.rs index e88dbd5..1de7d61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,12 +11,9 @@ use state::Storage; use std::sync::Mutex; -use std::fs::File; -use std::io::Read; - mod board; use board::Board; -use board::{ encode_png, decode_png, write_board_to_file }; +use board::{ encode_png, write_board_to_file, read_board_from_file }; //////////////////// Global State //////////////////// // Don't @ me... @@ -24,7 +21,7 @@ static STATE: Storage> = Storage::new(); //////////////////// Auxilary Dialogs //////////////////// fn add_remove_labels_dialog() { - let mut state = STATE.get().lock().unwrap(); + let state = STATE.get().lock().unwrap(); let mut win = window::Window::default() .with_size(300, 200) .center_of_parent(); @@ -36,24 +33,21 @@ fn add_remove_labels_dialog() { for key in state.board.labels.keys() { label_key_browser.add(key); } - let mut brow = group::Flex::default(); - let mut remove_label_key_btn = button::Button::default().with_label("-"); - let mut add_label_key_btn = button::Button::default().with_label("+"); + let brow = group::Flex::default(); + button::Button::default().with_label("-"); + button::Button::default().with_label("+"); brow.end(); - col.set_size(&mut brow, 30); + col.set_size(&brow, 30); col.end(); let mut label_value_browser = browser::HoldBrowser::default(); label_key_browser.set_callback({ let labels = state.board.labels.clone(); move |k| { label_value_browser.clear(); - match k.selected_text() { - Some(key) => { - for val in &labels[&key] { - label_value_browser.add(&val); - } + if let Some(key) = k.selected_text() { + for val in &labels[&key] { + label_value_browser.add(val); } - None => {} } } }); @@ -88,7 +82,7 @@ fn node_create_dialog(pos_x: f32, pos_y: f32) { let mut win = win.clone(); move |_| { let mut state = STATE.get().lock().unwrap(); - state.board.add_node(pos_x, pos_y, name.value().to_string()); + state.board.add_node(pos_x, pos_y, name.value()); win.hide(); } }); @@ -217,25 +211,21 @@ fn main() { app::redraw(); }); menubar.add("File/Open...", Shortcut::None, menu::MenuFlag::Normal, move |_| { + let mut state = AppState::new(); let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile); fc.show(); - let file = File::open(fc.filename()).unwrap(); - let mut ar = zip::ZipArchive::new(file).unwrap(); - let mut state = AppState::new(); + let (board, raw_image) = read_board_from_file(&fc.filename()).unwrap(); - let json_file = ar.by_name("graph.json").unwrap(); - state.board = serde_json::from_reader(json_file).unwrap(); - if let Ok(mut image_file) = ar.by_name("image.png") { - let mut buf = Vec::new(); - image_file.read_to_end(&mut buf).ok(); - - let image = decode_png(&buf); - state.image = Some(PngImage::from_data(&buf).unwrap()); - state.image_raw = Some(image); - app::redraw(); + state.board = board; + state.image_raw = raw_image; + if let Some(image) = state.image_raw.as_ref() { + state.image = Some(PngImage::from_data(&encode_png(image)).unwrap()); + } else { + state.image = None; } *STATE.get().lock().unwrap() = state; + app::redraw(); }); menubar.add("File/Open Image...", Shortcut::None, menu::MenuFlag::Normal, move |_| { let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile);