Convert to a procedural style (more in keeping with fltk framework)
This commit is contained in:
parent
d544eb478f
commit
e844a5f005
110
src/main.rs
110
src/main.rs
@ -8,15 +8,7 @@ use std::cell::RefCell;
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
struct BoardApp {
|
|
||||||
app: app::App,
|
|
||||||
win: window::Window,
|
|
||||||
image: Rc<RefCell<Option<image::SharedImage>>>,
|
|
||||||
board: Rc<RefCell<Board>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
type Id = usize;
|
type Id = usize;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
struct Node {
|
struct Node {
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
@ -25,13 +17,11 @@ struct Node {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub edges: Vec<Id>,
|
pub edges: Vec<Id>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
struct Board {
|
struct Board {
|
||||||
nodes: HashMap<Id, Node>,
|
nodes: HashMap<Id, Node>,
|
||||||
image: Option<String>,
|
image: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Board {
|
impl Board {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let nodes = HashMap::new();
|
let nodes = HashMap::new();
|
||||||
@ -40,69 +30,49 @@ impl Board {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BoardApp {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
let app = app::App::default();
|
|
||||||
let mut win = window::Window::default()
|
|
||||||
.with_size(400, 300);
|
|
||||||
let mut flex = group::Flex::default()
|
|
||||||
.size_of_parent();
|
|
||||||
flex.set_type(group::FlexType::Column);
|
|
||||||
|
|
||||||
// Board
|
|
||||||
let board = Rc::new(RefCell::new(Board::new()));
|
|
||||||
let menu = Rc::clone(&board);
|
|
||||||
|
|
||||||
// Menu
|
|
||||||
let mut menubar = menu::MenuBar::default();
|
|
||||||
menubar.add("File/New" , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
|
||||||
menubar.add("File/Open..." , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
|
||||||
menubar.add("File/Open Image..." , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
|
||||||
menubar.add("File/Save As ..." , Shortcut::None, menu::MenuFlag::Normal, move |_| { println!("{}", serde_json::to_string(menu.as_ref()).unwrap()); });
|
|
||||||
menubar.add("Edit/Edit Nodes" , 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);
|
|
||||||
|
|
||||||
// Canvas
|
|
||||||
let image = Rc::new(RefCell::new(Option::<image::SharedImage>::None));
|
|
||||||
let bg_image = Rc::clone(&image);
|
|
||||||
let mut frame = frame::Frame::default();
|
|
||||||
frame.draw(move |f| {
|
|
||||||
let mut image = bg_image.borrow_mut();
|
|
||||||
if let Some(image) = image.as_mut() {
|
|
||||||
image.scale(f.w(), f.h(), true, true);
|
|
||||||
image.draw(f.x(), f.y(), f.w(), f.h());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
flex.end();
|
|
||||||
win.end();
|
|
||||||
win.make_resizable(true);
|
|
||||||
|
|
||||||
BoardApp { app, win, image, board }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn show(&mut self) {
|
|
||||||
self.win.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn run(&mut self) {
|
|
||||||
self.app.run().unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load_image(&mut self, path: &str) {
|
|
||||||
self.board.borrow_mut().image = Some(path.to_string());
|
|
||||||
self.image.replace(image::SharedImage::load(path).ok());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn menu_cb(m: &mut impl MenuExt) {
|
fn menu_cb(m: &mut impl MenuExt) {
|
||||||
todo!();
|
todo!();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut app = BoardApp::new();
|
let app = app::App::default();
|
||||||
app.show();
|
let mut win = window::Window::default()
|
||||||
app.load_image("risk.png");
|
.with_size(400, 300);
|
||||||
app.run();
|
let mut flex = group::Flex::default()
|
||||||
|
.size_of_parent();
|
||||||
|
flex.set_type(group::FlexType::Column);
|
||||||
|
|
||||||
|
// Board
|
||||||
|
let board = Rc::new(RefCell::new(Board::new()));
|
||||||
|
let menu = Rc::clone(&board);
|
||||||
|
|
||||||
|
// Menu
|
||||||
|
let mut menubar = menu::MenuBar::default();
|
||||||
|
menubar.add("File/New" , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
||||||
|
menubar.add("File/Open..." , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
||||||
|
menubar.add("File/Open Image..." , Shortcut::None, menu::MenuFlag::Normal, menu_cb);
|
||||||
|
menubar.add("File/Save As ..." , Shortcut::None, menu::MenuFlag::Normal, move |_| { println!("{}", serde_json::to_string(menu.as_ref()).unwrap()); });
|
||||||
|
menubar.add("Edit/Edit Nodes" , 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);
|
||||||
|
|
||||||
|
// Canvas
|
||||||
|
let image = Rc::new(RefCell::new(Option::<image::SharedImage>::None));
|
||||||
|
let bg_image = Rc::clone(&image);
|
||||||
|
let mut frame = frame::Frame::default();
|
||||||
|
frame.draw(move |f| {
|
||||||
|
let mut image = bg_image.borrow_mut();
|
||||||
|
if let Some(image) = image.as_mut() {
|
||||||
|
image.scale(f.w(), f.h(), true, true);
|
||||||
|
image.draw(f.x(), f.y(), f.w(), f.h());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
flex.end();
|
||||||
|
|
||||||
|
win.end();
|
||||||
|
win.make_resizable(true);
|
||||||
|
win.show();
|
||||||
|
|
||||||
|
app.run().unwrap();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user