Load board files

This commit is contained in:
Dane Johnson 2022-04-28 13:38:30 -05:00
parent 08b19bf2c6
commit e9138a9d31

View File

@ -3,7 +3,7 @@ use serde::{ Serialize, Deserialize };
use fltk::*; use fltk::*;
use fltk::prelude::*; use fltk::prelude::*;
use fltk::enums::*; use fltk::enums::*;
use fltk::image::{ SharedImage, PngImage }; use fltk::image::PngImage;
extern crate image; extern crate image;
use image::io::Reader as ImageReader; use image::io::Reader as ImageReader;
@ -13,7 +13,7 @@ use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use std::collections::HashMap; use std::collections::HashMap;
use std::io::{ Write, Cursor, BufWriter }; use std::io::{ Write, Read, Cursor };
use std::fs::File; use std::fs::File;
type Id = usize; type Id = usize;
@ -52,7 +52,7 @@ impl AppState {
} }
} }
fn menu_cb(m: &mut impl MenuExt) { fn menu_cb(_m: &mut impl MenuExt) {
todo!(); todo!();
} }
@ -62,6 +62,13 @@ fn encode_png(image: &DynamicImage) -> Vec<u8> {
cursor.into_inner() cursor.into_inner()
} }
fn decode_png(buf: &[u8]) -> DynamicImage {
let cursor = Cursor::new(buf);
let mut reader = ImageReader::new(cursor);
reader.set_format(image::ImageFormat::Png);
reader.decode().unwrap()
}
fn main() { fn main() {
let app = app::App::default() let app = app::App::default()
.with_scheme(app::Scheme::Gtk); .with_scheme(app::Scheme::Gtk);
@ -89,13 +96,20 @@ fn main() {
let file = File::open(fc.filename()).unwrap(); let file = File::open(fc.filename()).unwrap();
let mut ar = zip::ZipArchive::new(file).unwrap(); let mut ar = zip::ZipArchive::new(file).unwrap();
let mut state = AppState::new();
let json_file = ar.by_name("graph.json").unwrap(); let json_file = ar.by_name("graph.json").unwrap();
let mut state = state_clone.borrow_mut();
state.board = serde_json::from_reader(json_file).unwrap(); state.board = serde_json::from_reader(json_file).unwrap();
if let Some(image_file) = ar.by_name("image").ok() { if let Ok(mut image_file) = ar.by_name("image.png") {
todo!(); 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();
} }
app::redraw(); state_clone.replace(state);
}); });
let state_clone = Rc::clone(&state); let state_clone = Rc::clone(&state);
menubar.add("File/Open Image..." , Shortcut::None, menu::MenuFlag::Normal, move |_| { menubar.add("File/Open Image..." , Shortcut::None, menu::MenuFlag::Normal, move |_| {
@ -136,14 +150,14 @@ fn main() {
}); });
menubar.add("Edit/Edit Nodes" , Shortcut::None, menu::MenuFlag::Normal, menu_cb); menubar.add("Edit/Edit Nodes" , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
menubar.add("Edit/Edit Edges" , Shortcut::None, menu::MenuFlag::Normal, menu_cb); menubar.add("Edit/Edit Edges" , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
flex.set_size(&mut menubar, 40); flex.set_size(&menubar, 40);
// Canvas // Canvas
let mut frame = frame::Frame::default(); let mut frame = frame::Frame::default();
let state_clone = Rc::clone(&state); let state_clone = Rc::clone(&state);
frame.draw(move |f| { frame.draw(move |f| {
let mut state = state_clone.borrow_mut(); let mut state = state_clone.borrow_mut();
let mut image = &mut state.image; let image = &mut state.image;
if let Some(image) = image.as_mut() { if let Some(image) = image.as_mut() {
image.scale(f.w(), f.h(), true, true); image.scale(f.w(), f.h(), true, true);
image.draw(f.x(), f.y(), f.w(), f.h()); image.draw(f.x(), f.y(), f.w(), f.h());