Further seperate out board functionality *wink*

This commit is contained in:
Dane Johnson 2022-05-04 16:22:15 -05:00
parent 53bd4a9d22
commit 69cf7baa45
2 changed files with 37 additions and 30 deletions

View File

@ -90,7 +90,7 @@ pub fn write_board_to_file(board: &Board, image: Option<&DynamicImage>, path: &P
let options = zip::write::FileOptions::default(); let options = zip::write::FileOptions::default();
ar.start_file("graph.json", options)?; 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 { if let Some(image) = image {
ar.start_file("image.png", options)?; ar.start_file("image.png", options)?;
let data = encode_png(image); let data = encode_png(image);
@ -101,6 +101,23 @@ pub fn write_board_to_file(board: &Board, image: Option<&DynamicImage>, path: &P
Ok(()) Ok(())
} }
pub fn read_board_from_file(path: &Path) -> io::Result<(Board, Option<DynamicImage>)> {
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<u8> { pub fn encode_png(image: &DynamicImage) -> Vec<u8> {
let mut cursor = Cursor::new(Vec::new()); let mut cursor = Cursor::new(Vec::new());
image.write_to(&mut cursor, image::ImageOutputFormat::Png).unwrap(); image.write_to(&mut cursor, image::ImageOutputFormat::Png).unwrap();

View File

@ -11,12 +11,9 @@ use state::Storage;
use std::sync::Mutex; use std::sync::Mutex;
use std::fs::File;
use std::io::Read;
mod board; mod board;
use board::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 //////////////////// //////////////////// Global State ////////////////////
// Don't @ me... // Don't @ me...
@ -24,7 +21,7 @@ static STATE: Storage<Mutex<AppState>> = Storage::new();
//////////////////// Auxilary Dialogs //////////////////// //////////////////// Auxilary Dialogs ////////////////////
fn add_remove_labels_dialog() { fn add_remove_labels_dialog() {
let mut state = STATE.get().lock().unwrap(); let state = STATE.get().lock().unwrap();
let mut win = window::Window::default() let mut win = window::Window::default()
.with_size(300, 200) .with_size(300, 200)
.center_of_parent(); .center_of_parent();
@ -36,24 +33,21 @@ fn add_remove_labels_dialog() {
for key in state.board.labels.keys() { for key in state.board.labels.keys() {
label_key_browser.add(key); label_key_browser.add(key);
} }
let mut brow = group::Flex::default(); let brow = group::Flex::default();
let mut remove_label_key_btn = button::Button::default().with_label("-"); button::Button::default().with_label("-");
let mut add_label_key_btn = button::Button::default().with_label("+"); button::Button::default().with_label("+");
brow.end(); brow.end();
col.set_size(&mut brow, 30); col.set_size(&brow, 30);
col.end(); col.end();
let mut label_value_browser = browser::HoldBrowser::default(); let mut label_value_browser = browser::HoldBrowser::default();
label_key_browser.set_callback({ label_key_browser.set_callback({
let labels = state.board.labels.clone(); let labels = state.board.labels.clone();
move |k| { move |k| {
label_value_browser.clear(); label_value_browser.clear();
match k.selected_text() { if let Some(key) = k.selected_text() {
Some(key) => { for val in &labels[&key] {
for val in &labels[&key] { label_value_browser.add(val);
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(); let mut win = win.clone();
move |_| { move |_| {
let mut state = STATE.get().lock().unwrap(); 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(); win.hide();
} }
}); });
@ -217,25 +211,21 @@ fn main() {
app::redraw(); app::redraw();
}); });
menubar.add("File/Open...", Shortcut::None, menu::MenuFlag::Normal, move |_| { menubar.add("File/Open...", Shortcut::None, menu::MenuFlag::Normal, move |_| {
let mut state = AppState::new();
let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile); let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile);
fc.show(); fc.show();
let file = File::open(fc.filename()).unwrap(); let (board, raw_image) = read_board_from_file(&fc.filename()).unwrap();
let mut ar = zip::ZipArchive::new(file).unwrap();
let mut state = AppState::new();
let json_file = ar.by_name("graph.json").unwrap(); state.board = board;
state.board = serde_json::from_reader(json_file).unwrap(); state.image_raw = raw_image;
if let Ok(mut image_file) = ar.by_name("image.png") { if let Some(image) = state.image_raw.as_ref() {
let mut buf = Vec::new(); state.image = Some(PngImage::from_data(&encode_png(image)).unwrap());
image_file.read_to_end(&mut buf).ok(); } else {
state.image = None;
let image = decode_png(&buf);
state.image = Some(PngImage::from_data(&buf).unwrap());
state.image_raw = Some(image);
app::redraw();
} }
*STATE.get().lock().unwrap() = state; *STATE.get().lock().unwrap() = state;
app::redraw();
}); });
menubar.add("File/Open Image...", Shortcut::None, menu::MenuFlag::Normal, move |_| { menubar.add("File/Open Image...", Shortcut::None, menu::MenuFlag::Normal, move |_| {
let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile); let mut fc = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile);