Edit edges
This commit is contained in:
parent
5bb5e09901
commit
f699cc61e3
@ -21,6 +21,7 @@ struct BoardBuilderApp {
|
||||
image: Option<image::DynamicImage>,
|
||||
edit_mode: EditMode,
|
||||
create_node_dialog: CreateNodeDialog,
|
||||
selected_node: Option<usize>,
|
||||
}
|
||||
|
||||
#[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)]
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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> {
|
||||
let f = |n: &Node| dist_sq((n.x, n.y), (x, y));
|
||||
let mut iter = self.nodes.iter();
|
||||
|
Loading…
Reference in New Issue
Block a user