diff --git a/board-builder-impl-egui/src/main.rs b/board-builder-impl-egui/src/main.rs index 0d0f4d0..fe5c5e8 100644 --- a/board-builder-impl-egui/src/main.rs +++ b/board-builder-impl-egui/src/main.rs @@ -21,6 +21,7 @@ struct BoardBuilderApp { image: Option, edit_mode: EditMode, create_node_dialog: CreateNodeDialog, + selected_node: Option, } #[derive(Clone, Copy)] @@ -153,13 +154,18 @@ impl BoardBuilderApp { } fn draw_board(&self, painter: &Painter, view: View) { - for node in self.board.nodes.values() { + for (&id, node) in &self.board.nodes { + let color = if Some(id) == self.selected_node { + Color32::RED + } else { + Color32::BLACK + }; painter.text( view.from_coords(node.x, node.y), Align2::CENTER_CENTER, &node.name, FontId::proportional(16.0), - Color32::BLACK, + color, ); let stroke = Stroke { width: 1.0, color: Color32::BLACK }; for edge in &node.edges { @@ -177,9 +183,20 @@ impl BoardBuilderApp { use PointerButton::*; match (btn, self.edit_mode) { (Primary, Nodes) => self.create_node_dialog.show(x, y), + (Primary, Edges) => self.select_edge(x, y), _ => {}, } } + + fn select_edge(&mut self, x: f32, y:f32) { + if let Some(nearest_id) = self.board.nearest_node(x, y) { + match self.selected_node { + None => self.selected_node = Some(nearest_id), + Some(id) if id == nearest_id => self.selected_node = None, + Some(id) => self.board.add_edge(id, nearest_id), + } + } + } } #[derive(Clone, Copy)] diff --git a/board-builder-impl-fltk/src/main.rs b/board-builder-impl-fltk/src/main.rs index da641cf..6128c94 100644 --- a/board-builder-impl-fltk/src/main.rs +++ b/board-builder-impl-fltk/src/main.rs @@ -117,8 +117,7 @@ mod dispatch { if selected == nearest { state.selected_node = None; } else { - let node = state.board.nodes.get_mut(&selected).unwrap(); - node.edges.insert(nearest); + state.board.add_edge(selected, nearest); } app::redraw(); } diff --git a/board.zip b/board.zip index fa3c9bf..a79a7bb 100644 Binary files a/board.zip and b/board.zip differ diff --git a/src/lib.rs b/src/lib.rs index 9359387..3c2983a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,6 +43,11 @@ impl Board { } } + pub fn add_edge(&mut self, from: usize, to: usize) { + let node = self.nodes.get_mut(&from).expect("Could not find node"); + node.edges.insert(to); + } + pub fn nearest_node(&self, x: f32, y: f32) -> Option { let f = |n: &Node| dist_sq((n.x, n.y), (x, y)); let mut iter = self.nodes.iter();