Further seperate out board functionality *wink*
This commit is contained in:
parent
53bd4a9d22
commit
69cf7baa45
19
src/board.rs
19
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();
|
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();
|
||||||
|
48
src/main.rs
48
src/main.rs
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user