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();
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<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> {
let mut cursor = Cursor::new(Vec::new());
image.write_to(&mut cursor, image::ImageOutputFormat::Png).unwrap();

View File

@ -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<Mutex<AppState>> = 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);