Edit edges

This commit is contained in:
Dane Johnson 2022-05-10 15:22:48 -05:00
parent 5bb5e09901
commit f699cc61e3
4 changed files with 25 additions and 4 deletions

View File

@ -21,6 +21,7 @@ struct BoardBuilderApp {
image: Option<image::DynamicImage>, image: Option<image::DynamicImage>,
edit_mode: EditMode, edit_mode: EditMode,
create_node_dialog: CreateNodeDialog, create_node_dialog: CreateNodeDialog,
selected_node: Option<usize>,
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -153,13 +154,18 @@ impl BoardBuilderApp {
} }
fn draw_board(&self, painter: &Painter, view: View) { 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( painter.text(
view.from_coords(node.x, node.y), view.from_coords(node.x, node.y),
Align2::CENTER_CENTER, Align2::CENTER_CENTER,
&node.name, &node.name,
FontId::proportional(16.0), FontId::proportional(16.0),
Color32::BLACK, color,
); );
let stroke = Stroke { width: 1.0, color: Color32::BLACK }; let stroke = Stroke { width: 1.0, color: Color32::BLACK };
for edge in &node.edges { for edge in &node.edges {
@ -177,9 +183,20 @@ impl BoardBuilderApp {
use PointerButton::*; use PointerButton::*;
match (btn, self.edit_mode) { match (btn, self.edit_mode) {
(Primary, Nodes) => self.create_node_dialog.show(x, y), (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)] #[derive(Clone, Copy)]

View File

@ -117,8 +117,7 @@ mod dispatch {
if selected == nearest { if selected == nearest {
state.selected_node = None; state.selected_node = None;
} else { } else {
let node = state.board.nodes.get_mut(&selected).unwrap(); state.board.add_edge(selected, nearest);
node.edges.insert(nearest);
} }
app::redraw(); app::redraw();
} }

BIN
board.zip

Binary file not shown.

View File

@ -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<usize> { pub fn nearest_node(&self, x: f32, y: f32) -> Option<usize> {
let f = |n: &Node| dist_sq((n.x, n.y), (x, y)); let f = |n: &Node| dist_sq((n.x, n.y), (x, y));
let mut iter = self.nodes.iter(); let mut iter = self.nodes.iter();