From 0c0cc7a01d0041094be4bc99222a77ba8ba16c58 Mon Sep 17 00:00:00 2001 From: Dane Johnson Date: Thu, 28 Apr 2022 15:12:32 -0500 Subject: [PATCH] Save and load boards --- src/main.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 40f9d30..ebc46f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,29 +11,36 @@ use image::{ DynamicImage }; use std::cell::RefCell; use std::rc::Rc; -use std::collections::HashMap; use std::io::{ Write, Read, Cursor }; use std::fs::File; -type Id = usize; #[derive(Serialize, Deserialize, Debug)] struct Node { pub x: f32, pub y: f32, pub name: String, - pub edges: Vec, + pub edges: Vec, } #[derive(Serialize, Deserialize, Debug)] struct Board { - nodes: HashMap, + nodes: Vec, } impl Board { pub fn new() -> Self { - let nodes = HashMap::new(); + let nodes = Vec::new(); Board { nodes } } + + pub fn add_node(&mut self, x: f32, y: f32) { + self.nodes.push(Node { + x, + y, + name: "Canada".to_string(), + edges: vec![], + }); + } } struct AppState { @@ -69,6 +76,35 @@ fn decode_png(buf: &[u8]) -> DynamicImage { reader.decode().unwrap() } +fn lerp(v0: f32, v1: f32, t: f32) -> f32 { + v0 + t * (v1 - v0) +} + +fn inv_lerp(v0: f32, v1: f32, a: f32) -> f32 { + (a - v0) / (v1 - v0) +} + +trait CoordTransformer { + fn to_coords(&self, x: i32, y: i32) -> (f32, f32); + fn from_coords(&self, x: f32, y: f32) -> (i32, i32); +} + +impl CoordTransformer for frame::Frame { + fn to_coords(&self, x: i32, y: i32) -> (f32, f32) { + ( + inv_lerp(self.x() as f32, (self.x() + self.w()) as f32, x as f32), + inv_lerp(self.y() as f32, (self.y() + self.h()) as f32, y as f32), + ) + } + + fn from_coords(&self, x: f32, y: f32) -> (i32, i32) { + ( + lerp(self.x() as f32, (self.x() + self.w()) as f32, x) as i32, + lerp(self.y() as f32, (self.y() + self.h()) as f32, y) as i32, + ) + } +} + fn main() { let app = app::App::default() .with_scheme(app::Scheme::Gtk); @@ -156,12 +192,31 @@ fn main() { let mut frame = frame::Frame::default(); let state_clone = Rc::clone(&state); frame.draw(move |f| { + use draw::*; let mut state = state_clone.borrow_mut(); let image = &mut state.image; if let Some(image) = image.as_mut() { - image.scale(f.w(), f.h(), true, true); + image.scale(f.w(), f.h(), false, true); image.draw(f.x(), f.y(), f.w(), f.h()); } + let board = &state.board; + for node in &board.nodes { + let (x, y) = f.from_coords(node.x, node.y); + draw_text(&node.name, x, y); + } + }); + let state_clone = Rc::clone(&state); + frame.handle(move |f, e| { + match e { + Event::Push => { + let mut state = state_clone.borrow_mut(); + let (pos_x, pos_y) = f.to_coords(app::event_x(), app::event_y()); + state.board.add_node(pos_x, pos_y); + app::redraw(); + true + } + _ => false, + } }); flex.end();