Edit edges
This commit is contained in:
parent
5bb5e09901
commit
f699cc61e3
@ -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)]
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user