diff --git a/board-builder-impl-egui/src/main.rs b/board-builder-impl-egui/src/main.rs index 5668c7b..0c7724b 100644 --- a/board-builder-impl-egui/src/main.rs +++ b/board-builder-impl-egui/src/main.rs @@ -5,7 +5,7 @@ use image::DynamicImage; use rfd::FileDialog; -use board_builder::{ Board, CoordTransformer, read_board_from_file, write_board_to_file }; +use board_builder::{ Board, Node, CoordTransformer, read_board_from_file, write_board_to_file }; use std::path::Path; use std::collections::HashSet; @@ -25,6 +25,7 @@ struct BoardBuilderApp { edit_mode: EditMode, selected_node: Option, create_node_dialog: CreateNodeDialog, + edit_node_dialog: EditNodeDialog, edit_labels_dialog: EditLabelsDialog, } @@ -131,6 +132,7 @@ impl eframe::App for BoardBuilderApp { } }); } + self.edit_node_dialog.ui(ctx); self.edit_labels_dialog.ui(ctx); } } @@ -194,7 +196,12 @@ impl BoardBuilderApp { match (btn, self.edit_mode) { (Primary, Nodes) => self.create_node_dialog.show(x, y), (Primary, Edges) => self.select_edge(x, y), - (Secondary, Nodes) => self.delete_node(x, y), + (Secondary, Nodes) => { + let board = Rc::clone(&self.board); + if let Some(id) = self.board.borrow().nearest_node(x, y) { + self.edit_node_dialog.show(id, board); + } + }, _ => {}, } } @@ -247,6 +254,41 @@ impl CreateNodeDialog { } } +#[derive(Default)] +struct EditNodeDialog { + open: bool, + id: usize, + node: Node, + board: Rc>, +} + +impl EditNodeDialog { + fn show(&mut self, id: usize, board: Rc>) { + self.open = true; + self.id = id; + self.board = board; + self.node = self.board.borrow().nodes.get(&self.id).unwrap().clone(); + } + + fn ui(&mut self, ctx: &Context) { + if !self.open { return } + Window::new("Edit Node") + .collapsible(false) + .show(ctx, |ui| { + let mut board = self.board.borrow_mut(); + ui.text_edit_singleline(&mut self.node.name); + if ui.button("Ok").clicked() { + board.nodes.insert(self.id, self.node.clone()); + self.open = false; + } + if ui.button("Cancel").clicked() { + self.open = false + } + }); + } +} + + #[derive(Default)] struct EditLabelsDialog { open: bool, @@ -359,22 +401,3 @@ impl StringDialog { } } } - -// #[derive(Default)] -// struct EditNodeDialog { -// open: bool, -// name: String, -// id: usize, -// labels: HashMap, -// } - -// impl EditNodeDialog { -// fn show(&mut self, id: usize, board: &Board) { -// self.open = true; -// let node = board.nodes.get(&id).unwrap(); - -// self.id = id; -// self.name = node.name.clone(); -// self.labels = node.labels.clone(); -// } -// } diff --git a/board.zip b/board.zip index a15919d..ccb078e 100644 Binary files a/board.zip and b/board.zip differ diff --git a/src/lib.rs b/src/lib.rs index e856c6d..3645c1f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ use serde::{ Serialize, Deserialize }; use std::collections::{ HashMap, HashSet }; -#[derive(Serialize, Deserialize, Debug, Default)] +#[derive(Serialize, Deserialize, Debug, Default, Clone)] #[serde(default)] pub struct Node { pub x: f32,